nginx - Kubernetes Ingress 路径优先级(ingress-nginx)
问题描述
我部署了 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 文档,它遵循的第一步是将路径按降序排列,然后将这些路径转换为 nginx位置块。nginx 在这些块上遵循首次匹配策略。
在您的情况下,您可以提供两个路径,并且/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
推荐阅读
- diagram - 如何为draw.io图表生成的CSV表格提供唯一的线名?
- ffmpeg - 如何广播 Twilio(组房间)视频会议?
- php - 比较一个表中的两列并在 if 条件下使用结果?
- python - 以另一个变量设置的精度打印浮点变量
- visual-studio - nuget中的uap10.0 netstandard2.0消歧
- c - 如果未调用 init 函数,C Drop 编译器错误
- firebase - 我需要在 Firebase 中替换 AppID 和 AppSecret 以进行 Facebook 登录
- javascript - 如何在由 html 表单填写的在线表单中将日期和时间添加到谷歌工作表单元格
- rust - 如何从 serde_yaml::Value 获取嵌套属性?
- pagespeed-insights - Pagespeed见解如何从API读取分数?