【问题标题】:Can later ingress subpaths override earlier ingress parent paths?以后的入口子路径可以覆盖早期的入口父路径吗?
【发布时间】:2018-10-16 21:09:37
【问题描述】:

我有一个 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

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

当我尝试上述方法时,只要我在default-ing 之前添加special-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

感谢您提供的任何帮助!

【问题讨论】:

    标签: kubernetes nginx-ingress


    【解决方案1】:

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

    因此,如果您在special-ing 之前添加default-ing,那么special-ing 将是实际配置。当您在 default-ing 之前添加 special-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 入口控制器 pod 并查看 nginx.conf 文件来找到更多信息。

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

    【讨论】:

    • 我将检查 nginx.conf 实际上是什么,如果我想要的内容可以很容易地描述,我将把它带到 Github 问题中。
    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2019-04-04
    • 2011-09-04
    相关资源
    最近更新 更多