问题出现得很突然,日志倒是留得挺全。K8s 1.25 配了 nginx-ingress 4.8,域名解析到入口后所有路径都返回 default backend – 404,kubectl get ingress 显示 host 和 path 都写对了。

刚开始盯着「pathType 用了 Exact,访问子路径自然匹配不到」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。Ingress 的 ingressClassName 没写,控制器把这份配置当成别人的没接管。少数情况下是host 里带了端口或通配符写法不合法,规则被控制器丢弃。

还有一种情况,同一个 host 在多个 Ingress 里重复声明,后创建的把规则覆盖了。

第一件事是看控制器有没有认领这份 Ingress

kubectl describe ingress web | grep -i 'class\|Events'

接着确认规则真的进了 nginx 配置

kubectl -n ingress-nginx exec deploy/ingress-nginx-controller -- grep -r 'server_name' /etc/nginx/conf.d | head

然后把 pathType 改成 Prefix 并补上 class

kubectl patch ingress web --type=json -p '[{"op":"add","path":"/spec/ingressClassName","value":"nginx"}]'

剩下的就是用指定 Host 头验证后端

curl -s -o /dev/null -w '%{http_code}' -H 'Host: www.example.com' http://10.0.0.9/

别只看报错消失,验证要多做一步。curl 用真实 Host 头访问返回 200,控制器日志里出现对应的 upstream 地址,404 页面不再出现。

容易忽略的是,default backend 的 404 说明规则压根没匹配上,别去查 Service;class 与 host 是最容易漏的两处,多个 Ingress 抢同一个 host 会互相覆盖。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189