1. 程式人生 > 其它 >【K8s教程】Nginx Ingress控制器Ingress Path匹配

【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}位置塊而不是最長的精確匹配路徑。

作者:Varden 出處:http://www.cnblogs.com/varden/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。