GKE Ingress访问报502 Bad Gateway 后端服务UNHEALTHY
GKE Ingress返回502 Bad Gateway、后端UNHEALTHY解决方法
这个问题的本质是GKE Ingress自动创建的外部HTTP(S)负载均衡器,对关联的后端网络端点组(NEG)健康检查全部失败,没有可用的后端端点承接流量,所以直接返回502。
核心原因
从你贴的配置可以确认两个关键信息:
- 内部LoadBalancer访问正常,说明你的服务本身运行、端口监听都没有问题
- Ingress注解里明确显示
sso-dev-service对应的NEG状态为UNHEALTHY,问题出在负载均衡的健康检查环节
GKE容器原生负载均衡(也就是你现在用的NEG模式)默认的健康检查规则是:直接请求Pod服务端口的/路径,要求返回200状态码才算健康。绝大多数服务异常都是因为默认检查规则和服务实际配置不匹配:要么服务根路径/没有对外暴露、要么做了鉴权/重定向返回非200状态码,导致健康检查探测失败。
注意内部TCP负载均衡和外部HTTP(S)负载均衡的转发逻辑完全独立:内部TCP LB只做四层端口联通性校验,不会校验HTTP层响应,所以你能通过内部LB IP正常访问不代表HTTP健康检查能通过。
修复步骤
- 确认你服务里可以直接返回200状态码的GET接口路径,比如常见的
/healthz、/health、/ping,如果没有现成的,临时让根路径/对无鉴权的GET请求返回200也可以。 - 给你的
sso-dev-service添加健康检查相关注解,指定正确的检查参数,示例配置片段如下:
apiVersion: v1 kind: Service metadata: name: sso-dev-service annotations: cloud.google.com/neg: '{"ingress":true}' # 新增以下两个注解,替换成你自己的实际路径和端口 cloud.google.com/health-check-path: /healthz cloud.google.com/health-check-port: "8080" # 其余原有配置保持不变
- 应用修改后的Service配置,等待1-3分钟让GCP负载均衡同步更新健康检查规则,执行
kubectl describe ingress ingress-test查看后端状态,等对应NEG状态变成HEALTHY后,再访问Ingress分配的IP就能正常打开服务。
额外说明
你贴的Deployment状态里显示有1个不可用副本、滚动更新超时,是因为健康检查失败导致副本一直无法判定为就绪,等Ingress侧健康检查恢复后,Deployment的状态也会自动同步正常。
内容的提问来源于stack exchange,提问作者Aman
相关产品推荐
相关产品推荐

