如何修复Kubernetes Ingress多API配置中的404 NotFound问题?
问题分析与修复方案
问题根源
当前Ingress配置中,path: /catalog搭配pathType: Prefix时,Nginx Ingress会将完整请求路径(比如/catalog或/catalog/products)直接转发给后端myapp-catalog-service。如果你的后端服务本身只监听根路径/(而非/catalog),后端找不到对应端点就会返回404。
修复方案
方案1:启用路径重写(推荐)
通过Nginx Ingress的重写注解,将请求路径中的/catalog前缀剥离后转发给后端。修改后的配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-api-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: api.myapp.com http: paths: - pathType: Prefix path: /catalog(/|$)(.*) backend: service: name: myapp-catalog-service port: number: 80 - pathType: Prefix path: /identity(/|$)(.*) backend: service: name: myapp-identity-service port: number: 80
配置说明:
nginx.ingress.kubernetes.io/use-regex: "true":允许路径使用正则表达式匹配path: /catalog(/|$)(.*):用正则捕获路径,/catalog后面的部分(包括空)会被匹配到$2分组rewrite-target: /$2:将转发给后端的路径重写为/$2,比如:- 请求
api.myapp.com/catalog→ 转发到后端的/ - 请求
api.myapp.com/catalog/products/1→ 转发到后端的/products/1
- 请求
方案2:调整后端服务路径(不推荐,除非必须)
如果可以修改后端服务的配置,让它直接监听/catalog路径(比如调整服务的路由前缀为/catalog),那么原Ingress配置无需修改就能正常工作。但这种方式会耦合Ingress路径和服务内部路由,灵活性较低。
验证方法
修改配置后,执行以下命令更新Ingress:
kubectl apply -f your-ingress-file.yaml
然后测试访问api.myapp.com/catalog,确认返回正常响应。
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

