Kubernetes Ingress-nginx /api路由子路径访问404故障排查
故障原因
核心配置错误:带正则规则的路径使用了Prefix路径类型。pathType: Prefix是K8s Ingress的原生前缀匹配模式,会按路径字面量分段匹配,不会解析你写的正则捕获组(/|$)(.*),直接导致rewrite-target配置中的$2变量无法获取到/api后的子路径内容,转发到后端服务的路径不符合预期,最终返回404。
修复步骤
将/api对应路由的pathType字段值从Prefix修改为ImplementationSpecific,该类型会把路径匹配逻辑交给Nginx Ingress控制器处理,配合已经开启的nginx.ingress.kubernetes.io/use-regex: "true"注解,正则规则和重写配置才能正常生效。
修正后的完整Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-service annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: example.com http: paths: - path: /api(/|$)(.*) pathType: ImplementationSpecific backend: service: name: server-srv port: number: 3000 - path: / pathType: Prefix backend: service: name: client-srv port: number: 3000
效果说明
配置生效后转发逻辑如下:
- 访问
/api/时,正则第二个捕获组匹配空值,转发到后端服务的路径为/,和你之前正常访问的根路径行为一致 - 访问
/api/hello时,正则第二个捕获组匹配值为hello,转发到后端服务的路径为/hello,可正常响应子路径请求
排查补充
如果修改配置后仍返回404,优先排查两点:
- 确认后端
server-srv服务的3000端口确实存在对应子路径的路由,排除后端服务本身路由缺失的问题 - 查看Nginx Ingress控制器的运行日志,确认实际转发到后端的请求路径是否符合预期
内容的提问来源于stack exchange,提问作者retr0327
相关产品推荐
相关产品推荐

