簡體   English   中英

Kubernetes 多路徑重寫

[英]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 入口

為了管理網絡,我使用了 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上呈現的部分內容頁。

所以嘗試1

我還嘗試從這個問題中復制公認的解決方案。

在這次嘗試中,我設置

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM