本頁面說明如何使用使用者自行管理的加密金鑰,為 Google Kubernetes Engine (GKE) 節點間的 Pod 通訊加密傳輸中資料。如果貴機構屬於受管制的產業,並有法規遵循和安全性稽核的業務需求,這種加密金鑰控管機制會相當方便。本頁面說明如何設定單一和多叢集環境,包括最佳做法和限制。
本頁面適用於需要精細控管加密金鑰,以符合法規遵循和安全性要求的資安專家。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。
閱讀本頁面前,請先熟悉下列概念:
根據預設,Google 會在網路介面控制器 (NIC) 層級加密 VM 之間傳輸的所有資料,確保傳輸中的資料機密性,無論 VM (包括 GKE) 上執行的服務或應用程式為何。這層加密機制適用於所有 GKE 節點和 Pod 流量。加密金鑰由 Google 提供及管理。
您可以在單一和多叢集環境中啟用節點間透明加密功能。如要進一步瞭解這項功能的運作方式,請參閱「節點間透明加密功能如何與 GKE 搭配運作」。
限制
這項功能本身無法保證 Google 無法存取儲存在 GKE 節點記憶體中的加密金鑰。在某些受監管的環境或司法管轄區,或為了符合特定法規遵循要求,您可能需要進一步加密這些金鑰並控管存取權。建議您搭配使用機密 GKE 節點和節點間透明加密功能。
GKE 的節點間透明加密功能僅適用於 GKE Dataplane V2 叢集。
不支援 GKE Autopilot。
GKE 的節點間透明加密功能使用 WireGuard。WireGuard 不符合 FIPS 規範。
加密金鑰不會動態輪替。金鑰輪替必須透過重新啟動節點來手動處理。
節點間透明加密功能和機密 GKE 節點僅適用於 Container-Optimized OS (COS) 和 Ubuntu,不適用於 Windows。
節點間透明加密功能不會加密由 GKE 節點或使用
hostNetwork的 Pod 發起的網路流量。節點間透明加密功能不會加密傳送至節點通訊埠上公開 Pod 的網路流量。即使 Service 已設定
ExternalTrafficPolicy: Cluster,從第一個節點 (接收來自用戶端的流量) 轉送至後端 Pod 的流量也不會加密。在單一叢集或多叢集設定中,啟用節點間透明加密功能時,最多可支援 500 個節點。
節點間透明加密功能可能會導致節點超額訂閱。在搭載 Ubuntu OS 且處理量為 2 Gbps 的 n2-standard-8 節點上,CPU 使用率平均會增加 15%。
CPU 使用率增加並非由任何 Pod 造成,因為 kube-scheduler 不知道這個 Pod。流量增加的 Pod 可能會使用節點上的所有 CPU 資源。這可能會導致其他 Pod 無法取得所需的 CPU 資源,即使這些 Pod 已正確設定也一樣。如果 Pod 嘗試執行機密工作負載,或需要快速回應要求,就可能發生問題。如要解決這個問題,請在啟用節點間透明加密功能的節點上,保留大量未排定的 CPU。或者,您也可以排定 PriorityClass 較低、CPU 要求較大但從未使用該 CPU 的 Pod。
在同一可用區中,如果兩個節點未使用機密 GKE 節點,節點間透明加密會產生 150 微秒的延遲。
啟用節點間透明加密功能後,用於追蹤 Pod 流量的流量觀測能力可能無法正常運作,因為傳輸中的資料是以基礎 Google 基礎架構無法存取的金鑰加密。
啟用節點間透明加密功能後,Pod IP 位址就不會顯示在虛擬私有雲上。Packet Mirroring 和以 Pod CIDR 為基礎的虛擬私有雲防火牆規則等功能,都仰賴封包檢查,因此與節點間透明加密功能不相容。
如果叢集連結至不同的虛擬私有雲子網路,在這些叢集啟用節點間透明加密功能時,您必須手動建立防火牆規則,允許叢集節點之間通訊。
節點間透明加密功能會關閉 GKE Dataplane V2 的部分第 7 層功能。因此,您無法同時啟用 FQDN 網路政策和節點間透明加密功能。
您無法同時啟用這項功能和節點內流量可見度。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
啟用 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,請在機群層級停用 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 不會定期輪替金鑰。如要手動觸發金鑰輪替,請排空並重新啟動節點。這會使原始金鑰組失效,並產生新的金鑰組。
工作階段金鑰:
無法設定這個金鑰。
這組金鑰每兩分鐘會定期輪替。
工作階段金鑰僅供通道中的節點使用。