如何通过Ingress暴露Kubernetes集群服务到外部及路径404问题排查
问题根因
你遇到的Cannot GET /test 404错误核心原因是:Nginx Ingress默认会将匹配到的完整路径原样转发到后端服务,而你使用的paulbouwer/hello-kubernetes:1.8镜像仅暴露根路径/,没有/test路径对应的路由,所以服务直接返回404。
可能的故障点
- 路径转发规则配置不符合后端服务的路由设计:Ingress配置的
/test路径没有做重写,直接转发给了没有对应路径的后端服务 - 未配置Ingress路径重写注解,无法将
/test前缀剥离后再转发给后端 - 服务端口映射异常(你当前环境已排除,服务、Pod运行状态均正常)
- Ingress控制器规则未同步(你当前环境已排除,不同路径返回不同错误说明规则已生效)
排查方案
- 先验证后端服务本身是否正常:
执行端口转发命令本地测试服务:
访问kubectl port-forward svc/hello-kubernetes-first 8080:80 -n testshttp://localhost:8080确认可以正常返回hello页面,访问http://localhost:8080/test确认返回404,即可定位是路径转发问题 - 查看Ingress Nginx控制器日志确认转发路径:
可以看到请求kubectl logs -n <ingress-nginx所在命名空间> <ingress-nginx控制器Pod名>/test被原样转发到后端服务的/test路径
修复方案
在Ingress的metadata中添加路径重写注解即可,修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-kubernetes-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: test.projectname.org http: paths: - pathType: Prefix path: "/test(/|$)(.*)" backend: service: name: hello-kubernetes-first port: number: 80 - host: test2.projectname.org http: paths: - pathType: Prefix path: "/test2(/|$)(.*)" backend: service: name: hello-kubernetes-first port: number: 80 ingressClassName: nginx
该配置会将/test前缀后的路径剥离后转发给后端服务:
- 访问
http://test.projectname.org/test会转发到后端的/ - 访问
http://test.projectname.org/test/xxx会转发到后端的/xxx
如果不需要保留/test后的子路径,也可以使用更简单的重写注解:
annotations: nginx.ingress.kubernetes.io/rewrite-target: /
你提到的证书错误是因为当前使用的是Let's Encrypt的staging测试环境签发的证书,浏览器默认不信任,功能调试完成后替换为生产环境地址重新签发即可解决。
内容的提问来源于stack exchange,提问作者YakovL
相关产品推荐
相关产品推荐

