【发布时间】:2019-09-30 21:35:40
【问题描述】:
我正在尝试使用 nginx-ingress 在 GKE 中设置一个 kubernetes 集群来处理请求路由。我有两个不同的项目,我想在同一个域中托管,每个项目都管理自己的入口定义。自述文件here 似乎显示了类似的内容,所以我认为这应该是可能的。
当我单独部署任一入口时,一切正常,我可以访问我期望的路由。但是,当我同时添加两者时,只有 metadata.name 值按字母顺序出现的入口才会到达预期的后端,而另一个入口将从 nginx-ingress 返回 404。
如果我切换 metadata.name 值,这种行为是一致的(具有第一个字母名称的入口将起作用),所以我认为它与路由本身或所涉及的服务/pod 无关,但是而是与 nginx-ingress 如何处理入口名称有关。
我尝试了各种版本的 nginx-ingress-controller:
- quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
- quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.24.0
- quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.23.0
- quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.22.0
我还尝试过强制正则表达式路由匹配(使用nginx.ingress.kubernetes.io/rewrite-target: /),交换入口上的名称,将项目部署到不同的命名空间,并将路径更改为完全不同但没有运气 - 只有一个入口文件会一次使用。
最后,我尝试制作一个包含两个定义的入口文件(因此只有一个入口名称在起作用),效果很好。比较统一的工作设置和非工作设置的 nginx 配置,唯一不同的是“set $ingress_name”,例如:
set $ingress_name "test-ingress-1";
对
set $ingress_name "test-unified-ingress";
这里是入口(更改了主机名):
test-ingress-1.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/from-to-www-redirect: "false"
name: test-ingress-1
namespace: default
spec:
rules:
- host: test.com
http:
paths:
- backend:
serviceName: test-frontend
servicePort: 80
path: /test
status:
loadBalancer: {}
test-ingress-2.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/from-to-www-redirect: "false"
name: test-ingress-2
namespace: default
spec:
rules:
- host: test.com
http:
paths:
- backend:
serviceName: test-backend
servicePort: 80
path: /api/test
status:
loadBalancer: {}
我希望这两个单独的入口文件一起配置 nginx,但没有成功。我有什么遗漏或做错了吗?
感谢您的帮助!
【问题讨论】:
-
一个入口文件可以正常工作吗?
-
是的,一个入口文件可以正常工作,但我正在尝试找到一种方法来处理多个文件,以便将两个项目分开。