Nginx Ingress无法配置同主机多Ingress的问题求助
嘿,我之前也碰到过这个NGINX Ingress冲突的问题,这就给你拆解清楚原因和解决方案!
首先,你看到的conflicting server name警告是因为NGINX Ingress Controller会为每个独立的Ingress资源生成单独的server块,而你两个Ingress都用了www.example.de作为host,这在NGINX里是不允许的——同一端口下不能有重复的server_name,所以其中一个会被忽略,导致只有一个Ingress生效。
下面给你两个可行的解决方案:
方案1:合并成单个Ingress(最推荐)
把两个路径规则放到同一个Ingress资源里是最直接的解决办法,这样控制器会生成一个包含所有路径的server块,完全避免冲突。修改后的配置如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: combined-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: "www.example.de" http: paths: - path: "/some" backend: serviceName: some-svc servicePort: 8585 - path: "/" backend: serviceName: other-svc servicePort: 8080
应用这个配置后,NGINX会优先匹配/some开头的请求,剩下的所有请求都会转发到other-svc,正好符合你的需求。
方案2:保留两个Ingress,用order注解控制优先级
如果因为团队分工或者其他原因必须分开维护两个Ingress,可以用nginx.ingress.kubernetes.io/order注解来指定规则的合并顺序——数值越小,优先级越高,控制器会先处理高优先级Ingress的路径,再处理低优先级的。
修改后的两个Ingress配置如下:
some-ingress(高优先级,先匹配/some)
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: some-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/order: "1" # 数值小,优先级更高 spec: rules: - host: "www.example.de" http: paths: - path: "/some" backend: serviceName: some-svc servicePort: 8585
other-ingress(低优先级,处理剩余请求)
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: other-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/order: "2" # 数值大,优先级低 spec: rules: - host: "www.example.de" http: paths: - path: "/" # 明确指定默认路径 backend: serviceName: other-svc servicePort: 8080
添加这个注解后,控制器会把两个Ingress的规则合并到同一个server块里,不会再出现server_name冲突的警告,请求也会按优先级正确转发。
另外补充个小细节:在extensions/v1beta1版本的Ingress API里,路径默认是前缀匹配,所以/some会匹配/some、/some/abc这类路径。如果需要精确匹配/some,可以给这个路径添加nginx.ingress.kubernetes.io/path-type: Exact注解。
最后你可以验证一下:应用配置后,进入Ingress控制器的Pod(用kubectl exec -it <ingress-pod-name> -- /bin/bash),查看/etc/nginx/nginx.conf,确认只有一个www.example.de的server块,包含两个路径规则,然后测试访问www.example.de/some和www.example.de,应该分别转发到对应的服务啦。
内容的提问来源于stack exchange,提问作者brass monkey

