防止 GKE 集群中的节点自行注册

Google Kubernetes Engine (GKE) 节点通过创建 Node 对象向 Kubernetes API 服务器注册。

在 Kubernetes API 中创建 Node 对象的系统组件是以下组件之一:

  • kubelet 进程。
  • 可信控制平面组件。

本文档介绍了 GKE 中的节点创建模式,并展示了如何为使用安全强化型 GKE 节点的集群配置模式。安全工程师和平台管理员可以使用控制平面节点创建来限制节点的权限。

您应该已经熟悉以下概念:

GKE 中的节点创建模式

安全强化型 GKE 节点在所有 GKE 集群中均已启用,会在节点注册过程中强制执行节点身份的加密验证。此验证有助于确保只有合法节点才能向 Kubernetes API 服务器注册并运行工作负载。

节点自注册工作流(其中每个节点上的 kubelet 在 API 服务器中创建和修改其 Node 对象)会在节点遭到入侵时产生风险。例如,在 CVE-2025-5187 中,一个漏洞允许节点用户删除相应的 Node 对象并注册遭到入侵的节点。

GKE 支持以下节点创建模式:

  • 控制平面节点创建:受信任的 GKE 控制平面组件会创建 Node 对象。对于运行 GKE 1.37.1-gke.3020000 及更高版本的新集群,此模式是默认模式。
  • kubelet 节点创建:每个节点上的 kubelet 会自行注册节点。此模式是使用 1.37.1-gke.3020000 之前的 GKE 版本创建的集群的默认模式。

控制平面节点创建

在 GKE 1.35.3-gke.1189000 版及更高版本中,您可以配置一个可信的 GKE 控制平面组件来创建 Node 对象,而不是允许 kubelet 自行注册节点。在 kubelet 使用经过加密验证的节点身份与 API 服务器建立 TLS 连接后,控制平面会创建 Node 对象。准入控制器会拒绝来自 kubelet 的任何创建 Node 对象的请求。通过使用控制平面组件创建 Node 对象,您可以降低可能遭到入侵的节点创建任意 Node 对象或操纵其 Node 规范的风险。如需在创建 Standard 或 Autopilot 集群时明确设置节点创建模式,请执行以下操作之一:

  • Google Cloud CLI:在 --node-creation-mode 标志中指定值 CONTROL_PLANE 或 KUBELET。
  • Kubernetes Engine API:在 NodeCreationConfig 对象的 nodeCreationMode 字段中指定值 VIA_CONTROL_PLANE 或 VIA_KUBELET。

如需手动启用控制平面节点创建功能,您的集群必须满足以下所有要求:

  • 集群必须运行 GKE 1.35.3-gke.1189000 版或更高版本。
  • 集群必须启用安全强化型 GKE 节点。如果您停用安全强化型 GKE 节点,则无法使用控制平面节点创建功能。

限制

从控制平面在 Kubernetes API 中创建 Node 对象到 kubelet 使用完整的节点标签和注解集更新该 Node 对象,这之间存在短暂的延迟。任何在节点创建后立即依赖于一整套标签或注解的工作负载或控制器都可能会出现意外行为。某些标签和注解的协调时间可能与 kubelet 注册时间不同。请验证您的工作负载和 DaemonSet 在执行操作之前是否会检查标签和注解是否存在。

  • 避免部署对所有节点污点具有容忍设置的 DaemonSet 和工作负载,这可能会导致 Pod 在未准备就绪的节点上运行。
  • 在允许主容器运行之前,使用 initContainer 检查节点标签。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如需使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

启用控制平面节点创建

运行 1.37.1-gke.3020000 版及更高版本的新集群默认使用控制平面节点创建。对于在较低版本中创建的集群,或您之前选择停用的集群,您可以通过更新现有集群的节点创建模式来启用节点创建。对于现有集群,更新仅影响集群中的新节点。现有节点不受此更改的影响。

以下命令可为现有集群启用控制平面节点创建模式:

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 值,或在 Kubernetes Engine API 中 NodeCreationConfig 对象的 nodeCreationMode 字段中指定 VIA_KUBELET,让 kubelet 进程随时注册节点。对于现有集群,此更改仅影响该集群中的新节点。

以下命令会更新集群,以停用控制平面节点创建功能:

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

替换以下内容:

  • CLUSTER_NAME:您的集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面所在的区域或可用区。

后续步骤