【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/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。