Ingress Nginx路由优先级异常:请求误匹配最后通配路径
问题解决:Ingress路由匹配异常
问题原因
启用nginx.ingress.kubernetes.io/use-regex: "true"后,Ingress Controller会将所有path解析为正则表达式,同时忽略pathType: Prefix配置。你的/?(.*)正则会匹配所有以/开头的请求(包括/backend),而原/backend正则仅能精确匹配/backend路径(无法匹配带后续路径的请求),且由于正则匹配逻辑,/?(.*)的覆盖范围更广,导致请求被错误路由到web-svc。
解决方案
方案一:关闭正则,利用Prefix最长匹配优先级
移除正则启用注解,将web-svc的路径改为/。Prefix类型下,更长的前缀(/backend)会优先匹配,/则匹配所有其他路径:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-svc spec: ingressClassName: nginx rules: - host: localhost http: paths: - path: /backend backend: service: name: backend-svc port: number: 4000 pathType: Prefix - path: / backend: service: name: web-svc port: number: 8080 pathType: Prefix
方案二:保留正则,调整/backend的正则规则
修改/backend的路径为/backend(/|$)(.*),使其匹配所有以/backend开头的请求(含/backend、/backend/、/backend/xxx),并确保该路径配置在/?(.*)之前(正则匹配按配置顺序执行,先匹配的生效):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-svc annotations: nginx.ingress.kubernetes.io/use-regex: "true" spec: ingressClassName: nginx rules: - host: localhost http: paths: - path: /backend(/|$)(.*) backend: service: name: backend-svc port: number: 4000 pathType: Prefix - path: /?(.*) backend: service: name: web-svc port: number: 8080 pathType: Prefix
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

