關於 GKE 中的網路隔離

您可以自訂 Google Kubernetes Engine (GKE) 叢集控制層和節點的網路存取權,提升叢集及其工作負載的網路安全性。本文說明可為叢集設定的各種隔離類型、隔離網路的好處,以及隔離叢集前必須考量的任何限制。

如要為叢集設定特定隔離層級,請參閱下列文件:

最佳做法:

與貴機構的網路架構師、網路工程師、網路管理員,或負責定義、實作及維護網路架構的其他團隊,共同規劃及設計網路隔離設定。

網路存取類型

叢集中的元件 (例如控制層、API 伺服器和節點) 會傳送及接收網路流量,以達成不同目的。您可以控管下列一或多種網路存取類型,自訂叢集的隔離設定:

  • 從外部來源存取控制層:自訂可存取控制層的使用者,以便在叢集中執行 kubectl 指令等工作。
  • 從 API 伺服器存取外部 Webhook:自訂 Kubernetes API 伺服器是否能透過控制層,將流量直接傳送至外部 Webhook 伺服器。
  • 從外部來源存取節點:自訂公開網際網路上的外部用戶端是否可以存取節點。

從外部來源存取控制層

在本節中,您將思考哪些人可以存取控制層。

每個 GKE 叢集都有控制層,可處理 Kubernetes API 要求。控制層會在 Google 代管專案中,虛擬私有雲網路內的虛擬機器 (VM) 上執行。區域叢集具有多個控制層副本,每個副本都會在自己的 VM 上執行。叢集管理員等主體會使用控制層端點存取叢集,執行 kubectl 指令或部署工作負載等工作。外部用戶端會使用控制層端點存取叢集,但不會直接與代管控制層副本的 Compute Engine VM 執行個體通訊。控制層具有下列端點,可供存取叢集:

控制層有兩種叢集存取端點:

  • DNS 端點
  • 以 IP 為基礎的端點
最佳做法:

僅使用 DNS 端點存取控制層,簡化設定程序,並建立彈性且以政策為基礎的安全防護層。

DNS 端點

DNS 端點會為每個叢集控制層提供不重複且不可變更的 DNS 或完整網域名稱 (FQDN)。在控制層的整個生命週期中,您可以使用這個 DNS 名稱存取控制層。DNS 名稱會解析為可從 API 存取的任何網路端點,包括地端或其他雲端網路。 Google Cloud 啟用 DNS 型端點後,您就不需要堡壘主機或 Proxy 節點,即可從其他虛擬私有雲網路或外部位置存取控制層。

如要存取控制層端點,您需要設定 IAM 角色和政策,以及驗證權杖。如要進一步瞭解所需權限,請參閱「自訂網路隔離」。

除了 IAM 政策和權杖,您也可以設定下列存取權屬性:

  • 透過 VPC Service Controls 進行 IP 位址或網路控管:為提升 GKE 叢集控制層的安全性,VPC Service Controls 會新增一層存取安全防護。並根據網路來源等屬性,使用情境感知存取權。

    VPC Service Controls 不直接支援控制層具有公開 IP 位址的叢集。不過,當您使用以 DNS 為基礎的端點存取 GKE 叢集 (包括私人和公開叢集) 時,VPC Service Controls 會提供保護。

    設定 VPC Service Controls,將 container.googleapis.com 和 kubernetesmetadata.googleapis.com 加入服務範圍的受限服務清單,保護 GKE 叢集的 DNS 型端點。將這些 API 新增至服務範圍後,即可為所有 GKE API 作業啟用 VPC-SC。這項設定可確保您定義的安全範圍會控管控制層的存取權。

    同時使用 IAM 政策和 VPC Service Controls 保護 DNS 端點的存取權,即可為叢集控制層建立多層式安全防護模型。VPC Service Controls 與支援的 Google Cloud 服務整合。這項功能可讓叢集的安全性設定與您在其他 Google Cloud 服務中託管的資料保持一致。

  • Private Service Connect 或 Cloud NAT:從沒有公開網路連線能力的用戶端存取 DNS 型端點。根據預設,您可以透過公開網際網路上的 API 存取 DNS 型端點。 Google Cloud詳情請參閱「自訂網路隔離」頁面的「以 DNS 為基礎的端點」一節。

  • Kubernetes 驗證憑證:使用 Kubernetes ServiceAccount 不記名權杖或 X.509 用戶端憑證,向 DNS 型端點進行驗證。在 GKE 叢集中,這些驗證方式預設為停用。設定叢集的 DNS 型端點時,可以啟用這些方法。

以 IP 為基礎的端點

