【K8s教程】Nginx Ingress控制器Ingress Path匹配
参考:https://kubernetes.github.io/ingress-nginx/user-guide/ingress-path-matching/
正则表达式支持
示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/.*
backend:
serviceName: test
servicePort: 80
上面的Ingress定义将转换为 NGINX 配置中的以下位置块,用于 test.com服务器:
location ~* "^/foo/.*" {
...
}
路径优先级
在 NGINX 中,正则表达式遵循 首次匹配 策略。 为了实现更准确的路径匹配,ingress-nginx 首先按长度降序对路径进行排序,然后将它们作为位置块写入 NGINX 模板。
示例
创建以下两个Ingress定义:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-1
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar
backend:
serviceName: service1
servicePort: 80
- path: /foo/bar/
backend:
serviceName: service2
servicePort: 80
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-2
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar/(.+)
backend:
serviceName: service3
servicePort: 80
Ingress控制器将在 NGINX 模板中按长度降序定义以下位置块 test.com服务器:
location ~* ^/foo/bar/.+ {
...
}
location ~* "^/foo/bar/" {
...
}
location ~* "^/foo/bar" {
...
}
以下请求 URI 将匹配相应的位置块:
- test.com/foo/bar/1 matches ~* ^/foo/bar/.+ and will go to service 3.
- test.com/foo/bar/ matches ~* ^/foo/bar/ and will go to service 2.
- test.com/foo/bar matches ~* ^/foo/bar and will go to service 1.
重要说明:如果 use-regex要么 rewrite-target注释用于给定主机的任何Ingress,然后不区分大小写的正则表达式 位置修饰符 将在给定主机的所有路径上强制执行,无论它们定义在哪个Ingress上。
警告
以下示例描述了一种可能导致不需要的路径匹配行为的情况。
这种情况是预料之中的,并且是 NGINX 对使用正则表达式 路径的第一个匹配策略的结果 位置修饰符(https://nginx.org/en/docs/http/ngx_http_core_module.html#location) 。 有关如何选择路径的更多信息,请阅读以下文章: “了解 Nginx 服务器和位置块选择算法(https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms)” 。
示例
定义以下Ingress:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-3
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar/bar
backend:
serviceName: test
servicePort: 80
- path: /foo/bar/[A-Z0-9]{3}
backend:
serviceName: test
servicePort: 80
Ingress控制器将在 NGINX 模板中定义以下位置块(按此顺序) test.com服务器:
location ~* "^/foo/bar/[A-Z0-9]{3}" {
...
}
location ~* "^/foo/bar/bar" {
...
}
一个请求 test.com/foo/bar/bar将匹配 ^/foo/bar/[A-Z0-9]{3}位置块而不是最长的精确匹配路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下