Ingress资源冲突疑问:Exact与ImplementationSpecific路径为何互斥?
问题原因与解决方案
核心冲突来自Nginx Ingress Controller的host匹配优先级和路由生成逻辑,具体拆解如下:
- Ingress的host配置差异:Ingress1明确指定了host为你的ELB域名,而Ingress2没有配置host字段——这意味着Ingress2的规则属于「默认host」,只会匹配那些未被其他Ingress明确声明的host请求。
- Nginx server块的生成规则:Nginx Ingress Controller会为每个明确指定的host生成独立的Nginx server块。当你访问ELB域名时,请求会精准匹配到Ingress1对应的server块,但这个块里只有
/argocd-webhook的Exact匹配规则,完全没有/app1的路由配置,自然返回404。 - 删除Ingress1后的变化:当Ingress1被删除,ELB域名不再被任何Ingress明确声明,此时请求会落到Nginx的默认server块——而Ingress2的规则正好在这个默认块里,
ImplementationSpecific类型在Nginx中等价于Prefix匹配,所以/app1路径能正确路由到对应服务,返回200。
验证方式
你可以直接查看Nginx Ingress Controller的配置文件确认这个逻辑:
kubectl exec -it <nginx-ingress-controller-pod-name> -n <ingress-namespace> -- cat /etc/nginx/nginx.conf
同时部署两个Ingress时,你会看到两个server块:一个对应ELB域名,仅包含/argocd-webhook规则;另一个是默认server,包含/app1规则。
解决方法
方法1:为Ingress2添加相同的host配置
让Ingress2也绑定ELB域名,这样Nginx会把两个Ingress的路径规则合并到同一个server块中:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app1 namespace: services spec: ingressClassName: nginx rules: - host: ad27b4b64cf6e4882a21b2500424b4de-65f846a64d3d542c.elb.eu-west-1.amazonaws.com http: paths: - path: /app1 pathType: ImplementationSpecific backend: service: name: app1 port: number: 80
方法2:移除Ingress1的host配置
如果Ingress1不需要绑定这个ELB域名,注释掉它的host字段(就像你注释dryrun.tk那样),这样两个Ingress都属于默认host,规则会合并到同一个server块:
# host: ad27b4b64cf6e4882a21b2500424b4de-65f846a64d3d542c.elb.eu-west-1.amazonaws.com
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

