本頁面說明如何使用使用者管理的加密金鑰,加密 Google Kubernetes Engine (GKE) 節點間 Pod 通訊的傳輸中資料。如果您屬於受管制的產業,並有法規遵循和安全性稽核的業務需求,控管加密金鑰會相當方便。本頁說明如何為單一和多叢集環境設定,包括最佳做法和限制。
本頁適用於需要精細控管加密金鑰,以符合法規遵循和安全防護要求的安全專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和範例工作,請參閱常見的 GKE Enterprise 使用者角色和工作。
閱讀本頁面之前,請先熟悉下列概念:
- 傳輸中的資料。
- WireGuard,GKE 會使用這項技術在 GKE Dataplane V2 中執行加密作業,此外也會使用 VM NIC 提供的預設加密機制。
根據預設,Google 會在網路介面控制器 (NIC) 層級加密 VM 之間傳輸的所有資料,確保傳輸中資料的機密性,無論 VM 上執行的服務或應用程式為何 (包括 GKE)。這層加密機制適用於所有 GKE 節點和 Pod 流量。加密金鑰由 Google 提供及管理。
您可以在單一和多叢集環境中啟用節點間透明加密功能。如要進一步瞭解這項功能的運作方式,請參閱「節點間透明加密功能在 GKE 中的運作方式」。
限制
這項功能本身無法保證 Google 無法存取 GKE 節點記憶體中儲存的加密金鑰。在某些受監管的環境或管轄區,或為符合特定法規遵循規定,您可能需要進一步加密這些金鑰並控管存取權。為此,我們建議您搭配使用節點間透明加密功能,以及 機密 GKE 節點,並使用客戶管理的加密金鑰 (CMEK)。使用 CMEK 的機密 GKE 節點會以您管理的金鑰,加密節點的記憶體內容。
GKE 節點間透明加密功能僅支援 GKE Dataplane V2 叢集。
不支援 GKE Autopilot。
GKE 的節點間透明加密功能使用 WireGuard。WireGuard 不符合 FIPS 規範。
加密金鑰不會動態輪替。如要輪替金鑰,必須手動重新啟動節點。
節點間透明加密功能和機密 GKE 節點只能在 Container-Optimized OS (COS) 和 Ubuntu 上運作,無法在 Windows 上運作。
節點間透明加密功能不會加密 GKE 節點或 Pod 使用
hostNetwork
啟動的網路流量。節點間透明加密功能不會加密傳送至節點通訊埠上公開 Pod 的網路流量。即使在 Service 上設定
ExternalTrafficPolicy: Cluster
,從接收用戶端流量的第一個節點轉送至後端 Pod 的流量也不會加密。如果為單一叢集或多叢集設定啟用節點間透明加密功能,最多可支援 500 個節點。
節點間透明加密功能可能會導致節點超額訂閱。在 Ubuntu OS 的 n2-standard-8 節點上,如果處理量為 2 Gbps,CPU 平均可能會增加 15%。
CPU 使用率增加並非歸因於任何 Pod,因為 kube-scheduler 不會察覺到這種情況。流量增加的 Pod 可能會使用節點上的所有 CPU 資源。即使其他 Pod 設定正確,也可能因此無法取得所需的 CPU 資源。這可能會導致 Pod 無法執行機密工作負載,或無法快速回應要求。做為因應措施,您可以在啟用節點間透明加密功能的節點上,保留大量未排程的 CPU。或者,您也可以排定 Pod,並使用 CPU 要求量大但從未使用 CPU 的低 PriorityClass。
如果兩個節點位於同一區域,且未使用機密 GKE 節點,節點間透明加密功能會造成 150 微秒的延遲。
啟用節點間透明加密後,用於追蹤 Pod 流量的流量可觀測性功能可能無法正常運作,因為傳輸中的資料會使用基礎 Google 基礎架構無法存取的金鑰加密。
啟用節點間透明加密功能後,Pod IP 位址不會顯示在 VPC 中。依賴封包檢查的功能 (例如封包鏡像和以 Pod CIDR 為基礎的 VPC 防火牆規則) 與節點間透明加密功能不相容。
在連結至不同 VPC 子網路的叢集之間啟用節點間透明加密時,您需要手動建立防火牆規則,允許叢集節點之間的通訊。
節點間透明加密功能會停用 GKE Dataplane V2 的部分第 7 層功能。因此,您無法同時啟用 FQDN 網路政策和節點間透明加密功能。
您無法同時啟用這項功能和節點內瀏覽權限。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
按照操作說明啟用 GKE Enterprise。
只有 Google Cloud CLI 458.0.0 以上版本和下列 GKE 版本,才支援 GKE 節點間透明加密:
- 1.26.10-gke.1024000 以上版本
- 1.27.7-gke.1506000 以上版本
- 1.28.2-gke.1098000 以上版本
透過 GKE 啟用節點間透明加密功能
您可以在單一叢集或多叢集環境中,透過 GKE 啟用節點間透明加密功能。
在新叢集上啟用
如要在新叢集上啟用節點間透明加密功能,請按照下列步驟操作:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-datapane-v2 \ --in-transit-encryption inter-node-transparent
更改下列內容:
CLUSTER_NAME
改為叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
如要驗證設定,請使用下列指令檢查加密狀態:
kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
輸出結果會與下列內容相似:
Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 2)]
在現有叢集上啟用
如要在現有叢集上啟用節點間透明加密功能,請按照下列步驟操作:
gcloud container clusters update CLUSTER_NAME \ --in-transit-encryption inter-node-transparent \ --location=CONTROL_PLANE_LOCATION
更改下列內容:
CLUSTER_NAME
改為叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
如要確認 Google Cloud CLI 指令是否順利完成,請執行下列操作:
gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format json | jq .status
更改下列內容:
CLUSTER_NAME
改為叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
等待狀態顯示為「RUNNING」。在 GKE 中啟用節點間加密功能後,節點會自動重新啟動。節點可能要過幾小時才會重新啟動,新節點才會開始強制執行政策。
如要確認節點是否已重新啟動,請執行下列步驟:
kubectl get nodes
檢查每個節點的
AGE
欄位,如果AGE
欄位反映新節點,請繼續操作。如要驗證設定,可以使用下列指令檢查加密狀態:
kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
輸出結果會與下列內容相似:
Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 2)]
確認對等互連的數量比叢集中的節點數量少一。舉例來說,在有 24 個節點的叢集中,對等互連節點的數量應為 23 個。如果同層級節點數量並未比叢集中的節點數量少一,請再次重新啟動節點上的
anetd
代理程式。
跨多個叢集啟用
Autopilot 叢集不支援節點間透明加密功能。如果車隊包含 Autopilot 叢集,這些叢集就無法與啟用加密功能的 Standard 叢集通訊。
如要在多叢集環境中啟用節點間透明加密功能,請按照下列步驟操作:
將叢集註冊至機群。
為車隊啟用節點間透明加密功能:
gcloud container fleet dataplane-v2-encryption enable --project PROJECT_ID
將
PROJECT_ID
替換為您的專案 ID。驗證所有節點的狀態:
kubectl -n kube-system get pods -l k8s-app=cilium -o name | xargs -I {} kubectl -n kube-system exec -ti {} -- cilium status
輸出結果會與下列內容相似:
... Encryption: Wireguard [cilium_wg0 (Pubkey: <key>, Port: 51871, Peers: 5)] ...
停用節點間透明加密功能
在某些情況下,您可能會想在 GKE 叢集中停用節點間透明加密功能,以提升效能或排解應用程式的連線問題。繼續執行這項作業前,請先考量下列事項:
系統會為整個叢集啟用節點間的透明加密功能,您無法在個別 Kubernetes 資源 (例如命名空間或 Pod) 中部分停用這項功能。
請在維護期間執行這項作業,因為這項作業會中斷 Pod 的流量。
停用單一叢集
如要停用單一叢集的節點間透明加密功能,請按照下列步驟操作:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--in-transit-encryption none
更改下列內容:
CLUSTER_NAME
:叢集名稱。CONTROL_PLANE_LOCATION
:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
在機群中的叢集停用
如要為機群中的叢集關閉加密功能,請使用下列任一選項:
如要從機群中徹底移除叢集,請取消註冊叢集。
或者,將叢集保留在機群中,但停用加密功能:
gcloud container fleet dataplane-v2-encryption disable --project PROJECT_ID
將
PROJECT_ID
替換為您的專案 ID。使用這個指令停用加密功能後,系統會從每個叢集的 Wireguard 對等互連節點清單中移除遠端節點。視涉及的叢集和節點數量而定,這個程序可能需要幾分鐘才能完成。如要查看更新的對等互連數,請在每個叢集上手動重新整理 WireGuard 對等互連清單。您可以使用叢集管理工具或下列指令:
kubectl -n kube-system exec -ti anetd-XXXX -- cilium status | grep Encryption
為整個叢集機群停用
如要在車隊中停用節點間透明加密功能,請按照下列步驟操作:
gcloud container fleet dataplane-v2-encryption disable --project PROJECT_ID
將
PROJECT_ID
替換為您的專案 ID。如要停用節點間透明加密功能並移除不再使用的 API,請在 Fleet 層級停用 GKE Dataplane V2 API。這麼做會關閉機群中執行的 GKE Dataplane V2 控制器。
gcloud services disable gkedataplanev2.googleapis.com \ --project=PROJECT_ID
將
PROJECT_ID
替換為您的專案 ID。如要有效管理同名叢集,並確保啟用多叢集加密功能,請按照下列步驟操作:
如果未按照這些步驟操作,可能要重新建立機群成員資格,多叢集加密功能才會在新叢集上啟用。
節點間透明加密功能在 GKE 的運作方式
下列各節說明在叢集中啟用節點間透明加密功能時,這項功能如何運作:
加密不同節點上兩個 Pod 之間的網路流量
啟用節點間透明加密功能後,如果 Pod 位於不同節點,GKE Dataplane V2 會加密 Pod 對 Pod 的流量,不論這些節點屬於哪個叢集。如果叢集屬於同一個車隊,就會屬於同一個加密網域。
具有不同節點間透明加密設定的叢集可以共存在同一個機群中。如果您有多叢集環境,且只有部分叢集使用節點間透明加密機制,請注意下列事項:
同一個叢集中節點之間的 Pod 對 Pod 通訊會使用公開/私密金鑰組加密。
如果叢集中的節點啟用節點間透明加密功能,而叢集中的另一個節點未啟用這項功能,則節點間的 Pod 對 Pod 通訊會失敗。
加密金鑰的產生和使用方式
啟用這項功能後,叢集中的每個 GKE 節點都會自動產生公開/私密金鑰組,也就是加密金鑰。
私密金鑰會儲存在記憶體 (而非磁碟) 中,且絕不會離開節點。使用 GKE 機密節點可進一步降低金鑰遭盜用的風險,因為節點記憶體也會經過加密 (使用不同金鑰)。
公開金鑰會透過 GKE Dataplane V2 控制平面與其他節點共用,且相同加密網域中的所有節點都能存取。
交換金鑰後,每個節點都能與相同加密網域中的其他節點建立 WireGuard 通道。每個通道都是一組節點專屬的通道。
處理私密或公開金鑰組和工作階段金鑰時,請注意下列事項:
私密/公開金鑰組:
公開金鑰會分配到叢集,叢集中的所有節點都能存取公開金鑰。
節點重新啟動時,金鑰配對會輪替。GKE 不會定期輪替金鑰。如要手動觸發金鑰輪替,請排空並重新啟動節點。這會使原始金鑰組失效,並產生新的金鑰組。
工作階段金鑰:
這組金鑰無法設定。
這個金鑰每兩分鐘就會定期輪替。
工作階段金鑰僅供通道中的節點使用。