設定 GKE Pod 與外部端點的連線

本文說明如何設定連線,讓 GKE 中的 Pod 連線至外部端點,包括地端部署網路中的資源和公用網際網路服務。如要控管 GKE Pod 流量的來源 IP 位址,您可以同時使用 ip-masq-agent (節點層級轉譯) 和 Cloud NAT (VPC 層級輸出)。

總覽

當 VPC 原生 GKE 叢集中的 Pod 將封包傳送至叢集外部的目的地時,封包的來源 IP 位址會根據節點層級 IP 偽裝代理程式 (ip-masq-agent) 和 Cloud NAT 的設定而有所不同。

  1. 節點層級的轉換 (ip-masq-agent):根據設定的 nonMasqueradeCIDRs 清單,將封包的來源 IP 位址從 Pod IP 位址 (次要子網路範圍) 轉換為內部節點 IP 位址 (主要子網路範圍)。
  2. VPC 層級閘道 (Cloud NAT):將內部 VPC IP 位址 (節點 IP 位址或 Pod IP 位址) 轉換為靜態公開 IP 位址,允許傳出網際網路存取。

視節點是否偽裝目的地而定,封包會以節點的 IP 位址或 Pod 的 IP 位址離開節點。這個來源 IP 位址會決定如何設定 Cloud Router 或地端部署路由器。


IP 位址偽裝和 Cloud NAT 如何搭配運作

如果是面向網際網路的流量,Pod 的封包會同時經過節點網路堆疊和 Cloud NAT 閘道。

如果目的地 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 傳送封包時,會發生下列情況:

  1. 封包從 Pod 開始:封包來自 Pod 的網路介面 (IP 位址:10.4.0.5),目的地 IP 位址為 8.8.8.8
  2. 節點層級的偽裝:由於8.8.8.8目的地 IP 位址不在 nonMasqueradeCIDRs 清單中,主機節點上的 ip-masq-agent 會在封包離開時攔截封包,並執行 SNAT。來源 IP 位址會從 10.4.0.5 Pod IP 位址重新寫入至主機節點 IP 位址,即 10.128.0.10
  3. 虛擬私有雲輸出:封包會使用 10.128.0.10 主機節點 IP 位址做為來源 IP 位址,抵達虛擬私有雲網路。
  4. Cloud NAT 閘道:由於目的地是公用網際網路,Cloud NAT 會處理封包,將來源 IP 位址從 10.128.0.10 轉譯為公用 NAT IP 位址 (例如 203.0.113.1),然後轉送至網際網路。
  5. 處理回應:回應會傳回至公開 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 路由。如要找出問題,請使用下列方法:

  1. 略過服務網格:在停用 Sidecar 注入的命名空間中部署臨時用戶端 Pod,或在 Pod 規格中使用 sidecar.istio.io/inject: "false" 註解,防止注入測試工作負載。
  2. 測試連線:嘗試從非網狀 Pod 連線至外部目的地 (例如使用 curlpingnc)。
  3. 分析結果:
    • 如果連線成功:表示基礎 GKE 網路路由、ip-masq-agent 規則和 Cloud NAT 閘道設定正確。連線遭封鎖的原因可能是 Cloud Service Mesh 政策、缺少輸出規則或 mTLS 規則。如要進一步瞭解如何排解問題,請參閱 Cloud Service Mesh 說明文件中的「排解使用 Envoy 的部署作業問題」。
    • 如果連線失敗:問題屬於基礎網路基礎架構 (例如 IP 偽裝、Cloud Router、Cloud NAT、VPC 防火牆規則或地端部署防火牆)。請按照本頁的步驟驗證轉送設定。

使用檢查工具判斷來源 IP 位址範圍

設定路由器或防火牆前,請使用本文中的 IP 偽裝檢查工具,並完成下列步驟:

  1. ip-masq-agent ConfigMap 的 YAML 內容貼到設定欄位。
  2. 輸入目標端點的 IP 位址 (例如地端部署資料庫或外部網際網路服務)。
  3. 按一下「檢查偽裝」
  4. 請注意輸出內容:
    • 偽裝:封包使用節點 IP 位址範圍做為來源。
    • 未偽裝:封包使用 Pod IP 位址範圍做為來源。

設定端點連線

根據 IP 偽裝檢查工具的結果,依據目的地類型設定網路路徑和閘道。

地端部署端點 (VPN 或互連網路)

Cloud NAT 不適用於地端部署連線,但您必須根據使用 IP 偽裝檢查工具判斷的來源 IP 位址範圍,設定路由器和防火牆。

如果流量經過偽裝 (來源是節點 IP 位址):

  1. Cloud Router:確認 Cloud Router 通告包含 GKE 叢集子網路的主要 IP 位址範圍
  2. 地端部署路由器或防火牆:設定地端部署路由器和防火牆,允許並處理來自 GKE 節點 IP 位址範圍的傳入流量。

如果流量未經過偽裝 (來源是 Pod IP 位址):

  1. Cloud Router:在 Cloud Router 上設定自訂路徑通告,向地端部署網路通告 GKE Pod 次要 IP 位址範圍
  2. 地端部署路由器或防火牆:設定地端部署路由表和防火牆,允許來自 GKE Pod IP 位址範圍的流量,並確保將回程路由通告回虛擬私有雲。

網際網路端點 (Cloud NAT)

將流量導向公用網際網路端點時,您必須在虛擬私有雲中設定 Cloud NAT 閘道。

  1. 前往 Cloud de Confiance 控制台的「Cloud NAT」頁面。
  2. 選取或建立 Cloud NAT 閘道。
  3. 在「Cloud NAT 來源」下方,選擇閘道處理 GKE 子網路範圍的方式:
    • 如果流量經過偽裝 (來源是節點 IP 位址):選取子網路的主要 IP 位址範圍。商業 GKE 部署作業通常會預設為此設定。
    • 如果流量未經過偽裝 (來源是 Pod IP 位址):必須選取「主要和次要 IP 位址範圍」 (或明確指定 GKE Pod 次要範圍)。如果只選取主要範圍,系統會封鎖 GKE Pod 網際網路流量。