本頁面說明如何使用使用者管理的加密金鑰,加密 Google Kubernetes Engine (GKE) 節點間 Pod 通訊的傳輸中資料。如果您屬於受管制的產業,並有法規遵循和安全性稽核的業務需求,這種加密金鑰控管機制會相當方便。本頁說明如何為單一和多叢集環境設定,包括最佳做法和限制。
本頁適用於需要精細控管加密金鑰,以符合法規遵循和安全防護要求的安全專家。如要進一步瞭解我們在內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud
閱讀本頁面之前,請務必先熟悉下列概念:
根據預設,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 節點或 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指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 只有 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,請在艦隊層級停用 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 不會定期輪替金鑰。如要手動觸發金鑰輪替,請排空並重新啟動節點。這會使原始金鑰組失效,並產生新的金鑰組。 
 
- 工作階段金鑰: - 這組金鑰無法設定。 
- 這個金鑰每兩分鐘就會定期輪替。 
- 工作階段金鑰僅供通道中的節點使用。