我在 GKE 中有一个应用程序(demoapp),它通过 GCE 入口暴露给互联网,如下所示:
- host: demoapp.com
http:
paths:
- backend:
serviceName: demoapp-service
servicePort: 80
该应用程序有许多客户,每个客户都有自己的页面,其路径方案类似于 demoapp.com/customers/customer1。我正在推出该应用程序的新版本 (demoapp2),并希望首先从某些客户那里收集一些反馈。因此,我想将某些客户路径路由到新应用程序而不是旧应用程序,以便例如 demoapp.com/customers/customer1 将解析为 demoapp2-service 的路径,而不是 demoapp-service 的路径。但这似乎不起作用:
- host: demoapp.com
http:
paths:
- backend:
serviceName: demoapp2-service
servicePort: 80
path: /customers/customer1
- backend:
serviceName: demoapp-service
servicePort: 80
我尝试过其他变体,例如将path: /
或path: /*
添加到 demoapp-service 路由,但我猜即使默认不覆盖路径,工作 URL 也会是 demoapp.com/customers/customer1/customers/customer1。所以接下来我认为我可以在 demoapp nginx 配置中使用类似这样的内容:
location /customers/customer1 {
proxy_pass http://demoapp2-service/customers/customer1;
}
但这似乎也不起作用,我在日志中看不到任何内容。有人知道如何实现这个方案吗?
答案1
你可以挖掘NGINX Plus 入口控制器重写注释功能并满足您的需要。
请找到官方示例在这里。
示例:在下面的示例中,我们对两个需要 URI 重写的应用程序进行负载平衡:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
nginx.org/rewrites: "serviceName=tea-svc rewrite=/;serviceName=coffee-svc rewrite=/beans/"
spec:
rules:
- host: cafe.example.com
http:
paths:
- path: /tea/
backend:
serviceName: tea-svc
servicePort: 80
- path: /coffee/
backend:
serviceName: coffee-svc
servicePort: 80