以后的入口子路径可以覆盖以前的入口父路径吗?

时间:2018-10-16 21:09:37

标签: kubernetes nginx-ingress

我有一个Kubernetes入口,如果没有更具体的匹配,我想成为一组主机上所有路径的默认入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: default-ing
spec:
  rules:
  - host: host1.sub.example.com
    http:
      paths:
      - backend:
          serviceName: my-default-service
          servicePort: http
        # Note: here we specify the root path intended as a default
        path: /
      - backend:
          serviceName: my-default-service
          servicePort: http
        path: /route/path/to/default

第二个入口为特定路径定义了自定义服务:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: special-ing
spec:
  rules:
  - host: host1.sub.example.com
    http:
      paths:
      - backend:
          serviceName: special-service
          servicePort: http
        path: /special

我希望添加/删除入口的顺序无关紧要,或者至少我可以通过某种方式表明path: /中的default-ing始终排在最后。 / p>

当我尝试上述操作时,只要在special-ing之前添加default-ing(或者先添加default-ing,然后再添加special-ing,然后删除,路由就可以了default-ing并再次重新添加)。当我将它们添加为default-ing,然后添加为special-ing时,对/special are的请求被路由到my-default-service而不是special-service

我希望添加/删除的顺序与nginx-ingress-controller生成的路由无关,以便我的kubectl操作更可靠,并且如果重新创建入口之一,则不会中断。

我正在使用nginx-ingress-controller:0.19.0

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

简短的回答是“否”。我相信您的配置应该被nginx入口控制器禁止或记录在某处。基本上,当您有两个具有相同值的hosts规则时,会发生什么:host1.sub.example.com,一个覆盖着您的Nginx入口控制器正在管理的nginx.conf的{​​{3}}块中的另一个

因此,如果您在default-ing之前添加special-ing,则special-ing将是实际配置。当您在special-ing之前添加default-ing时,default-ing将是您唯一的配置,special-ing根本不起作用。

  1. 添加special-ing,配置看起来像这样:

     server {
         server_name host1.sub.example.com;
         ...
         location /special {
                            ...
         }
         location / { # default backend
                     ...
         }
         ...            
    }
    
  2. 现在添加default-ing,配置将更改为:

    server {
         server_name host1.sub.example.com;
         ...
         location /route/path/to/default {
                                         ...
         }
         location / { # default backend
                     ...
         }
         ...
    }
    

如果您添加它们,则配置的另一种方式最终看起来像1.。

您可以通过将它们封装到nginx入口控制器容器中并查看nginx.conf文件来找到更多内容。

 $ kubectl -n <namespace> exec -it nginx-ingress-controller-pod sh
 # cat /etc/nginx/nginx.conf