簡體   English   中英

流量的重新路由不適用於入口 controller。 我覺得我誤解了重寫注釋?

[英]re-route of traffic is not working with ingress controller. I feel i mis-understood the re-write annotation?

重寫注釋的問題。

嘗試使用重寫注釋。 無法得到那個工作。

apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: hello-whale-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: hello.whale.info
    http:
      paths:
      - path: /blue|/(.+)
        backend:
          serviceName: hello-blue-whale-svc
          servicePort: 80
      - path: /green|/(.+)
        backend:
          serviceName: hello-green-whale-svc
          servicePort: 80

/Green 顯示出完美的結果,但為什么不是 /blue。

您應該在日志中看到入口總是命中相同的后端。 也許這個文檔可以幫助你。

我用兩台 nginx 服務器作為后端對自己進行了測試,一台返回藍色,另一台返回綠色:

apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
  name: hello-whale-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    nginx.org/rewrites: "serviceName=green rewrite=/;serviceName=blue rewrite=/"
spec:
  rules:
  - host: stardust
    http:
      paths:
      - path: /green
        backend:
          serviceName: green
          servicePort: 80
      - path: /blue
        backend:
          serviceName: blue
          servicePort: 80

然后,使用 curl 我可以達到正確的目標:

$ curl stardust/green
green
$ curl stardust/blue
blue

以下是入口 controller 的日志:

10.32.0.1 - - [12/Oct/2019:14:56:12 +0000] "GET /green HTTP/1.1" 200 6 "-" "curl/7.64.1" 132 0.008 [default-green-80] [] 10.32.0.28:80 6 0.008 200 b5ac38db9dd6a7e53d316dc48e9401aa
10.32.0.1 - - [12/Oct/2019:14:56:16 +0000] "GET /blue HTTP/1.1" 200 5 "-" "curl/7.64.1" 131 0.011 [default-blue-80] [] 10.32.0.12:80 5 0.012 200 c438d22db0e80a5206ca8885a48d72f9

我希望它可以幫助你。

你可以這樣嘗試嗎:路徑:/blue/(.*) – Vasily Angapov 2 天前

我想為Vasily Angapov 在問題評論中發布的正確答案添加一些解釋性的話,以便每個人都能理解為什么/blue/(.*)實際有效以及為什么/blue|/(.+)不起作用並且不應該在這種情況下使用。

讓我們使用正則表達式在線解釋器,它包含對表達式中使用的每個字符的詳細解釋,並讓我們嘗試將不同的字符串與給定的正則表達式匹配:

/blue|/(.+)基本上意味着我們要匹配字符串/blue或任何其他非零字符串。 . 表示除行終止符之外的任何字符, +號是一個量詞,它告訴我們前一個字符在我們的字符串中可能出現多少次。 +表示出現一個或多個前面的字符,因此表達式.+匹配由一個或多個不同字符組成的字符串(不包括換行符)。

如果您構建一個與特定字符串匹配的入口路徑,您通常不想使用| . 在這個特定的上下文中,這意味着您想要匹配/blueanything else例如/green/yellow/red ...這在這種情況下沒有多大意義。 您很感興趣只匹配從/blue開始的路徑,例如/blue/index.html/blue/second.htmlblue/third.php或只是/blue本身您的路徑可能如下所示:

/blue/(.+)

它將匹配/blue/index.html/blue/1但不單獨匹配/blue因為.+匹配一個或多個任意字符

.*另一方面匹配零個或多個任意字符,因此表達式/blue/(.*)將匹配:

/blue , /blue/index.html , /blue/ , /blue/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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