You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ingress暴露Kubernetes集群服务到外部及路径404问题排查

问题根因

你遇到的Cannot GET /test 404错误核心原因是:Nginx Ingress默认会将匹配到的完整路径原样转发到后端服务,而你使用的paulbouwer/hello-kubernetes:1.8镜像仅暴露根路径/,没有/test路径对应的路由,所以服务直接返回404。

可能的故障点

  • 路径转发规则配置不符合后端服务的路由设计:Ingress配置的/test路径没有做重写,直接转发给了没有对应路径的后端服务
  • 未配置Ingress路径重写注解,无法将/test前缀剥离后再转发给后端
  • 服务端口映射异常(你当前环境已排除,服务、Pod运行状态均正常)
  • Ingress控制器规则未同步(你当前环境已排除,不同路径返回不同错误说明规则已生效)

排查方案

  1. 先验证后端服务本身是否正常:
    执行端口转发命令本地测试服务:
    kubectl port-forward svc/hello-kubernetes-first 8080:80 -n tests
    
    访问http://localhost:8080确认可以正常返回hello页面,访问http://localhost:8080/test确认返回404,即可定位是路径转发问题
  2. 查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:24:03