[英]Configure Kubernetes Traefik Ingress with different path rewrites for each service
[英]Kubernetes Multiple Path Rewrites
好吧,已經問了這個問題的各種排列,我覺得問得很糟糕; 我把毛巾扔了進去,很好奇是否有人能指出我正確的方向(或指出我錯在哪里)。 我繼續嘗試了文檔中的一些示例,但無濟於事(見下文)。
我正在嘗試使用入口 controller 將流量路由到 Kubernetes 下的適當位置。
我有一台服務器myserver.com
和三個運行在以下位置的服務:
myserver.com/services/
myserver.com/services/service_1/
myserver.com/services/service_2/
請注意,我沒有(故意)對myserver.com/
做任何事情。
在這三個位置中的每一個,都有一個 webapp 正在運行。 例如myserver.com/services/service_2
需要在myserver.com/services/service_2/static/css
等處加載 css 文件等...
為了管理網絡,我使用了 Kubernetes Ingress controller,我在下面定義了它。 CORS 注釋不是超級相關的,但我將它們包括在內以消除任何混淆。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myServices
namespace: myServices
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- myserver.com
rules:
- host: myserver.com
http:
paths:
- path: /services
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /services/service_1(/|$)
pathType: Prefix
backend:
service:
name: web-service-1
port:
number: 80
- path: /services/service_2(/|$)
pathType: Prefix
backend:
service:
name: web-service-2
port:
number: 80
我注意到一件有用的事情是提供一些路徑示例。 從下面的示例中,路徑看起來並沒有那么復雜。 我想這就是我所追求的。 請注意,我希望每個服務都能夠解析其 css 和圖像文件。
myserver.com/services -> myserver.com/services
myserver.com/services/xxx/xxx -> myserver.com/services/xxx/xxx
myserver.com/services/service_1 -> myserver.com/services/service_1
myserver.com/services/service_1/xxx/xxx -> myserver.com/services/service_1/xxx/xxx
myserver.com/services/service_2/xxx/xxx -> myserver.com/services/service_2/xxx/xxx
我知道這個問題與nginx.ingress.kubernetes.io/rewrite-target
規則及其與我定義的路徑的交互有很大關系。
我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1
因為在訪問myserver.com/services
時會得到 500
我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1/$2
因為當我訪問myserver.com/services/service_1
時,我實際上得到了myserver.com/services
上呈現的部分內容頁。
我還嘗試從這個問題中復制公認的解決方案。
在這次嘗試中,我設置
nginx.ingress.kubernetes.io/rewrite-target: "/$1"
和服務路徑之一
- path: /(services/service_1(?:/|$).*)
當我訪問myserver.com/services/service_1/xyz
時,來自myserver.com/services/service_1
的 HTML 被渲染。
路徑重寫和路徑規則不太對勁。 有什么建議么?
您在最近的評論中報告的問題通過查看 nginx-ingress 文檔中的重寫示例得到解決。
rewrite-target
注釋配置入口,以便將匹配的路徑重寫為該值。 由於您已指定/
的 static 值,因此與您的入口規則匹配的任何內容都將被重寫為/
,這正是您所看到的行為。
解決方案是捕獲我們關心的路徑部分,然后在rewrite-target
注釋中使用它。 例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myservices
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- host: myserver.com
http:
paths:
- path: /services/service_1(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice-service1
port:
number: 80
- path: /services/service_2(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice-service2
port:
number: 80
- path: /services(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice
port:
number: 80
在這里,我們修改了匹配表達式,使它們看起來像:
- path: /services/service_1(/|$)(.*)
第二個捕獲組(.*)
捕獲路徑部分之后與字面匹配的所有內容。 然后我們在rewrite-target
注釋中使用該捕獲組( $2
,因為它是第二組):
nginx.ingress.kubernetes.io/rewrite-target: /$2
有了這個配置,對/services/service_2
的請求會導致:
This is service2.
但是對/services/service_2/foo/bar
的請求會導致:
<html><head><title>404 Not Found</title></head><body>
<h1>Not Found</h1>
The URL you requested (/foo/bar) was not found.
<hr>
</body></html>
查看后端服務器日志,我們看到:
10.42.0.32 - - [21/Jan/2022:20:33:23 +0000] "GET / HTTP/1.1" 200 211 "" "curl/7.79.1"
10.42.0.32 - - [21/Jan/2022:20:33:45 +0000] "GET /foo/bar HTTP/1.1" 404 311 "" "curl/7.79.1"
我已經更新了我的示例存儲庫以匹配此配置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.