GCP GKE Ingress无法访问后端服务,健康检查、防火墙等配置均正常
核心问题解答
端口配置疑问
你当前的端口配置逻辑是正确的:
- GCE Ingress对接NodePort类型服务时,负载均衡后端默认指向你配置的NodePort 32001,这是符合设计的
- BackendConfig健康检查配置中填写服务端口80即可,GKE会自动完成映射:负载均衡的健康检查请求先打到节点的32001端口,再由kube-proxy转发到Pod的80端口,不需要手动将健康检查端口改为NodePort
- 中间的流量转发由GKE内置的kube-proxy组件实现,无需额外配置代理
因果关系说明
是健康检查失败导致负载均衡将后端标记为不可用,进而返回502错误,而非反过来。
问题根因&排查修复步骤
按优先级排序逐一验证:
修复YAML配置语法错误
你贴出的配置文件中,BackendConfig资源前后的---分隔符存在缩进错误,YAML对缩进高度敏感,该错误会导致BackendConfig无法被正确识别,健康检查配置无法关联到服务。修正分隔符缩进后执行kubectl get backendconfig,确认资源正常创建无报错。验证健康检查接口可用性
你之前仅验证了根路径的可用性,需确认/health接口返回正常:
kubectl exec adcloud-api-5cb96bb47d-tmrd8 -- curl -I http://localhost/health
确保返回状态码为200 OK,如果返回404等错误,要么修正应用的健康检查路径,要么修改BackendConfig的requestPath为应用实际存在的健康检查路径。
- 修正防火墙规则配置
多数该类问题都是防火墙配置不规范导致的:
- 确认你创建的防火墙规则源IP范围为GCP官方健康检查网段:
130.211.0.0/22和35.191.0.0/16 - 端口范围需覆盖所有NodePort端口:
30000-32767,协议为TCP - 目标标签必须匹配GKE节点的实际标签(可在GCE实例详情页查看节点标签,通常格式为
gke-<集群名>-<节点池名>-<随机后缀>),规则优先级需低于1000(数值越小优先级越高)
- 清理残留负载均衡资源
你看到的不健康后端、实例组显示资源不存在的问题,是因为集群节点重建/扩缩容后,旧的负载均衡后端资源没有被自动清理导致的残留垃圾:
- 执行
kubectl delete ingress api-ingress删除现有Ingress - 等待10分钟让GCP完全清理关联的负载均衡、后端服务、实例组资源
- 重新执行
kubectl apply -f deployment.yaml创建所有资源,等待5-10分钟后查看负载均衡状态,残留的不健康后端会自动消失
- 手动验证节点端口连通性
如果以上步骤都完成后仍然异常,可直接验证节点端口的公网连通性:
找到任意一台GKE节点的公网IP,执行curl http://<节点公网IP>:32001/health,如果不通说明防火墙规则仍然配置错误,如果通则说明健康检查配置仍有问题,可进一步查看GCP负载均衡的健康检查日志定位异常。
内容的提问来源于stack exchange,提问作者Ryan Weiss
相关产品推荐
相关产品推荐

