K8s集群Nginx Ingress访问NestJS服务遇504网关超时求助
排查方向
验证Service与Pod的匹配性
- 执行
kubectl describe service <你的服务名>,检查Selector字段是否和Pod的labels完全匹配;同时确认TargetPort是否为Pod暴露的3000端口,Port是否和Ingress配置的后端端口一致。 - 执行
kubectl get pods --show-labels,对比Pod的labels和Service的selector,确保没有拼写错误。
- 执行
测试集群内Service到Pod的连通性
- 部署临时测试Pod:
kubectl run -it --rm busybox --image=busybox:1.28 -- /bin/sh - 在测试Pod内执行
ping 10.244.0.228确认网络可达,再执行curl 10.244.0.228:3000/api/health看是否能正常响应。如果这一步失败,说明Pod自身网络或服务监听存在问题。
- 部署临时测试Pod:
检查NestJS服务的监听地址
- 进入Pod执行
kubectl exec <你的Pod名> -- netstat -tulpn,确认服务监听的是0.0.0.0:3000而非127.0.0.1:3000。如果只监听本地回环,集群内其他组件无法访问服务,但端口转发能正常工作。
- 进入Pod执行
验证Ingress控制器到Pod的连通性
- 找到Ingress控制器的Pod:
kubectl get pods -n <ingress控制器所在命名空间,通常为kube-system> - 进入控制器Pod执行
curl 10.244.0.228:3000/api/health,如果超时,说明集群网络插件(如Flannel/Calico)存在通信问题,或Node层面有防火墙限制。
- 找到Ingress控制器的Pod:
检查Ingress规则配置
- 执行
kubectl describe ingress <你的Ingress名>,确认Backend指向的Service和端口正确;检查Path规则是否匹配/api/health,PathType是否合理(比如用Prefix而非Exact,避免路径匹配失败)。
- 执行
查看DigitalOcean负载均衡状态
- 登录DO控制台,检查负载均衡的后端节点健康状态,确认Ingress控制器所在Node的健康检查通过。如果健康检查失败,负载均衡会停止转发流量到对应节点,导致504。
排查NetworkPolicy限制
- 执行
kubectl get networkpolicies,查看是否存在限制Ingress控制器或Service访问Pod的网络策略。如果有,确认策略规则是否允许Ingress控制器的IP段或命名空间访问Pod。
- 执行
内容的提问来源于stack exchange,提问作者Goowik
相关产品推荐
相关产品推荐

