本頁面說明如何將 Google Kubernetes Engine (GKE) 的流量管理功能從 Ingress API 遷移至 Gateway API。Gateway API 提供全代管解決方案,可處理應用程式流量。 Google Cloud
如要盡量減少停機時間並降低風險,最有效的方法是同時執行現有的 Ingress API 和新的 Gateway API 設定,藉此遷移至 Gateway API。這個方法可在實際環境中徹底測試新的 Gateway 設定,且不會影響目前的服務。驗證新的 Gateway 設定後,您可以快速切換 DNS,將流量重新導向至 Gateway API,確保順利完成轉換,並將風險降到最低。
整體來說,遷移策略包含下列階段:
- 設定新的負載平衡器。
- 定義處理連入流量的規則。
- 部署新設定,並測試流向新閘道 IP 位址的流量。
- 將正式版流量切換至 Gateway API。
- 清除其餘 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: HTTP和port: 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 位址。
套用 Gateway 和 HTTPRoute 資訊清單:
kubectl apply -f gateway.yaml kubectl apply -f httproute.yaml取得閘道的 IP 位址。分配 IP 位址可能需要幾分鐘的時間:
kubectl get gateway external-http-gateway -o=jsonpath="{.status.addresses[0].value}" --watch輸出內容是閘道的外部 IP 位址,例如
203.0.113.90。測試新的閘道 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.com 的 A 記錄,並將舊 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 資源。
刪除 Ingress 資源:
kubectl delete ingress cafe-ingress解除安裝
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-headers或add-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 保護閘道安全,並在後端進行設定。 |
後續步驟
- 瞭解如何保護 Gateway。
- 瞭解 Gateway 流量管理的運作方式。