我有一个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
感谢您提供的任何帮助!
答案 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
根本不起作用。
添加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入口控制器容器中并查看nginx.conf
文件来找到更多内容。
$ kubectl -n <namespace> exec -it nginx-ingress-controller-pod sh
# cat /etc/nginx/nginx.conf