我正在尝试使用nginx-ingress在GKE中设置kubernetes集群来处理请求路由。我有两个要在同一域中托管的不同项目,每个项目都管理自己的入口定义。自述文件here似乎显示了类似的内容,因此我认为这应该是可能的。
当我分别部署任何一个入口时,一切都很好,并且我可以访问我期望的路由。但是,当我同时添加两个入口时,只有具有按字母顺序排列的metadata.name值的入口将到达预期的后端,而另一个入口将从nginx-ingress返回404。
如果我切换metadata.name值,则此行为是一致的(具有第一个字母名称的入口将起作用),因此我认为这与路由本身或涉及的服务/吊舱无关,但是宁可与Nginx-ingress如何处理入口名称有关。
我尝试过各种版本的nginx-ingress-controller:
我还尝试过强制进行正则表达式路由匹配(使用nginx.ingress.kubernetes.io/rewrite-target: /
),在入口交换名称,将项目部署到不同的名称空间,并且将路径更改为完全不同而没有运气-只有一个入口文件将一次使用。
最后,我尝试制作一个包含两个定义的入口文件(因此,播放中只有一个入口名称),并且效果很好。将统一的工作设置的nginx配置与不工作的设置进行比较,唯一不同的是“ set $ ingress_name”,例如:
set $ingress_name "test-ingress-1";
vs
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,但是还没有成功。有什么我想念或做错的事吗?
谢谢您的帮助!
答案 0 :(得分:0)
您可以尝试添加此批注并对其进行测试吗?
Timer timer = new Timer();
timer.scheduleAtFixedRate(...)
答案 1 :(得分:0)
为什么您不将多个路径放入一个入口文件中?
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:
- path: /test
backend:
serviceName: test-frontend
servicePort: 80
- path: /api/test
backend:
serviceName: test-backend
servicePort: 80
status:
loadBalancer: {}
或按照以下建议使用rewrite-target
答案 2 :(得分:0)
我在使用 GKE 时遇到了同样的问题,所以,试试这个:
确保您已将 NGINX 控制器安装在同一命名空间上(如果您正在使用它)。如果没有,则安装(我推荐 helm)How install NGNIX controller
安装并运行 NGINX 后,请验证您的入口文件。
试试这个:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-1
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: test.com
http:
paths:
- backend:
serviceName: test-frontend
servicePort: 80
path: /test(/|$)(.*)
- backend:
serviceName: test-backend
servicePort: 80
path: /api/test(/|$)(.*)