问题描述
我部署了 2 个基于 angular 的前端应用程序。我使用具有以下配置的 ingress-Nginx (k8s.gcr.io/ingress-Nginx/controller:v0.44.0
) 将请求路由到这些应用程序:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
name: portal-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: Nginx
Nginx.ingress.kubernetes.io/ssl-redirect: "false"
Nginx.ingress.kubernetes.io/use-regex: "true"
Nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- http:
paths:
- path: /?(.*)
backend:
serviceName: app1
servicePort: 80
- path: /app2
backend:
serviceName: app2
servicePort: 80
当我点击 <ip-address>/
时,它路由到 app1,但当我点击 <ip-address>/app2
时,它路由回 app1。
解决方法
根据ingress-nginx documentation,第一步是将路径按长度降序排列,然后将这些路径转换成nginx location blocks。 nginx 在这些块上遵循 first-match 策略。
在您的情况下,您可以提供两个路径,并且由于 /app2
比 /
长,它将首先写入 nginx 配置中。这意味着 /app2
将有机会首先被匹配(并将流量发送到 app2),而其他所有内容都将转到 app1。您不需要正则表达式来实现这一点。
代码:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: portal-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: app1
servicePort: 80
- path: /app2
backend:
serviceName: app2
servicePort: 80