【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}位置块而不是最长的精确匹配路径。

posted @   Varden  阅读(6885)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 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代理 了,记录一下
点击右上角即可分享
微信分享提示