您也可以選擇使用 IP 型端點設定控制層的存取權。

與叢集和 IP 位址相關的術語

  • Google Cloud 外部 IP 位址:

    • 指派給任何 VM 的外部 IP 位址,由Google Cloud. Google Cloud 擁有這些 IP 位址。詳情請參閱「哪裡可以找到 Compute Engine IP 範圍?」一節。

    • Google Cloud 產品 (例如 Cloud Run 或 Cloud Run functions) 使用的外部 IP 位址。在 Google Cloud 上代管的任何用戶端都可以例項化這些 IP 位址。 Google Cloud 擁有這些 IP 位址。

  • Google 保留的 IP 位址:用於管理 GKE 叢集的外部 IP 位址。這些 IP 位址包括 GKE 管理的程序和其他 Google 生產服務。這些 IP 位址屬於 Google。

  • GKE 叢集 IP 位址範圍:指派給叢集的內部 IP 位址,GKE 會將這些位址用於叢集的節點、Pod 和 Service。

  • 內部 IP 位址:叢集虛擬私有雲網路的 IP 位址。這些 IP 位址可以包括叢集 IP 位址、地端部署網路、RFC 1918 範圍,或包括非 RFC 1918 範圍的私人使用公開 IP (PUPI) 位址。

  • 以外部 IP 為基礎的叢集端點:外部端點的 IP 位址,由 GKE 指派給控制層。

  • 外部控制層 VM IP 位址:指派給每個執行控制層的 VM 執行個體的外部 IP 位址,僅用於 API 伺服器的輸出流量。

  • 內部端點:GKE 指派給控制層的內部 IP 位址。

  • 虛擬私有雲網路:虛擬網路,您可以在其中建立子網路,並為叢集的節點和 Pod 設定專用的 IP 位址範圍。

使用 IP 型端點時,有兩種做法:

  • 在外部和內部端點公開控制層。 這表示控制層的外部端點可透過外部 IP 位址存取,而內部端點則可透過叢集的虛擬私有雲網路存取。節點只會透過內部端點與控制層通訊。

  • 僅在內部端點公開控制層。也就是說,網際網路上的用戶端無法連線至叢集,且可從叢集虛擬私有雲網路中的任何 IP 位址存取控制層。節點只會透過內部端點與控制層通訊。

    使用以 IP 為基礎的端點時,這是最安全的選項,因為這樣可以防止所有網際網路存取控制層。如果您的工作負載因資料隱私權和安全法規而需要控管存取權,建議選用這項服務。

無論選擇上述哪種做法,您都可以設定授權網路,限制可連線至端點的 IP 位址。如果您使用以 IP 為基礎的端點,強烈建議您至少新增一個授權網路。授權網路會將控制層存取權授予一組特定的信任 IPv4 位址,並為 GKE 叢集提供保護和額外的安全性。

最佳做法:

使用 IP 位址型端點時,請啟用授權網路,確保 GKE 叢集安全無虞。

授權網路的運作方式

授權網路會提供以 IP 為基礎的防火牆,控管 GKE 控制層的存取權。控制層的存取權取決於來源 IP 位址。啟用授權網路時,請將要允許存取 GKE 叢集控制層端點的 IP 位址設定為 CIDR 區塊清單。

下表列出:

  • 無論是否啟用授權網路,這些預設 IP 位址一律可以存取 GKE 控制層。
  • 啟用授權網路後,可存取控制層的可設定 IP 位址。
控制層端點 一律可存取端點的預設 IP 位址 啟用授權網路後,可存取端點的可設定 IP 位址
已啟用外部和內部端點
  • Google 保留的 IP 位址
  • GKE 叢集 IP 位址範圍
  • 已加入許可清單的外部 IP 位址
  • 已加入許可清單的內部 IP 位址
  • Google Cloud 個外部 IP 位址
僅啟用內部端點
  • Google 保留的 IP 位址
  • GKE 叢集 IP 位址範圍
  • 已加入許可清單的內部 IP 位址。

您也可以透過授權網路,設定內部 IP 位址可連線至控制層內部端點的區域。您可以選擇只允許從叢集的虛擬私有雲網路存取,或是從虛擬私有雲或地端部署環境的任何 Google Cloud 區域存取。

使用以 IP 為準端點的限制

  • 如果您擴充子網路,而該子網路是由具有授權網路的叢集使用,則必須更新授權網路設定,納入擴充的 IP 位址範圍。
  • 如果用戶端是透過動態 IP 位址的網路連線 (例如員工的家用網路),您必須經常更新授權網路清單,才能維持叢集存取權。
  • 如果停用控制層外部端點的存取權,就無法從遠端與叢集互動。如要遠端存取叢集,必須使用堡壘主機,將用戶端流量轉送至叢集。相較之下,使用 DNS 端點只需設定 IAM 權限。
  • IP 端點不會直接與 VPC Service Controls 整合。VPC Service Controls 會在服務範圍層級運作,控管 Google Cloud內的資料存取和移動。建議您同時使用 DNS 型端點和 VPC Service Controls,以獲得強大的安全防禦機制。
  • 最多可以指定 100 個授權 IP 位址範圍 (包括外部和內部 IP 位址)。

控制層連線的傳輸安全

使用用戶端程式庫或 kubectl CLI 等方法,將要求傳送至叢集中的 Kubernetes API 伺服器時,用戶端與伺服器之間的連線會受到 TLS 保護。

如要建立 TLS 連線,伺服器會向用戶端出示憑證。提供憑證的特定伺服器,以及簽署憑證的憑證授權單位 (CA),取決於您用來存取控制層的端點,如下所示:

  • 以 DNS 為基礎的端點:代管以 DNS 為基礎的端點的 Google Front End (GFE) 服務會提供憑證。憑證由公開、普遍認可的 Google CA 簽署。用戶端可以使用公開 CA 資訊驗證憑證。
  • 以 IP 為基礎的端點:Kubernetes API 伺服器會提供憑證。 憑證是由叢集根 CA 簽署。如要驗證 API 伺服器憑證,用戶端必須使用叢集根 CA 的公開憑證。在無法存取 gcloud CLI 的環境中設定用戶端時,您必須將叢集的根 CA 憑證新增至 ~/.kube/config 檔案。詳情請參閱「向 Kubernetes API 伺服器進行驗證」。

從 API 伺服器存取外部來源

GKE 叢集控制層會執行 Kubernetes 控制層元件,例如 API 伺服器、排程器和控制器。控制層會在受管理專案中,由 GKE 擁有的 Compute Engine VM 執行個體上執行。區域叢集和 Autopilot 叢集有多個控制層副本,每個副本都會在自己的 VM 執行個體上執行。

根據預設,每個 Compute Engine VM 執行個體都有直接指派給 VM 的外部 IP 位址。這個 IP 位址只會用於從執行個體上的 Kubernetes API 伺服器,將傳送至許可控制器的要求傳送至叢集外部執行的准入 Webhook 伺服器,例如在其他雲端服務或地端部署。只有在准入 Webhook 使用伺服器網址或伺服器 IP 位址,直接與 Webhook 伺服器聯絡時,才會使用這個 IP 位址。

如要提升控制層的資安態勢,可以停用控制層 VM 執行個體的外部 IP 位址。如果發生安全漏洞,潛在攻擊者就無法使用這些外部 IP 位址進行通訊。您可以透過下列方式自訂 API 伺服器的輸出流量:

  • 沒有輸出流量 (NONE):停用每個控制層執行個體的外部 IP 位址,並將 Routes API 伺服器輸出流量轉送至黑洞。從 API 伺服器傳送至外部目的地的所有非關鍵輸出流量都會遭到封鎖,包括傳送至叢集外部 Google Cloud 服務的流量。這項選項不會影響重要系統流量或節點流量。
  • 所有輸出流量 (VIA_CONTROL_PLANE):保留每個控制層執行個體的外部 IP 位址,並允許 API 伺服器將該 IP 位址用於輸出流量。這是 GKE 的預設選項。

如要瞭解如何針對其中一個選項自訂叢集,請參閱「限制 API 伺服器的輸出流量」。

外部 Webhook 設定

將控制層輸出限制設為 NONE 時,API 伺服器無法直接呼叫外部 IP 位址或完整網域名稱 (FQDN)。NONE 設定對外部 Webhook 的影響如下:

  • 在 1.35.1-gke.1396000 以上版本中,GKE 會禁止建立或更新使用 clientConfig.url 欄位的 ValidatingWebhookConfiguration 或 MutatingWebhookConfiguration。
  • 使用 clientConfig.url 欄位與外部伺服器聯絡的現有 Webhook 設定會停止運作。

