Service 与 Ingress 报 502 504 怎么排查
入口层报出的网关错误大多不是入口自己坏了:五零二通常是入口连不上后端或收到非法响应,五零四则是后端处理超时。按入口、服务、后端列表、实例这条链路逐层缩小范围,能很快定位到是网络策略问题、后端端口问题,还是应用处理能力问题。
基本信息
| 五零二含义 | 入口无法连接后端,或后端返回了不符合协议的响应 |
|---|---|
| 五零四含义 | 入口在等待后端响应时超时 |
| 第一现场 | 服务后端列表是否为空,为空说明选择器或就绪检查有问题 |
| 第二步 | 确认实例内端口是否真的在监听,用本地转发直连验证 |
| 第三步 | 核对入口规则与路径重写,配置错误通常表现为找不到页面 |
| 日志位置 | 入口控制器日志会记录上游错误与超时信息 |
典型排查动作
- 先查后端列表:列表为空时问题在选择器或就绪检查,不在网络
- 用本地端口转发直连服务,判断问题在入口层还是应用与网络层
- 确认容器内监听的地址:只监听回环地址时外部永远连不上
- 核对服务端口与目标端口映射,端口写错表现为连接被拒
- 检查网络策略与安全组:入口控制器所在网络与后端之间的放行是否完整
- 分析超时问题:慢查询、锁等待、下游依赖变慢都会表现为网关超时
现象与原因对照
| 现象 | 常见原因 | 验证方式 |
|---|---|---|
| 五零二且后端列表为空 | 选择器不匹配或实例未就绪 | 查看服务后端列表与选择器 |
| 五零二且后端存在 | 端口不通或进程崩溃 | 本地转发直连与查看日志 |
| 五零四 | 后端处理超时 | 看应用耗时与下游依赖 |
| 找不到页面 | 入口规则或路径重写错误 | 核对规则与访问路径 |
| 间歇性错误 | 部分副本异常或就绪检查过松 | 逐副本对比日志与就绪状态 |
链路排查
链路排查
kubectl get endpoints web -n dev # 后端列表是否为空
kubectl port-forward svc/web 8080:80 -n dev # 本地直连绕过入口
curl -si http://127.0.0.1:8080/ | head -5 # 直连结果
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller --tail=50 | grep -i error
# 直连能通而域名报错,问题在入口层;两者都不通,问题在服务或应用直连能通而域名不通指向入口层,两者都不通则问题在服务定义或应用,这个二分法能省掉大量猜测。
超时不要先调大超时时间:慢查询与锁等待没解决,调大只是把故障从快速失败变成长时间占用连接。
端口映射要核对两层:服务端口与目标端口分别对应入口侧与容器侧,写错时现象是连接被拒而不是超时。
间歇性错误优先怀疑个别副本:部分实例异常时,请求命中异常副本就失败,命中正常副本就成功。
预防性检查
- 为入口与后端配置与业务处理时间匹配的超时值
- 为关键服务设置就绪检查,避免未就绪实例接收流量
- 发布前核对入口规则与路径映射,避免上线即报错
- 对慢接口做监控与限流,避免拖垮整个入口层
- 保留入口控制器日志,故障时能快速定位上游问题