k8s中的nginx-ingress如何配置路徑重定向
一. 需求描述
路徑重定向的一般應用場景:
- 調整用戶瀏覽的URL,看起來更規范
- 為了讓搜索引擎收錄網站內容,讓用戶體驗更好
- 網站更換新域名后
- 根據特殊的變量、目錄、客戶端信息進行跳轉
我這里遇到的問題是,以前的很多服務路徑配置不規范,有的服務使用項目名作為二級路徑,有的服務是隨意定義的訪問路徑,為了統一使用項目名作為訪問的二級路徑,避免修改代碼,所以需要配置路徑重定向。
舉一個例子,我有一個 a 服務,它原來的訪問路徑是 api/v1/apps,現在我需要通過路徑 a/api/v1/apps 訪問,需要將 a/ 重定向到 /。
也就是 www.test.com/a/api/v1/apps 重定向到 www.test.com/api/v1/apps 。
二. 解決方法
需要確保在集群中有一個 ingress controller 正在運行。我們可以按照如下方式配置 ingress :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: rewrite
namespace: default
spec:
ingressClassName: nginx
rules:
- host: www.test.com
http:
paths:
- path: /a(/|$)(.*)
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
在這個 ingress 的定義中,通過在 annotations 中指定了 nginx.ingress.kubernetes.io/rewrite-target: /$2 來進行重定向,(.*) 捕獲的任何字符都將被分配給占位符 $2,然后在 rewrite-target 中用作參數。
應用上面的 ingress 配置,可以實現下面的重定向:
www.test.com/a重定向到www.test.com/www.test.com/a/重定向到www.test.com/www.test.com/a/api/v1/apps重定向到www.test.com/api/v1/apps
rewriting 可以使用下面的 anntations 進行控制:
| 名稱 | 描述 | 值 |
|---|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
必須重定向流量的目標URI | string |
nginx.ingress.kubernetes.io/ssl-redirect |
表示位置部分是否可訪問SSL(當Ingress包含證書時默認為True) | bool |
nginx.ingress.kubernetes.io/force-ssl-redirect |
強制重定向到HTTPS,即使入口沒有啟用TLS | bool |
nginx.ingress.kubernetes.io/app-root |
定義應用根,如果它在'/'上下文中,控制器必須重定向它 | string |
nginx.ingress.kubernetes.io/use-regex |
表示Ingress上定義的路徑是否使用正則表達式 | bool |
App Root
創建一個帶有 nginx.ingress.kubernetes.io/app-root 注解的 ingress,如下所示:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/app-root: /app1
name: approot
namespace: default
spec:
ingressClassName: nginx
rules:
- host: approot.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
檢查 rewrite 是否起作用:
$ curl -I -k http://approot.bar.com/
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.11.10
Date: Mon, 13 Mar 2017 14:57:15 GMT
Content-Type: text/html
Content-Length: 162
Location: http://approot.bar.com/app1
Connection: keep-alive
參考文檔
https://github.com/kubernetes/ingress-nginx/blob/main/docs/examples/rewrite/README.md
