如何为GKE L7区域内部负载均衡网关配置HTTPS?
问题定位与修复方案
核心问题分析
从你的配置和现象来看,ILB后端服务异常的根源是健康检查配置不匹配,同时HTTPRoute的路由规则未明确覆盖HTTPS流量转发逻辑,以下是具体问题和修复步骤:
1. 健康检查策略与Pod实际服务不匹配
你的HealthCheckPolicy配置为HTTPS类型,但实际Pod仅提供HTTP服务(HTTP可正常访问),HTTPS健康检查会直接失败,导致ILB标记后端为异常。
修复方法:将健康检查改为HTTP类型:
apiVersion: networking.gke.io/v1 kind: HealthCheckPolicy metadata: name: ${var.service_name}-healthcheck-http namespace: ${kubernetes_namespace_v1.this.metadata[0].name} spec: default: checkIntervalSec: 10 timeoutSec: 5 healthyThreshold: 3 unhealthyThreshold: 3 logConfig: enabled: true config: type: HTTP httpHealthCheck: port: ${var.service_target_port} requestPath: / targetRef: group: "" kind: Service name: ${var.service_name}
2. HTTPRoute未明确绑定HTTPS监听器
当前HTTPRoute仅默认关联Gateway的HTTP监听器,HTTPS流量无法匹配到路由规则,需明确绑定两个监听器:
修改HTTPRoute配置:
kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: ${var.service_name}-httproute namespace: ${kubernetes_namespace_v1.this.metadata[0].name} labels: gateway: ${kubernetes_manifest.gateway.object.metadata.name} spec: parentRefs: - kind: Gateway name: ${kubernetes_manifest.gateway.object.metadata.name} sectionName: http-listener # 绑定HTTP监听器 - kind: Gateway name: ${kubernetes_manifest.gateway.object.metadata.name} sectionName: https-listener # 绑定HTTPS监听器 hostnames: - "${var.service_name}.myapp.com" rules: - backendRefs: - name: ${kubernetes_service.this.metadata[0].name} port: ${var.service_port} # Gateway已终止TLS,后端走HTTP端口即可
3. 移除冗余的Service HTTPS端口
你的Service中配置的443端口属于冗余项——Gateway已在前端完成TLS终止,后端仅需通过HTTP端口转发流量,该端口会导致路由混淆,建议删除:
简化Service配置:
resource "kubernetes_service" "this" { metadata { name = var.service_name namespace = kubernetes_namespace_v1.this.metadata[0].name } spec { type = "NodePort" selector = { app = var.service_name } port { name = "port-http" protocol = "TCP" port = var.service_port target_port = var.service_target_port app_protocol = "HTTP" } } provider = kubernetes.gke }
4. 额外验证点
- 确认自签名证书Secret格式正确:必须包含
tls.crt(证书内容)和tls.key(私钥内容),且与Gateway处于同一Namespace。 - 检查VPC防火墙规则:确保ILB后端服务的IP段(可从GCP控制台ILB详情获取)能访问Pod的8501端口,当前
0.0.0.0/0规则已覆盖,可按需缩小范围。 - 验证私有DNS解析:在VPN客户端执行
nslookup ${var.service_name}.myapp.com,确认能正确解析到指定静态IP。
内容的提问来源于stack exchange,提问作者Francisco Navarro
相关产品推荐
相关产品推荐

