好吧,已經問了這個問題的各種排列,我覺得問得很糟糕;我把毛巾扔了進去,很好奇是否有人能指出我正確的方向(或指出我錯在哪里)。我繼續嘗試了檔案中的一些示例,但無濟于事(見下文)。
我正在嘗試使用 Ingress 控制器將流量路由到 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 入口
為了管理網路,我使用了一個 Kubernetes Ingress 控制器,我在下面定義了它。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,因為訪問時會給出 500myserver.com/services
I know that I don't want nginx.ingress.kubernetes.io/rewrite-target: $1/$2 because when I visit myserver.com/services/service_1 I actually get part of the content at myserver.com/services rendered on the page.
SO Attempt 1
I also attempted to replicate the accepted solution from this question.
In this attempt I set
nginx.ingress.kubernetes.io/rewrite-target: "/$1" and one of the service paths to
- path: /(services/service_1(?:/|$).*)
When I visit myserver.com/services/service_1/xyz, the HTML from myserver.com/services/service_1 gets rendered.
Concluding Thoughts
Something ain't quite right with the path rewrite and paths rules. Any suggestions?
uj5u.com熱心網友回復:
您在最近的評論中報告的問題通過查看nginx-ingress 檔案中的重寫示例得到解決。
注釋配置入口,以便將rewrite-target匹配的路徑重寫為該值。由于您指定了 的靜態值/,因此與您的入口規則匹配的任何內容都將被重寫為/,這正是您所看到的行為。
解決方案是捕獲我們關心的路徑部分,然后在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(/|$)(.*)
第二個捕獲組(.*)捕獲路徑部分之后的所有內容。然后我們在注釋中使用該捕獲組($2,因為它是第二組) :rewrite-target
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"
我已經更新了我的示例存盤庫以匹配此配置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/420976.html
標籤:
