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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM