502/504 是网关类错误,不是浏览器或应用直接返回。先确认返回者(云负载均衡、Ingress、Nginx、应用网关),再看上游是否监听、是否有健康端点、超时是否合理。502 更像“上游连接或响应坏了”,504 更像“上游太慢或网关等不及”。本页是分诊入口,单场景处置见 502-bad-gateway 和 504-gateway-timeout。
边界:不覆盖应用内部的性能分析;如果是 499、413、431 或 WebSocket 断开,先看 HTTP 状态码速查 和 Nginx 速查。
curl -sv -o /dev/null -w '%{http_code} %{time_total}\n' https://example.com/health
curl -sv http://<upstream>:<port>/health
ss -lntp | grep <port>
dig +short <service>.<namespace>.svc.cluster.local
nginx -T | grep -E 'proxy_(pass|connect_timeout|read_timeout|send_timeout)'
Kubernetes 里同时看路由、后端和事件:
kubectl get ingress,pods,svc,endpoints -n <namespace>
kubectl describe ingress <name> -n <namespace>
kubectl logs deploy/<app> -n <namespace> --tail=100
kubectl get events -n <namespace> --sort-by=.lastTimestamp | tail
| 现象 | 优先检查 | 入口 |
|---|---|---|
502 + connection refused |
上游没监听、端口错、Pod 未就绪 | connection-refused |
| 502 + 连接被重置 | 应用崩溃、keepalive、TLS 握手 | k8s-ingress-502 |
| 504 | 上游慢、超时太短、连接池满、DNS 慢 | 504-gateway-timeout |
| 偶发 502 | 单个副本异常、滚动发布、节点问题 | kubectl get pods -o wide、Service |
| 云负载均衡 502 | 健康检查、后端 TLS、idle timeout | cloud-lb-502 |
| 证书/握手错误 | 证书过期、证书链不全、SNI/mTLS | TLS 速查 |
| DNS 解析失败 | CoreDNS、ndots、search 域 | DNS 解析失败、ndots |
| 413/431 | 请求体或请求头过大 | Nginx 的 client_max_body_size |
| 499 | 客户端主动断开,不是网关错误 | Nginx access log、客户端超时 |
ss -lntp 和 curl 直连,不要只看网关日志。proxy_read_timeout 太短、proxy_buffer_size 不足、请求体限制、keepalive 与后端不匹配。kubectl get endpoints 为空:先查 Service selector 与 Pod readiness,再查端口名是否与 targetPort 匹配。targetPort 与容器实际监听端口不一致时,Service 看起来正常,但请求全部失败;用 kubectl exec 在 Pod 内 curl localhost:<port> 验证。proxy_read_timeout 与云 LB 的 idle timeout 要匹配;任何一个更短,长请求都会被提前切断。curl -v 和 openssl s_client -showcerts 看完整链。client_max_body_size 太小会返回 413,不是 502;先看状态码,再查对应配置。合上页面,先回答,再展开对照。
kubectl get endpoints 为空,常见原因有哪些?
小程序版
微信扫码,随时查命令