您可以自訂 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 名稱會解析為可從 Cloud de Confiance by S3NS API 存取的任何網路端點,包括地端部署或其他雲端網路。啟用以 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 會與支援的 Cloud de Confiance 服務整合。可讓叢集的安全設定與您在其他 Cloud de Confiance 服務中代管的資料保持一致。
Private Service Connect 或 Cloud NAT:從沒有公開網際網路存取權的用戶端存取以 DNS 為基礎的端點。根據預設,您可以透過公開網際網路上的 API 存取 DNS 型端點。 Cloud de Confiance詳情請參閱「自訂網路區隔」頁面的「以 DNS 為基礎的端點」。
Kubernetes 驗證憑證:使用 Kubernetes ServiceAccount 持有者權杖或 X.509 用戶端憑證,向以 DNS 為基礎的端點進行驗證。GKE 叢集預設會停用這些驗證方法。設定叢集的 DNS 型端點時,可以啟用這些方法。
以 IP 為準的端點
您也可以選擇使用以 IP 為基礎的端點,設定控制層的存取權。
與叢集和 IP 位址相關的術語
Cloud de Confiance by S3NS 外部 IP 位址:
Cloud de ConfianceCloud de Confiance 擁有指派給任何 VM 的外部 IP 位址,這些 VM 供託管在Cloud de ConfianceCloud de Confiance 上的任何客戶使用。詳情請參閱「哪裡可以找到 Compute Engine IP 範圍?」一節。
Cloud de Confiance 產品 (例如 Cloud Run 或 Cloud Run functions) 使用的外部 IP 位址。任何託管在 Cloud de Confiance 上的用戶端都可以例項化這些 IP 位址。 Cloud de Confiance 擁有這些 IP 位址。
Google 保留的 IP 位址:用於管理 GKE 叢集的外部 IP 位址。這些 IP 位址包括 GKE 管理的程序和其他 Google 生產服務。這些 IP 位址屬於 Google。
GKE 叢集 IP 位址範圍:指派給叢集的內部 IP 位址,GKE 會將這些位址用於叢集的節點、Pod 和服務。
內部 IP 位址:叢集虛擬私有雲網路的 IP 位址。這些 IP 位址可以包括您的叢集 IP 位址、地端部署網路、RFC 1918 範圍,或包含非 RFC 1918 範圍的私人使用公開 IP (PUPI) 位址。
以外部 IP 為基礎的叢集端點:GKE 指派給控制層的外部端點 IP 位址。
外部控制層 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 位址 |
|---|---|---|
| 已啟用外部和內部端點 |
|
|
| 僅啟用內部端點 |
|
|
您也可以透過授權網路設定區域,讓內部 IP 位址可連線至控制層的內部端點。您可以選擇只允許從叢集的虛擬私有雲網路存取,或是從虛擬私有雲或地端部署環境中的任何 Cloud de Confiance 區域存取。
使用 IP 型端點的限制
- 如果擴充子網路,而該子網路是由具有授權網路的叢集使用,則必須更新授權網路設定,納入擴充的 IP 位址範圍。
- 如果用戶端是透過動態 IP 位址的網路連線 (例如員工的家用網路),您必須經常更新授權網路清單,才能維持叢集存取權。
- 停用控制層外部端點的存取權後,您就無法遠端與叢集互動。如要遠端存取叢集,必須使用堡壘主機,將用戶端流量轉送至叢集。相較之下,使用 DNS 型端點只需要設定 IAM 權限。
- 以 IP 為基礎的端點不會直接與 VPC Service Controls 整合。VPC Service Controls 會在服務範圍層級運作,控管 Cloud de Confiance內的資料存取和移動。建議您同時使用 DNS 型端點和 VPC Service Controls,以獲得強大的安全防禦機制。
- 最多可以指定 100 個授權 IP 位址範圍 (包括外部和內部 IP 位址)。
從 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 位址,並將 API 伺服器輸出流量路徑設為黑洞。API 伺服器傳送至外部目的地的所有非重要輸出流量都會遭到封鎖,包括傳送至叢集外部 Cloud de Confiance 服務 Cloud de Confiance 的流量。這個選項不會影響重要系統流量或節點流量。 - 所有輸出流量 (
VIA_CONTROL_PLANE):保留每個控制層執行個體的外部 IP 位址,並允許 API 伺服器將該 IP 位址用於輸出流量。這是 GKE 的預設選項。
如要瞭解如何為其中一個選項自訂叢集,請參閱「限制 API 伺服器的輸出流量」。
外部 Webhook 設定
將控制層輸出限制設為 NONE 時,API 伺服器無法直接呼叫外部 IP 位址或完整網域名稱 (FQDN)。NONE 設定對外部 Webhook 的影響如下:
- 在 1.35.1-gke.1396000 以上版本中,GKE 會禁止建立或更新使用
clientConfig.url欄位的 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations。 - 使用
clientConfig.url欄位聯絡外部伺服器的現有 Webhook 設定會停止運作。
如要建立及使用外部 Webhook 伺服器,請完成下列步驟:
- 更新 ValidatingWebhookConfigurations 或 MutatingWebhookConfigurations,使用
clientConfig.service欄位。這個欄位可讓 API 伺服器將要求傳送至叢集中的服務端點,例如my-webhook.default.svc。由於流量位於叢集內,因此不會遭到封鎖。詳情請參閱服務參考資料。 設定 Service,將流量轉送至外部 Webhook 伺服器。您可以根據安全性和作業需求,使用下列其中一種流量路徑設計:
- Proxy Pod:使用 Deployment 或 StatefulSet 做為 Service 的後端。將 Pod 設定為 Proxy,將傳入的許可要求重新導向至外部 Webhook 伺服器。這個設計可讓您執行額外工作,例如檢查及修改入學申請。
- EndpointSlices:建立不含選擇器的 Service,然後手動新增 EndpointSlice,將 Service 對應至外部 webhook 伺服器的 IP 位址。這個設計會轉送流量,但不會修改要求。
設計 Webhook 設定時,請考量下列因素:
- 驗證和憑證:請考慮如何向外部 Webhook 伺服器進行驗證。您的流量路徑工作流程也必須管理如何將憑證 (例如 API 金鑰、mTLS 憑證和 OAuth 權杖) 套用至連線。
- 安全性和網路控制:請考量路由設計的攻擊面,以及安全性和稽核選項。您實作的設計會影響可套用至流量的限制。舉例來說,您可以搭配 Proxy Pod 使用 NetworkPolicies。
- 可觀測性和可靠性:請考慮如何監控連線。舉例來說,您可以設定 Proxy Pod 發出指標,或為 EndpointSlice 實作網路可觀測性。
從外部來源存取節點
本節將探討如何隔離 Kubernetes 叢集內的節點。
啟用私人節點
只透過內部 IP 位址佈建節點,讓節點成為私人節點,防止外部用戶端存取節點。如果節點沒有外部 IP 位址,且叢集網路未啟用 NAT,在節點上執行的工作負載就無法連上網際網路。你隨時可以變更這些設定。
您可以在個別叢集層級,或節點集區 (適用於 Standard) 或工作負載 (適用於 Autopilot) 層級啟用私人節點。在節點集區或工作負載層級啟用私有節點,會覆寫叢集層級的任何節點設定。
如果將公開節點集區更新為私人模式,在下列情況下,需要存取叢集網路外部的工作負載可能會失敗:
未啟用 Private Google Access 的 Shared VPC 網路中的叢集。手動啟用 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 稽核記錄整合,監控控制層的存取權。
- 私人節點和在這些節點上執行的工作負載,無法直接從公開網際網路存取,因此可大幅降低叢集遭受外部攻擊的可能性。
- 您可以封鎖Cloud de Confiance 外部 IP 位址或外部 IP 位址的控制層存取權,完全隔離叢集控制層,減少潛在安全威脅。
- 您可以停用控制層 VM 執行個體的外部 IP 位址,防止攻擊者使用這些 IP 位址。
法規遵循:如果您所屬的產業對資料存取和儲存有嚴格規定,私人節點可確保機密資料留在私人網路中,協助您遵守法規。
控管:私人節點可讓您精細控管叢集內外的流量流動方式。您可以設定防火牆規則和網路政策,只允許授權通訊。如果您在多雲端環境中運作,私人節點可協助您在不同環境之間建立安全且受控的通訊。
費用:啟用私人節點後,不需要外部 IP 位址就能存取網際網路上公開服務的節點,可降低費用。
後續步驟
- 按照「設定網路隔離」一文中的操作說明,試用網路隔離功能。
- 瞭解如何限制 API 伺服器的輸出流量。
- 進一步瞭解 Private Service Connect。
- 閱讀叢集架構總覽。
- 瞭解網路最佳做法。