[英]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.