后面的入口子路径可以覆盖前面的入口父路径吗?
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
根本不起作用。
添加 special-ing
,配置如下所示:
server {
server_name host1.sub.example.com;
...
location /special {
...
}
location / { # default backend
...
}
...
}
现在添加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
中的服务器块中
我有一个 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
根本不起作用。
添加
special-ing
,配置如下所示:server { server_name host1.sub.example.com; ... location /special { ... } location / { # default backend ... } ... }
现在添加
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