叢集信任

本文說明 Google Kubernetes Engine (GKE) 叢集的信任模型,包括叢集內部的通訊,以及如何驗證控制層等元件的要求。本文假設您已瞭解下列事項:

本文適用於想瞭解 GKE 叢集信任模型的資安專員。如要進一步瞭解 Google Cloud 內容中提及的常見角色和工作範例,請參閱「常見的 GKE 使用者角色和工作」。

叢集內通訊

GKE 會對叢集元件之間的流量套用各種安全機制,如下所示:

  • 控制層與節點之間的流量:控制層會與節點通訊,以便管理容器。當控制層向節點傳送要求 (例如 kubectl logs) 時,要求會透過 Konnectivity Proxy 通道傳送。控制層傳送的要求會經過驗證,並受到 TLS 保護。當節點向控制層傳送要求時 (例如從 kubelet 傳送至 API 伺服器),系統會使用相互傳輸層安全性 (mTLS) 驗證及加密該要求。

    所有新建立和更新的叢集,都會使用 TLS 1.3 進行控制層與節點之間的通訊。控制層與節點通訊時,支援的最低版本為 TLS 1.2。

  • 節點之間的流量:節點是 Compute Engine VM。 Google Cloud 正式環境網路中節點之間的連線會經過驗證和加密。詳情請參閱傳輸中資料加密白皮書的「VM 對 VM」一節。

  • Pod 之間的流量:當 Pod 向另一個 Pod 傳送要求時,系統預設不會驗證該流量。GKE 會在網路層加密不同節點上 Pod 之間的流量。根據預設,相同節點上 Pod 之間的流量不會加密。如要進一步瞭解網路層加密,請參閱「Google Cloud 虛擬網路加密和驗證」。

    您可以使用 NetworkPolicy 限制 Pod 對 Pod 流量,並使用 Cloud Service Mesh 等服務網格或其他應用程式層加密方法,加密所有 Pod 對 Pod 流量,包括同一節點上的流量。

  • 控制層元件之間的流量:在控制層上執行的各種元件之間的流量,會使用 TLS 進行驗證和加密。流量一律不會離開受防火牆保護的 Google 網路。

信任根

GKE 的設定如下:

  • 叢集根憑證授權單位 (CA) 用於驗證 API 伺服器和 kubelet 的用戶端憑證。也就是說,控制層和節點具有相同的信任根。叢集節點集區中的任何 kubelet 都可以使用 certificates.k8s.io API,透過提交憑證簽署要求,向這個 CA 要求憑證。根 CA 的生命週期有限,詳情請參閱「叢集根 CA 生命週期」一節。
  • 在控制層 VM 上執行 etcd 資料庫執行個體的叢集中,會使用個別的叢集 etcd 對等互連 CA,在 etcd 執行個體之間建立信任關係。
  • 在所有 GKE 叢集中,系統會使用獨立的 etcd API CA,在 Kubernetes API 伺服器和 etcd API 之間建立信任關係。

API 伺服器和 kubelet

API 伺服器和 kubelet 仰賴叢集根 CA 建立信任關係。在 GKE 中,控制層 API 憑證是由叢集根 CA 簽署。每個叢集都會執行自己的 CA,因此如果某個叢集的 CA 遭到入侵,其他叢集的 CA 也不會受到影響。

內部服務會管理這個 CA 的根金鑰,這些金鑰無法匯出。這項服務接受憑證簽署要求,包括來自各個 GKE 叢集中 kubelet 的要求。即使叢集中的 API 伺服器遭到入侵,CA 也不會受到影響,因此其他叢集不會受到影響。

叢集中的每個節點在建立時都會插入共用密鑰,可用於向叢集根 CA 提交憑證簽署要求,並取得 kubelet 用戶端憑證。接著,kubelet 會使用這些憑證驗證其對 API 伺服器的要求。除非您啟用Shielded GKE 節點或 Workload Identity Federation for GKE,否則節點上的 Pod 可以存取這個共用密鑰。

叢集根 CA 效期

叢集根 CA 的生命週期有限,過期後,由過期 CA 簽署的任何憑證都會失效。請按照「檢查憑證生命週期」中的操作說明,查看叢集 CA 的大致到期日。

請在現有根 CA 到期前,手動輪替憑證。如果 CA 到期,而您未輪替憑證,叢集可能會進入無法復原的狀態。GKE 採用下列機制,盡可能避免叢集無法復原:

  • 叢集會在 CA 到期前七天進入DEGRADED狀態
  • GKE 會在 CA 到期前 30 天嘗試自動輪替憑證。這項自動輪替作業會忽略維護期間,且 GKE 會重新建立節點來使用新憑證,因此可能會造成服務中斷。外部用戶端 (例如本機環境中的 kubectl) 必須更新為使用新憑證,才能正常運作。

如要瞭解如何執行輪替,請參閱「輪替叢集憑證」。

叢集狀態儲存空間

GKE 叢集會將 Kubernetes API 物件的狀態,以鍵/值組合的形式儲存在資料庫中。控制層中的 Kubernetes API 伺服器會使用 etcd API 與這個資料庫互動。GKE 會使用下列其中一項技術,執行叢集狀態資料庫:

  • etcd:叢集會使用在控制層 VM 上執行的 etcd 執行個體。
  • Spanner:叢集使用在控制層 VM 外部執行的 Spanner 資料庫。

無論叢集使用哪種資料庫技術,每個 GKE 叢集都會在控制層中提供 etcd API。如要加密涉及叢集狀態資料庫的流量,GKE 會使用下列其中一個或兩個個別叢集 CA:

  • etcd API CA:用於簽署 etcd API 端點往來流量的憑證。每個 GKE 叢集都會執行 etcd API CA。
  • etcd 對等互連 CA:用於簽署控制層上 etcd 資料庫執行個體之間流量的憑證。etcd 對等 CA 會在任何使用 etcd 資料庫的叢集中執行。使用 Spanner 資料庫的叢集不會使用 etcd 對等互連 CA。

etcd API CA 的根金鑰會發布至控制層運作的每個 Compute Engine 執行個體中繼資料。etcd API CA 不會在叢集之間共用。

etcd CA 憑證的效期取決於叢集建立日期,如下所示:

  • 如果是 2021 年 10 月前建立的叢集,憑證效期為 5 年。
  • 如果是 2021 年 10 月之後建立的叢集,憑證效期為 30 年。無論叢集建立日期為何,在憑證輪替期間建立的新 etcd CA 憑證效期均為 30 年。憑證會在到期前 6 個月自動輪換。

憑證輪換

如要輪換叢集的所有 API 伺服器和 kubelet 憑證,請執行憑證輪換。您無法觸發 etcd 憑證輪替;這是 GKE 中的代管工作。

後續步驟