k8s中的nginx-ingress如何配置路徑重定向


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

https://www.cnblogs.com/brianzhu/p/8624703.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM