GKE集群Ingress仅显示80端口且HTTPS访问返回502错误如何解决?
问题原因分析
1. Ingress仅显示80端口的原因
使用kubectl get ingress仅显示80端口是正常现象:
GKE的gce类Ingress在仅通过annotation指定托管证书时,未在Ingress spec中显式声明tls字段的情况下,kubectl的输出不会展示443端口,但只要托管证书生效后GCP侧的全球负载均衡实际已经开放了443端口监听,可直接到GCP控制台「网络服务>负载均衡」页面查看对应LB的实际配置验证。
2. HTTPS访问返回502的原因
核心原因是Service端口命名触发了GCE Ingress的协议自动识别逻辑:
你将Service的端口命名为https,GCE Ingress控制器会默认认为后端服务是HTTPS协议,会用HTTPS协议发起健康检查请求到你容器的8080端口。但从Deployment配置中容器的8080端口实际是HTTP服务,健康检查全部失败,负载均衡无可用后端,因此返回502错误。
解决方案
502错误修复
修改Service的端口命名,将https改为http,同步修改Ingress对应配置即可:
修改后的Service配置:
apiVersion: v1 kind: Service metadata: name: my-service443 spec: type: NodePort selector: app: myapp ports: - name: http protocol: TCP port: 443 targetPort: 8080
修改后的Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.global-static-ip-name: "kubething" networking.gke.io/managed-certificates: clearspring-cert kubernetes.io/ingress.class: "gce" spec: defaultBackend: service: name: my-service443 port: name: http
配置更新后等待5-10分钟,GCE负载均衡会自动更新健康检查规则,健康检查通过后即可正常访问。
让Ingress显示443端口
如果需要kubectl get ingress输出中显示443端口,只需要在Ingress的spec中添加tls字段即可:
spec: tls: - hosts: - 你绑定的实际域名 defaultBackend: service: name: my-service443 port: name: http
额外排查项
- 执行
kubectl get managedcertificate确认托管证书状态为ACTIVE,证书签发需要10-20分钟,未生效前HTTPS访问会异常。 - 确认容器端口监听正常,可在集群内通过
curl <PodIP>:8080验证服务可用性。
内容的提问来源于stack exchange,提问作者Mark McWiggins
相关产品推荐
相关产品推荐

