You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ingress域名路由浏览器访问失效,Pod内curl正常问题排查求助

排查GKE Nginx Ingress浏览器访问404问题

我在GKE环境里碰到过好几次类似的情况——Ingress Controller内部测试完全正常,但外部浏览器访问就返回404。结合你描述的细节,问题大概率出在外部请求的Host头传递或者本地DNS/网络路由上,下面是具体的排查步骤:

1. 先确认本地DNS解析是否正确

你得先确保浏览器访问的foo.comfaa.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.com
    
    替换X.X.X.X为你的Ingress External IP,然后刷新DNS缓存(Windows用ipconfig /flushdns,Linux/macOS用sudo killall -HUP mDNSResponder)再测试。

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.comfaa.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

火山引擎 最新活动