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

Can later ingress subpaths override earlier ingress parent paths?

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

我希望 adding/deleting 入口的顺序无关紧要,或者至少我可以通过某种方式表明 default-ing 中的 path: / 始终是最后订购。

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

我希望 adding/deleting 的顺序独立于 nginx-ingress-controller 生成的路由,以便我的 kubectl 操作更加稳健,如果重新创建其中一个入口,则什么都不会休息。

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

感谢您提供的任何帮助!

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

因此,如果您在 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

2022 年 3 月 31 日更新:

似乎在较新的 nginx 入口控制器版本上。具有相同主机的所有规则都合并到 nginx.conf

中的服务器块中