本文說明如何設定連線,讓 GKE 中的 Pod 連線至外部端點,包括地端部署網路中的資源和公用網際網路服務。如要控管 GKE Pod 流量的來源 IP 位址,您可以同時使用 ip-masq-agent (節點層級轉譯) 和 Cloud NAT (VPC 層級輸出)。
總覽
當 VPC 原生 GKE 叢集中的 Pod 將封包傳送至叢集外部的目的地時,封包的來源 IP 位址會根據節點層級 IP 偽裝代理程式 (ip-masq-agent) 和 Cloud NAT 的設定而有所不同。
- 節點層級的轉換 (
ip-masq-agent):根據設定的nonMasqueradeCIDRs清單,將封包的來源 IP 位址從 Pod IP 位址 (次要子網路範圍) 轉換為內部節點 IP 位址 (主要子網路範圍)。 - VPC 層級閘道 (Cloud NAT):將內部 VPC IP 位址 (節點 IP 位址或 Pod IP 位址) 轉換為靜態公開 IP 位址,允許傳出網際網路存取。
視節點是否偽裝目的地而定,封包會以節點的 IP 位址或 Pod 的 IP 位址離開節點。這個來源 IP 位址會決定如何設定 Cloud Router 或地端部署路由器。
IP 位址偽裝和 Cloud NAT 如何搭配運作
如果是面向網際網路的流量,Pod 的封包會同時經過節點網路堆疊和 Cloud NAT 閘道。
情境 A:偽裝成節點 IP 位址 (建議用於網際網路輸出)
如果目的地 IP 位址不符合 nonMasqueradeCIDRs 清單中的任何範圍:
ip-masq-agent會在 GKE 節點上執行來源 NAT (SNAT)。來源 IP 位址會從 Pod IP 位址重新編寫為節點 IP 位址。- 封包會進入虛擬私有雲網路,並以節點 IP 位址做為來源。
- Cloud NAT 閘道會攔截封包。
- Cloud NAT 會將節點 IP 位址轉譯為公開 IP 位址,並將其路由至網際網路。
情境 B:保留 Pod IP 位址 (不偽裝)
如果目的地 IP 位址與 nonMasqueradeCIDRs 清單中的範圍相符 (或預設 SNAT 已停用):
ip-masq-agent不會修改封包。來源 IP 位址仍為 Pod IP 位址。- 封包會進入虛擬私有雲網路,並以 Pod IP 位址做為來源。
- Cloud NAT 閘道會攔截封包。
- 只有在明確設定 Cloud NAT 轉換用於 GKE Pod 的子網路次要 IP 位址範圍時,Cloud NAT 才會將 Pod IP 位址轉換為公開 IP 位址。
IP 偽裝檢查工具
使用這個檢查工具,根據 ip-masq-agent 設定驗證目的地 IP 位址是否會遭到偽裝。
流量流向範例
如要瞭解翻譯路徑,請參考下列設定範例:
- Pod IP 位址範圍:
10.4.0.0/14(Pod IP 位址:10.4.0.5) - 節點 IP 位址範圍:
10.128.0.0/20(節點 IP 位址:10.128.0.10) - 目的地 IP 位址:
8.8.8.8(公開 DNS 伺服器,不在nonMasqueradeCIDRs清單中)
Pod 傳送封包時,會發生下列情況:
- 封包從 Pod 開始:封包來自 Pod 的網路介面 (IP 位址:
10.4.0.5),目的地 IP 位址為8.8.8.8。 - 節點層級的偽裝:由於
8.8.8.8目的地 IP 位址不在nonMasqueradeCIDRs清單中,主機節點上的ip-masq-agent會在封包離開時攔截封包,並執行 SNAT。來源 IP 位址會從10.4.0.5Pod IP 位址重新寫入至主機節點 IP 位址,即10.128.0.10。 - 虛擬私有雲輸出:封包會使用
10.128.0.10主機節點 IP 位址做為來源 IP 位址,抵達虛擬私有雲網路。 - Cloud NAT 閘道:由於目的地是公用網際網路,Cloud NAT 會處理封包,將來源 IP 位址從
10.128.0.10轉譯為公用 NAT IP 位址 (例如203.0.113.1),然後轉送至網際網路。 - 處理回應:回應會傳回至公開 Cloud NAT IP 位址,Cloud NAT 會反向轉譯回
10.128.0.10主機節點 IP 位址。接著,節點會將主機節點 IP 位址反向轉譯回 Pod IP 位址 (即10.4.0.5),並傳送至 Pod 容器。
使用 Cloud Service Mesh (CSM) 時的流量流動情形
如果工作負載使用 Cloud Service Mesh,流量路徑的行為如下:
- Sidecar Proxy 或 Sidecarless CNI 重新導向:應用程式容器的輸出封包會先被網格攔截 (使用 Envoy 等 Sidecar Proxy,或透過 ebpf 或 CNI 重新導向),再傳送至節點的網路命名空間。
- 政策適用:網格會根據授權和輸出政策,判斷是否允許連線。
- 輸出路徑:
- 如果流量是透過 Cloud Service Mesh 輸出閘道導向,離開節點的封包來源 IP 位址會對應至輸出閘道的節點或 Pod IP 位址,而非原始 Pod。
- 如果流量直接轉送至外部端點,封包會離開 Proxy,並透過標準主機節點網路堆疊轉送。在這種情況下,本文先前所述的
ip-masq-agent政策和 Cloud NAT 設定仍適用於輸出流量。
- 如要進一步瞭解如何在 Cloud Service Mesh 中設定路由、閘道及管理外部流量,請參閱 Cloud Service Mesh 說明文件。
排解及找出連線問題
如果 Pod 無法連線至外部端點,且您使用的是服務網格,請務必找出問題是出在服務網格設定,還是底層的 GKE 路由。如要找出問題,請使用下列方法:
- 略過服務網格:在停用 Sidecar 注入的命名空間中部署臨時用戶端 Pod,或在 Pod 規格中使用
sidecar.istio.io/inject: "false"註解,防止注入測試工作負載。 - 測試連線:嘗試從非網狀 Pod 連線至外部目的地 (例如使用
curl、ping或nc)。 - 分析結果:
- 如果連線成功:表示基礎 GKE 網路路由、
ip-masq-agent規則和 Cloud NAT 閘道設定正確。連線遭封鎖的原因可能是 Cloud Service Mesh 政策、缺少輸出規則或 mTLS 規則。如要進一步瞭解如何排解問題,請參閱 Cloud Service Mesh 說明文件中的「排解使用 Envoy 的部署作業問題」。 - 如果連線失敗:問題屬於基礎網路基礎架構 (例如 IP 偽裝、Cloud Router、Cloud NAT、VPC 防火牆規則或地端部署防火牆)。請按照本頁的步驟驗證轉送設定。
- 如果連線成功:表示基礎 GKE 網路路由、
使用檢查工具判斷來源 IP 位址範圍
設定路由器或防火牆前,請使用本文中的 IP 偽裝檢查工具,並完成下列步驟:
- 將
ip-masq-agentConfigMap 的 YAML 內容貼到設定欄位。 - 輸入目標端點的 IP 位址 (例如地端部署資料庫或外部網際網路服務)。
- 按一下「檢查偽裝」。
- 請注意輸出內容:
- 偽裝:封包使用節點 IP 位址範圍做為來源。
- 未偽裝:封包使用 Pod IP 位址範圍做為來源。
設定端點連線
根據 IP 偽裝檢查工具的結果,依據目的地類型設定網路路徑和閘道。
地端部署端點 (VPN 或互連網路)
Cloud NAT 不適用於地端部署連線,但您必須根據使用 IP 偽裝檢查工具判斷的來源 IP 位址範圍,設定路由器和防火牆。
如果流量經過偽裝 (來源是節點 IP 位址):
- Cloud Router:確認 Cloud Router 通告包含 GKE 叢集子網路的主要 IP 位址範圍。
- 地端部署路由器或防火牆:設定地端部署路由器和防火牆,允許並處理來自 GKE 節點 IP 位址範圍的傳入流量。
如果流量未經過偽裝 (來源是 Pod IP 位址):
- Cloud Router:在 Cloud Router 上設定自訂路徑通告,向地端部署網路通告 GKE Pod 次要 IP 位址範圍。
- 地端部署路由器或防火牆:設定地端部署路由表和防火牆,允許來自 GKE Pod IP 位址範圍的流量,並確保將回程路由通告回虛擬私有雲。
網際網路端點 (Cloud NAT)
將流量導向公用網際網路端點時,您必須在虛擬私有雲中設定 Cloud NAT 閘道。
- 前往 Cloud de Confiance 控制台的「Cloud NAT」頁面。
- 選取或建立 Cloud NAT 閘道。
- 在「Cloud NAT 來源」下方,選擇閘道處理 GKE 子網路範圍的方式:
- 如果流量經過偽裝 (來源是節點 IP 位址):選取子網路的主要 IP 位址範圍。商業 GKE 部署作業通常會預設為此設定。
- 如果流量未經過偽裝 (來源是 Pod IP 位址):必須選取「主要和次要 IP 位址範圍」 (或明確指定 GKE Pod 次要範圍)。如果只選取主要範圍,系統會封鎖 GKE Pod 網際網路流量。