將 Ingress 遷移至 Gateway API

本頁面說明如何將 Google Kubernetes Engine (GKE) 的流量管理功能從 Ingress API 遷移至 Gateway API。Gateway API 提供全代管解決方案,可處理應用程式流量。 Google Cloud

如要盡量減少停機時間並降低風險,最有效的方法是同時執行現有的 Ingress API 和新的 Gateway API 設定,藉此遷移至 Gateway API。這個方法可在實際環境中徹底測試新的 Gateway 設定,且不會影響目前的服務。驗證新的 Gateway 設定後,您可以快速切換 DNS,將流量重新導向至 Gateway API,確保順利完成轉換,並將風險降到最低。

整體來說,遷移策略包含下列階段:

  1. 設定新的負載平衡器。
  2. 定義處理連入流量的規則。
  3. 部署新設定,並測試流向新閘道 IP 位址的流量。
  4. 將正式版流量切換至 Gateway API。
  5. 清除其餘 Ingress 資源。

設定新的負載平衡器

在這個階段,您會部署 Kubernetes 閘道資源,將流量負載平衡至 GKE 叢集。部署 Gateway 資源時,GKE 會設定第 7 層應用程式負載平衡器,將 HTTP(S) 流量公開給叢集中執行的應用程式。您可以為每個叢集或每個負載平衡器部署一個 Gateway 資源。

在下列範例中,您會設定全域外部應用程式負載平衡器。如要建立 Gateway,請將下列資訊清單儲存為 gateway.yaml

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1
metadata:
  name: external-http-gateway
spec:
  gatewayClassName: gke-l7-global-external-managed # GKE's managed external Application Load Balancer
  listeners:
  - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
      namespaces:
        from: Same # Only allow HTTPRoutes from the same namespace

上述資訊清單說明的 Gateway 包含下列欄位:

  • gatewayClassName: gke-l7-global-external-managed:指定這個 Gateway 的 GatewayClass。這個 Gateway 類別使用全域外部應用程式負載平衡器。
  • protocol: HTTPport: 80:指定 Gateway 公開通訊埠 80,以處理 HTTP 流量。

定義傳入流量的流量規則

路由資源會定義通訊協定專屬規則,用於將流量從閘道對應至後端服務。

在這個階段,您會將 Ingress 資訊清單轉換為 HTTPRoute 資源。如要轉換 Ingress 資訊清單,請按照 ingress2gateway 工具中的步驟操作。

本範例假設您有下列 Ingress 資源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      - path: /coffee
        pathType: Prefix
        backend:
          service:
            name: coffee-svc
            port:
              number: 80

使用 ingress2gateway 工具轉換資訊清單後,輸出內容會是翻譯後的 HTTPRoute 資訊清單。

將下列範例資訊清單儲存為 httproute.yaml

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: cafe-route
spec:
  # This route attaches to our new Gateway
  parentRefs:
  - name: external-http-gateway
  # The hostname is the same as before
  hostnames:
  - "cafe.example.com"
  # The routing rules are now more explicit
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /tea
    backendRefs:
    - name: tea-svc
      port: 80
  - matches:
    - path:
        type: PathPrefix
        value: /coffee
    backendRefs:
    - name: coffee-svc
      port: 80

請注意,HTTPRoute 資訊清單中的 rules 欄位,直接對應至原始 Ingress 資訊清單中定義的路由規則。

部署及測試新設定

