我不会起名字322· 后端 / 算法 / 数据库 技术栈 力扣 Hot100 Go 项目 Redis MySQL文章目录Ingress 404 与 503 分别意味着什么3 层转发里的失败点一、先把转发链路画出来二、404规则没匹配上原因 1host 不匹配原因 2path 匹配规则和你想的不一样原因 3IngressClass 不匹配原因 4多个 Ingress 冲突 / 规则没被加载三、503没有可用的后端第一步永远是看 Endpoint原因 1selector 和 Pod 标签对不上原因 2Pod 没有 Ready原因 3端口对不上原因 4全部后端被摘除滚动发布期间四、502连上了但连接失败五、一个完整的排查流程六、带走物Ingress 404 与 503 分别意味着什么3 层转发里的失败点一、先把转发链路画出来Ingress 不是一个组件它至少跨三层外部流量 ↓ ① Ingress ControllerNginx / Traefik / ALB ↓ 按 host path 匹配 Ingress 规则 ② ServiceClusterIP ↓ 按 selector 找 Endpoint ③ Pod404 和 503 分别对应这条链路上不同的失败位置这是排查的第一分水岭。状态码失败位置含义404① Ingress 层规则根本没匹配上流量没离开 Controller503② Service 层规则匹配上了但后端没有可用 Endpoint502③ Pod 层连上了 Pod 但连接失败/被提前关闭记住这个映射排查时能省一半时间。二、404规则没匹配上404 说明 Ingress Controller收到了请求但找不到要转发给谁。它压根没往后走。原因 1host 不匹配spec:rules:-host:api.example.com# 只认这个 hosthttp:paths:-path:/pathType:Prefixbackend:service:name:api-svcport:{number:8080}如果你用curl http://IP/直接打 IP不带 Host 头host 是空的不匹配任何规则 →404。验证# 不带 Host → 404curl-ihttp://ingress-ip/# 带 Host → 正常curl-i-HHost: api.example.comhttp://ingress-ip/原因 2path 匹配规则和你想的不一样pathType有三个取值行为差别很大pathType行为Exact完全相等才匹配Prefix按路径前缀匹配逐段不是字符串前缀ImplementationSpecific取决于 Controller 实现Nginx 下是正则Prefix是按/分段匹配的不是字符串前缀path: /api Prefix ✅ /api 匹配 ✅ /api/v1 匹配 ❌ /apiary 不匹配不是完整的一段这一点经常导致路径看着像前缀但就是 404。原因 3IngressClass 不匹配集群里有多个 Ingress Controller 时必须指定 classmetadata:annotations:kubernetes.io/ingress.class:nginx# 旧写法spec:ingressClassName:nginx# 新写法推荐没写或者写错了这个 Ingress 会被 Controller 忽略表现就是 404。kubectl get ingressclass kubectl get ingressname-oyaml|grep-iclass原因 4多个 Ingress 冲突 / 规则没被加载# 看 Ingress 有没有被 Controller 认领看 ADDRESS 字段有没有值kubectl get ingress-A# 看 Controller 日志里的 reloadkubectl logs-ningress-nginx deploy/ingress-nginx-controller|grep-ireload\|error三、503没有可用的后端503 说明规则匹配上了但Controller 找不到可用的 Pod 来转发。第一步永远是看 Endpointkubectl get endpointsservice-name-nns# 或者kubectl get endpointslices-nnsNAME ENDPOINTS api-svc none ← 空的就是问题所在ENDPOINTS为空 Service 没有选中任何健康 Pod 503。原因 1selector 和 Pod 标签对不上# Service 选什么kubectl get svc api-svc-ojsonpath{.spec.selector}# Pod 实际有什么标签kubectl get pod-lappapi --show-labels最常见的就是app: api和app: api-server这种一字之差。原因 2Pod 没有 ReadyEndpoint 只收Ready的 Pod。Pod Running 但 NotReady 不会被加入。kubectl get pod-lappapi# NAME READY STATUS RESTARTS# api-0 0/1 Running 0 ← Running 但 0/1NotReady原因通常是readinessProbe 失败kubectl describe pod api-0|grep-A5Readiness# Readiness probe failed: HTTP probe failed with statuscode: 500注意readiness 失败不会重启 Pod只会把它从 Service 摘掉。所以现象是Pod 看着在跑但访问 503。原因 3端口对不上# Servicespec:ports:-port:80targetPort:8080# 要和应用实际监听的端口一致targetPort写错时Endpoint 会有 IP 但端口不通。这种情况通常表现为 502 或连接超时但部分 Controller 也会报 503。# 确认 Pod 实际监听的端口kubectlexecpod-- ss-lntp原因 4全部后端被摘除滚动发布期间滚动更新时旧 Pod 被终止、新 Pod 还没 Ready会出现短暂的 503。解法是配置优雅停机 preStop让旧 Pod 在退出前先等一会儿等 endpoint 同步完成lifecycle:preStop:exec:command:[sh,-c,sleep 10]# 给 endpoint 摘除留出时间terminationGracePeriodSeconds:40关于这个时间差的完整机制在滚动更新那篇里详细讲过。四、502连上了但连接失败502 说明 Controller 找到了 Pod 并尝试连接但连接层面失败Pod 内的进程没监听那个端口应用启动时就把连接关了keepalive 连接被复用但已被关闭。排查重点是从 Controller 到 Pod 这一段# 直接打 Pod IP绕过 Service确认应用本身是否正常kubectl get pod-owide# 拿到 Pod IPkubectl run-it--rmcurl--imagecurlimages/curl--restartNever --\curl-ihttp://pod-ip:8080/healthzPod IP 直接访问正常 → 问题在 Service/Endpoint 层Pod IP 也不通 → 问题在应用本身端口、启动、崩溃。五、一个完整的排查流程# 1. 看状态码判断失败位置# 404 → Controller 层503 → Service/Endpoint 层502 → Pod 连接层# 2. 404查规则kubectl get ingressname-oyaml# host / path / pathType / ingressClassNamecurl-i-HHost: hosthttp://ip/# 带 Host 再试一次kubectl logs-ningress-nginx deploy/ingress-nginx-controller--tail50# 3. 503查 Endpointkubectl get endpointssvckubectl get svcsvc-ojsonpath{.spec.selector}kubectl get pod-lselector--show-labels kubectl describe podpod|grep-A5Readiness# 4. 502绕过 Service 直连 Podcurlhttp://pod-ip:port/healthz kubectlexecpod-- ss-lntp六、带走物状态码一句话定位第一个要看的命令404Ingress 规则没匹配上host / path / classkubectl get ingress -o yaml503规则匹配了但 Service 没有可用 Endpointkubectl get endpoints502找到 Pod 但连接失败直连 Pod IP 验证504Pod 连上了但响应超时查应用耗时一句话结论404 是不知道往哪转503 是知道往哪转但没人接502 是有人但连不上——状态码已经告诉你失败在第几层了顺着那一层查就行。