簡體   English   中英

如何在我的示例中編寫入口控制器目標重寫規則?

[英]How to write an ingress-controller target-rewrite rule in my example?

我對入口不是很熟悉,但我正在玩它。

我的目標是編寫一個目標重寫策略,將 /application 路徑的所有流量重定向到服務正在偵聽的正確 / 路徑。

我想出了以下入口定義

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: application-ingress
  namespace: myapp
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/app-root: /application
spec:
  rules:
 - host: myhost.foo.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-service
          servicePort: 8080
  tls:
 - secretName: myapp-cert

但是在應用時,瀏覽到myhost.foo.com/application不會將流量重定向到服務正在偵聽的根路徑。 它只是超時。

但是,如果我刪除 traffic-rewrite 語句並簡單地瀏覽到myhost.foo.com ,那么它可以工作,因此服務配置不正確不是問題。

任何指導表示贊賞。

事實上,它以完全相反的方式工作。 如果您的應用程序正在偵聽/application ,則您的示例將有意義,換句話說,如果它的根路徑位於/application而不是/ ,則發送到/的所有請求都將被重定向到/application 此處查看示例。

正如你在這里看到的:

nginx.ingress.kubernetes.io/app-root注釋定義了 Controller 必須重定向的應用程序根,如果它在 '/' 上下文中

在您的示例中,您僅在/定義了訪問路徑,換句話說,它僅在您在myhost.foo.com訪問您的應用程序時才有效。 您沒有在入口定義中的任何地方提到它可能在/application等其他路徑上被訪問,因此myhost.foo.com/application沒有機會工作。

如果您希望能夠在myhost.foo.com/application訪問您的應用程序,您需要以下內容:

spec:
  rules:
 - host: myhost.foo.com
    http:
      paths:
      - path: /application
        backend:
          serviceName: myapp-service
          servicePort: 8080

但是如果沒有重寫,它將向您的后端Pod發送任何請求,當您通過此特定路徑訪問入口后端時,您的myapp-service Service不會向其/而是向/application公開任何請求。

要解決這個問題,您需要重寫 正如您在文檔中所讀到的:

在某些情況下,后端服務中暴露的 URL 與 Ingress 規則中指定的路徑不同。 如果沒有重寫,任何請求都將返回 404。將注釋nginx.ingress.kubernetes.io/rewrite-target設置為服務預期的路徑。

按照此示例,您的入口定義可能如下所示:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: myhost.foo.com
    http:
      paths:
      - backend:
          serviceName: myapp-service
          servicePort: 8080
        path: /application(/|$)(.*)

在此入口定義中,由 (.*) 捕獲的任何字符都將分配給占位符 $2,然后將其用作 rewrite-target 注釋中的參數。

上面的入口定義將導致以下重寫:

myhost.foo.com/application重寫為myhost.foo.com/

myhost.foo.com/application/重寫為myhost.foo.com/

myhost.foo.com/application/new重寫為myhost.foo.com/new

你也可以試試:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /(.*)

暫無
暫無

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

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