GKE中Pod运行正常但Ingress提示不健康、端口显示异常问题求助
问题根因
- GKE默认的
gce类Ingress对应的外部HTTP(S)负载均衡,默认使用HTTP类型的健康检查,不会自动读取Pod配置的TCP探针规则,对非HTTP服务自然会判定为不健康。 - 你观察到的Ingress识别为80端口的问题,是因为GCE Ingress默认会将健康检查的请求发往NodePort对应的节点端口,且默认使用HTTP 80端口作为后端服务的健康检查端口,不会自动关联Service配置的443端口属性。
可行解决方案
方案1:自定义Ingress健康检查规则(优先推荐)
直接通过Ingress的BackendConfig注解自定义TCP类型的健康检查,不需要额外加Nginx边车,改动最小:
- 先创建BackendConfig资源:
apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: clearspring-tcp-hc spec: healthCheck: type: TCP port: 8080 checkIntervalSec: 10 timeoutSec: 5 healthyThreshold: 1 unhealthyThreshold: 5
- 在你的Service的metadata.annotations中添加关联配置,绑定刚才的BackendConfig:
metadata: name: clearspring-service443 annotations: cloud.google.com/backend-config: '{"default": "clearspring-tcp-hc"}'
- 重新apply Service和Ingress配置,等待1-2分钟负载均衡配置同步即可。
方案2:改用支持TCP代理的负载均衡
如果你的服务全程是TCP协议不需要HTTP层面的路由,直接用GKE的TCP负载均衡更合适,不需要部署Ingress:
将Service类型改为LoadBalancer,添加对应注解即可:
apiVersion: v1 kind: Service metadata: name: clearspring-service443 annotations: networking.gke.io/load-balancer-type: "External" cloud.google.com/load-balancer-type: "External" spec: type: LoadBalancer selector: app: clearspring ports: - name: https protocol: TCP port: 443 targetPort: 8080
如果需要HTTPS证书卸载,可以在创建LoadBalancer类型Service时关联Google-managed SSL证书即可。
方案3:继续使用边车方案的修正方法
如果坚持用Nginx边car的方式,需要注意将健康检查的端口明确配置给Ingress,不要依赖自动识别:
- 给Nginx边车暴露独立的端口比如80,专门用于返回200健康响应
- 在BackendConfig中指定健康检查端口为80,类型为HTTP,路径为
/即可解决之前配置不生效的问题。
内容的提问来源于stack exchange,提问作者Mark McWiggins
相关产品推荐
相关产品推荐