如要建立及使用外部 Webhook 伺服器,請完成下列步驟:

  1. 請更新 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations,改用 clientConfig.service 欄位。API 伺服器可透過這個欄位,將要求傳送至叢集中的服務端點,例如 my-webhook.default.svc。由於流量位於叢集內,因此這些要求不會遭到封鎖。詳情請參閱「服務參考資料」。
  2. 設定 Service,將流量轉送至外部 Webhook 伺服器。視安全性和作業需求而定,您可以使用下列其中一種流量路徑設計:

    • Proxy Pod:將 Deployment 或 StatefulSet 做為 Service 的後端。設定 Pod 做為 Proxy,將傳入的許可要求重新導向至外部 Webhook 伺服器。這個設計可讓您執行額外工作,例如檢查及修改入學申請。
    • EndpointSlices:建立不含選擇器的 Service,然後手動新增 EndpointSlice,將 Service 對應至外部 Webhook 伺服器的 IP 位址。這個設計會轉送流量,但不會修改要求。

設計 Webhook 設定時,請考量下列因素:

  • 驗證和憑證:請考量如何向外部 Webhook 伺服器驗證。您的流量路徑工作流程也必須管理如何將憑證 (例如 API 金鑰、mTLS 憑證和 OAuth 權杖) 套用至連線。
  • 安全性和網路控制:請考量路由設計的攻擊面,以及安全性和稽核選項。您實作的設計會影響可套用至流量的限制。舉例來說,您可以將 NetworkPolicies 與 Proxy Pod 搭配使用。
  • 可觀測性和可靠性:請考慮如何監控連線。 舉例來說,您可以設定 Proxy Pod 發出指標,或是為 EndpointSlice 實作網路可觀測性。

從外部來源存取節點

本節將討論如何隔離 Kubernetes 叢集內的節點。

啟用私人節點

僅為節點佈建內部 IP 位址,將節點設為私人,防止外部用戶端存取節點。如果節點沒有外部 IP 位址,且叢集網路未啟用 NAT,在節點上執行的工作負載就無法連上網際網路。你隨時可以變更這些設定。

您可以在個別叢集層級、節點集區 (Standard) 或工作負載 (Autopilot) 層級啟用私人節點。在節點集區或工作負載層級啟用私人節點,會覆寫叢集層級的所有節點設定。

如果將公開節點集區更新為私人模式,在下列情況下,需要存取叢集網路外部的工作負載可能會失敗:

  • Shared VPC 虛擬私有雲網路中未啟用 Private Google Access 的叢集。手動啟用 Private Google Access,確保 GKE 下載指派的節點映像檔。如果叢集不在 Shared VPC 網路中,GKE 會自動啟用 Private Google Access。

  • 需要存取網際網路,但未啟用 Cloud NAT 或未定義自訂 NAT 解決方案的工作負載。如要允許輸出流量連線至網際網路,請啟用 Cloud NAT 或自訂 NAT 解決方案。

無論是否啟用私人節點,控制層都只會透過內部 IP 位址與各節點通訊。

網路隔離的好處

網路隔離的優點如下:

  • 彈性:

    • 叢集具有統一且彈性的設定。無論叢集是否具備外部端點,都採用相同的架構,並支援相同的功能。您可以根據需求,採用控管機制和最佳做法,確保存取安全。叢集中的節點與控制層之間的所有通訊都會使用內部 IP 位址。
    • 您隨時可以變更控制層存取權和叢集節點設定,不必重新建立叢集。
    • 如果您需要從任何具備網路連線能力的位置,或從未直接連線至虛擬私有雲的網路或裝置管理叢集,可以選擇啟用控制層的外部端點。如果需要維護機密工作負載的網路區隔,也可以停用外部端點,以提升安全性。無論是哪種情況,您都可以使用授權網路,限制對信任 IP 範圍的存取權。
  • 安全性:

    • 採用 VPC Service Controls 的 DNS 端點提供多層式安全防護模型,可防止未經授權的網路和身分存取控制層。VPC Service Controls 與 Cloud 稽核記錄整合,可監控控制層的存取權。
    • 私人節點和在這些節點上執行的工作負載,無法直接從公開網際網路存取,因此可大幅降低叢集遭受外部攻擊的可能性。
    • 您可以封鎖Google Cloud 外部 IP 位址或外部 IP 位址的控制層存取權,完全隔離叢集控制層,並降低潛在安全威脅的風險。
    • 您可以停用控制層 VM 執行個體的外部 IP 位址,防止攻擊者使用這些 IP 位址。
  • 法規遵循:如果您所屬的產業對資料存取和儲存設有嚴格規定,私人節點可確保機密資料留在私人網路中,協助您遵守法規。

  • 控管:私有節點可讓您精細控管叢集流量的進出方式。您可以設定防火牆規則和網路政策,只允許授權通訊。如果您在多雲端環境中運作,私有節點可協助您在不同環境之間建立安全且受控的通訊。

  • 費用:啟用私人節點後,不需要外部 IP 位址即可存取網際網路上公開服務的節點,費用就會降低。

後續步驟