Kubernetes Ingress精确路径未优先于前缀路径问题及解决
Kubernetes Ingress路径匹配问题:新服务接管根路径,旧服务处理其余路径
问题场景
在Kubernetes集群中,需要实现以下路由规则:
- 根路径
my.domain.com/由新服务处理 - 其他所有路径仍由现有前端服务处理
最初的配置逻辑:
- 现有前端Ingress使用路径
/,pathType设为Prefix - 新服务Ingress配置了根路径的
Exact类型,同时包含/someendpoint路径
但实际测试发现,根路径请求始终被转发到现有前端服务,并未遵循Kubernetes文档中「精确路径优先于前缀路径」的匹配规则。
解决方案
通过调整两处Ingress配置,解决了路径匹配问题:
- 修改现有前端Ingress:启用正则匹配,将路径改为
/(.+),pathType保留Prefix,并添加nginx.ingress.kubernetes.io/use-regex: "true"注解,确保仅匹配非根路径的请求 - 修改新服务Ingress:将根路径的
pathType从Exact改为Prefix,让其优先匹配根路径请求
现有前端修改后配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: current-frontend labels: app: current-frontend tier: frontend annotations: nginx.ingress.kubernetes.io/use-regex: "true" kubernetes.io/ingress.class: nginx spec: tls: - hosts: - my.domain.com secretName: tls-secret rules: - host: my.domain.com http: paths: - backend: service: name: current-frontend port: number: 80 path: /(.+) pathType: Prefix
新服务修改后配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: new-service labels: app: new-service tier: frontend annotations: kubernetes.io/ingress.class: nginx spec: tls: - hosts: - my.domain.com secretName: tls-secret rules: - host: my.domain.com http: paths: - backend: service: name: new-service port: number: 80 path: /someendpoint pathType: ImplementationSpecific - backend: service: name: new-service port: number: 80 path: / pathType: Prefix
内容的提问来源于stack exchange,提问作者IQn
相关产品推荐
相关产品推荐

