GKE环境下Ingress资源关联服务后访问返回404如何解决?
故障根因
你遇到的404错误确实和host: "*.example.com"的配置直接相关,核心原因如下:
- Nginx Ingress是基于请求头的
Host字段做路由匹配的,你配置了*.example.com的主机规则后,只有请求头中Host符合该通配规则(比如a.example.com、test.example.com)的流量才会转发到你的Node应用。 - 如果你直接通过GCP区域IP访问服务,请求的
Host字段会默认填充为IP地址,无法匹配你配置的主机规则,流量会被转发到集群默认的default-http-backend,该组件默认对所有未匹配规则的请求返回404。
验证方法
执行以下命令确认故障点:
# 替换<GCP Regional IP>为你的实际IP,手动指定Host头请求 curl -H "Host: test.example.com" http://<GCP Regional IP>
如果该请求返回正常的Hello World响应,即可确认是Host匹配规则导致的问题。
解决方案
根据你的使用场景二选一即可:
方案1:允许任意Host访问(适合测试场景)
直接删除Ingress配置中的host: "*.example.com"字段,修改后规则如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-resource annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/ssl-redirect: "false" spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: node-app-blue-helm-chart port: number: 80
修改后所有请求不管Host头是什么都会转发到你的Node应用,直接用IP访问即可正常返回结果。
方案2:保留域名匹配规则(适合正式使用场景)
在本地hosts文件中添加如下记录(Windows系统路径为C:\Windows\System32\drivers\etc\hosts,Linux/Mac路径为/etc/hosts):
<GCP Regional IP> test.example.com
保存后直接访问http://test.example.com即可正常访问服务。如果是对外提供服务,将你的域名DNS解析的通配记录指向该GCP IP即可。
其他可选检查项
如果上述操作后仍有问题,可以按以下步骤排查:
- 确认Node应用Pod运行正常:
kubectl get pods -l app.kubernetes.io/instance=node-app-blue
- 集群内部访问服务验证可用性:
kubectl run -it --rm --image=curlimages/curl curl -- curl http://node-app-blue-helm-chart.default.svc
如果内部访问正常,说明问题仍出在Ingress配置层,检查是否有其他Ingress规则冲突即可。
内容的提问来源于stack exchange,提问作者bcan
相关产品推荐
相关产品推荐