在這個階段,您會套用前兩個階段建立的 Gateway 和 HTTPRoute 資訊清單,並測試流量是否會流向 Gateway 的新 IP 位址。

  1. 套用 Gateway 和 HTTPRoute 資訊清單:

    kubectl apply -f gateway.yaml
    kubectl apply -f httproute.yaml
    
  2. 取得閘道的 IP 位址。分配 IP 位址可能需要幾分鐘的時間:

    kubectl get gateway external-http-gateway -o=jsonpath="{.status.addresses[0].value}" --watch
    

    輸出內容是閘道的外部 IP 位址,例如 203.0.113.90

  3. 測試新的閘道 IP 位址。使用下列 curl 指令將要求傳送至 IP 位址,並指定 cafe.example.com 主機名稱。例如:

    curl --resolve cafe.example.com:80:203.0.113.90 http://cafe.example.com/tea
    curl --resolve cafe.example.com:80:203.0.113.90 http://cafe.example.com/coffee
    

    203.0.113.90 替換為您在上一個步驟中取得的外部 IP 位址。輸出內容會確認新的閘道 IP 位址是否正確轉送 cafe.example.com 的流量,而不會執行 DNS 查詢。

將流量直接導向新的閘道 IP 位址

在這個階段,請更新 DNS 記錄,讓網址指向新的 Gateway IP 位址,將先前的 Ingress 流量切換至新的 Gateway。更新 DNS 記錄的確切步驟會因 DNS 供應商而異。

舉例來說,如果您在 Ingress 中設定 cafe.example.com,請向 DNS 供應商找出 cafe.example.comA 記錄,並將舊 Ingress IP 位址的值變更為 203.0.113.90,也就是新的 Gateway IP 位址。

更新 DNS 記錄後,流量會開始從 Ingress 轉移至 Gateway,但並非所有用戶端都會立即切換。快取先前記錄的 DNS 解析器會等待記錄的存留時間 (TTL) 值到期,然後再次查詢記錄並接收更新後的 IP 位址。因此,您應繼續並行執行現有的 Ingress 和新的 Gateway,直到確認 Ingress 的流量已停止為止,這表示 DNS 傳播已完成,用戶端不再導向舊 IP 位址。您可以監控負載平衡器或 Ingress 控制器的流量,確認這項設定。詳情請參閱檢查 DNS 傳播

如果您使用 Cloud DNS,可以運用目標權重,逐步將流量從舊 IP 位址轉移至新 IP 位址。詳情請參閱設定 DNS 轉送政策和健康狀態檢查

清除其餘 Ingress 資源

確認新的 Gateway 順利運作後,請清除舊的 Ingress 資源。

  1. 刪除 Ingress 資源:

    kubectl delete ingress cafe-ingress
    
  2. 解除安裝 ingress-nginx 控制器。舉例來說,如果您使用 Helm 安裝控制器,請執行下列指令:

    helm uninstall ingress-nginx -n ingress-nginx
    

Ingress NGINX 與 GKE Gateway 的功能比較

Gateway API 提供更標準化的 Ingress 設定方式,並支援大多數常見功能,例如路由、標頭和流量分割。

下表比較 Ingress 控制器和 Gateway API 中常用功能的註解。

功能 Ingress 中的註解 GKE 閘道中的註解 同位元
網址重寫 nginx.ingress.kubernetes.io/rewrite-target HTTPRoute,並套用 urlRewrite 濾鏡。 部分同位。GKE Gateway 僅支援前置字元取代。
標頭操弄 nginx.ingress.kubernetes.io/proxy-set-headersadd-headers HTTPRoute,搭配 requestHeaderModifier 修飾符或 responseHeaderModifier 篩選器。 完全一致。
路徑型轉送 Ingress 物件中的 spec.rules.http.paths HTTPRoute 物件中的 rules.matches.path 完全一致。
主機轉送 Ingress 物件中的 spec.rules.host HTTPRoute 物件中的 hostnames 完全一致。
流量拆分 nginx.ingress.kubernetes.io/canary 註解。 HTTPRoute,並加權 backendRefs 完全一致。此外,您也可以精細控管流量拆分。
驗證 nginx.ingress.kubernetes.io/auth-url 進行外部驗證。
  • Identity-Aware Proxy (IAP):BackendPolicy CRD。
  • 其他:需要更自訂的做法,可能要使用服務網格或自訂篩選器。
部分同位。建議您使用 Identity-Aware Proxy 保護閘道安全,並在後端進行設定。

後續步驟