Ingress域名路由浏览器访问失效,Pod内curl正常问题排查求助
我在GKE环境里碰到过好几次类似的情况——Ingress Controller内部测试完全正常,但外部浏览器访问就返回404。结合你描述的细节,问题大概率出在外部请求的Host头传递或者本地DNS/网络路由上,下面是具体的排查步骤:
1. 先确认本地DNS解析是否正确
你得先确保浏览器访问的foo.com和faa.com确实指向了Ingress Controller的LoadBalancer外部IP(也就是你提到的X.X.X.X)。
- 打开本地终端,执行
nslookup foo.com或者dig foo.com,看返回的IP是不是Ingress的External IP。 - 如果解析不对,直接修改本地hosts文件:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/macOS:
/etc/hosts
添加两行记录:
替换X.X.X.X foo.com X.X.X.X faa.comX.X.X.X为你的Ingress External IP,然后刷新DNS缓存(Windows用ipconfig /flushdns,Linux/macOS用sudo killall -HUP mDNSResponder)再测试。 - Windows:
2. 模拟外部请求,检查Host头是否正确传递
有时候浏览器或者公司网关这类中间代理会偷偷修改Host头,导致Ingress匹配不到规则。你可以在本地用curl模拟外部请求:
curl http://foo.com -v
重点看输出里的Host字段是不是foo.com,同时看返回内容。如果这个curl也返回404,那要么是Host头没传对,要么是Ingress规则有问题。
3. 验证Ingress资源是否真的生效
虽然你有配置截图,但还是建议直接从集群里查看Ingress的实际状态:
- 执行
kubectl describe ingress <你的Ingress名称>,先看Rules部分,确认foo.com和faa.com的路由规则是否正确,后端是不是指向了你暴露的NodePort服务。 - 再看
Events字段,有没有类似"Failed to update ingress"的报错,确保Ingress Controller已经成功加载了你的规则。
4. 查看Ingress Controller日志,追踪请求处理过程
Ingress Controller的日志能帮你看清外部请求的完整处理流程,是定位问题的关键:
kubectl logs -n <Ingress所在命名空间> <nginx-ingress-controller-pod名称>
通常Ingress Controller在ingress-nginx命名空间里,你可以用kubectl get pods -n ingress-nginx找到具体的Pod名称。然后在浏览器里访问一次foo.com,回头看日志里的请求记录——如果日志显示请求匹配到了default backend,那说明要么Host头没被正确识别,要么你的Ingress规则和实际请求不匹配。
5. 确认LoadBalancer端口和防火墙规则
你的Ingress LoadBalancer配置是80:123/TCP,443:456/TCP,要确保外部访问的是80端口(你用的是http访问),而且没有被防火墙拦截:
- 本地执行
telnet foo.com 80,看能不能正常连接。如果连接失败,去GKE控制台检查集群的防火墙规则,确保允许外部IP访问80端口。
内容的提问来源于stack exchange,提问作者kartik




