NGINX Ingress多路径路由同域名后端服务时出现404错误
问题排查与解决方案
针对同域名下多路径路由到不同后端服务出现404的问题,整理以下排查点和可行方案:
1. 修正Ingress正则匹配与重写配置
NGINX Ingress的正则匹配必须通过注解开启,且路径规则、重写目标要严格对应。以下是可直接复用的正确配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-service-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: test.something.io http: paths: - path: /identity(/|$)(.*) pathType: ImplementationSpecific backend: service: name: identity-api port: number: 80 - path: /pets(/|$)(.*) pathType: ImplementationSpecific backend: service: name: pets-api port: number: 80
关键细节:
- 必须添加
use-regex: "true",否则Ingress会将路径视为精确匹配,正则规则直接失效 pathType设为ImplementationSpecific,适配NGINX的正则匹配逻辑- 正则
/identity(/|$)(.*)会覆盖/identity、/identity/、/identity/xxx等所有相关路径,重写后传递给后端的是/$2(即去除前缀后的剩余路径)
2. 调整路径匹配顺序
NGINX Ingress的路径匹配是从上到下优先匹配,如果宽泛路径(比如/(.*))排在具体路径前面,会直接覆盖后续规则。例如错误配置:
paths: - path: /(.*) # 该规则会匹配所有请求,导致后续/pets路径永远不会生效 backend: service: name: identity-api port: 80 - path: /pets(/|$)(.*) backend: service: name: pets-api port: 80
正确做法是将/identity、/pets这类具体路径放在最前面,根路径(如果需要)放在最后。
3. 验证重写规则与后端路径期望匹配
部分后端服务要求接收的路径不带前缀,比如请求test.something.io/pets/list需转发为后端的/list,此时rewrite-target: /$2是正确的。如果后端期望保留前缀,则需调整为rewrite-target: /pets/$2,具体根据后端服务的路由规则调整。
4. 检查Ingress Controller的实际生成配置
可以直接查看Ingress Controller生成的NGINX配置,确认路由规则是否正确生效:
# 替换为你的Ingress Controller Pod名称和命名空间 kubectl exec -it <nginx-ingress-controller-pod> -n <namespace> -- cat /etc/nginx/nginx.conf | grep -A 15 -B 5 "test.something.io"
查看对应的location块是否正确匹配路径,并转发到对应的后端Service。
内容的提问来源于stack exchange,提问作者Punit kumar
相关产品推荐
相关产品推荐

