禁止在 GKE 叢集中進行節點自我註冊

根據預設,Google Kubernetes Engine (GKE) 節點會使用每個節點上的 kubelet 程序,向 Kubernetes API 伺服器註冊 Node 物件。本文說明如何防止受防護的 GKE 節點自行註冊,改為要求受信任的 GKE 控制平面元件執行註冊作業。安全工程師和平台管理員可以使用控制層節點建立作業,限制節點的權限。

您應該已熟悉下列概念:

GKE 中的節點建立模式

所有 GKE 叢集都會啟用 Shielded GKE 節點,在節點註冊程序中強制執行節點身分的加密驗證。這項驗證可確保只有合法的節點能向 Kubernetes API 伺服器註冊及執行工作負載。

GKE 叢集的預設註冊工作流程中,每個節點上的 kubelet 會在 API 伺服器中建立及修改 Node 物件,如果節點遭到入侵,就會造成風險。舉例來說,在 CVE-2025-5187 中,節點使用者可透過安全漏洞刪除對應的 Node 物件,並註冊遭入侵的節點。

建立控制層節點

在 GKE 1.35.3-gke.1189000 以上版本中,您可以選擇要求名為 gcp-controller-manager 的受信任 GKE 控制層元件建立 Node 物件,而不是允許 kubelet 自行註冊節點。kubelet 使用經過密碼編譯驗證的節點身分與 API 伺服器建立 TLS 連線後,gcp-controller-manager 元件會建立 Node 物件。准入控制器會拒絕 kubelet 的任何要求,以建立 Node 物件。使用控制層元件建立 Node 物件,可降低節點遭入侵的風險,避免節點建立任意 Node 物件或操控 Node 規格。

如要變更預設的節點建立和註冊行為,請在建立 Standard 或 Autopilot 叢集時,執行下列其中一項操作:

  • Google Cloud CLI:在 --node-creation-mode 旗標中指定 CONTROL_PLANE 值。
  • Kubernetes Engine API:在 NodeCreationConfig 方法的 node-creation-mode 欄位中指定 VIA_CONTROL_PLANE 值。

限制

gcp-controller-manager 在 Kubernetes API 中建立 Node 物件後,kubelet 會稍待片刻,再以完整的節點標籤和註解更新該 Node 物件。如果任何工作負載或控制器在節點建立後,立即需要一整組標籤或註解,可能會出現非預期的行為。某些標籤和註解的對帳時間可能與kubelet註冊時間不同。確認工作負載和 DaemonSet 會先檢查標籤和註解是否存在,再採取行動。

  • 請避免部署 DaemonSet 和工作負載,這些項目會容許所有節點 taint,這可能會導致 Pod 在未準備就緒的節點上執行。
  • 在主要容器執行前,請先使用 initContainer 檢查節點標籤。

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

啟用控制層節點建立作業

建立叢集或更新現有叢集時,您可以使用 gcp-controller-manager 元件啟用節點建立作業。如果是現有叢集,更新只會影響叢集中的新節點。現有節點不受這項異動影響。

下列指令會為現有叢集啟用控制層節點建立模式:

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=CONTROL_PLANE \
    --location=CONTROL_PLANE_LOCATION \

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區。

您也可以在 clusters create 指令clusters create-auto 指令中指定 --node-creation-mode 旗標。

停用控制層節點建立作業

您可以指定 --node-creation-mode Google Cloud CLI 旗標中的 KUBELET 值,或 NodeCreationConfig GKE API 方法中的 VIA_KUBELET 值,還原為預設 GKE 行為,讓 kubelet 隨時建立節點。如果是現有叢集,這項變更只會影響該叢集中的新節點。

下列指令會更新叢集,停用控制層節點建立作業:

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=KUBELET \
    --location=CONTROL_PLANE_LOCATION \

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區。

後續步驟