默认情况下,Google Kubernetes Engine (GKE) 节点使用每个节点上的 kubelet 进程向 Kubernetes API 服务器注册节点对象。本文档介绍了如何防止安全强化型 GKE 节点进行这种自行注册,而是要求受信任的 GKE 控制平面组件执行注册操作。安全工程师和平台管理员可以使用控制平面节点创建来限制节点的权限。
您应该已经熟悉以下概念:
GKE 中的节点创建模式
安全强化型 GKE 节点已在所有 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 和工作负载,这可能会导致 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:集群控制平面所在的区域或可用区。
后续步骤
- 详细了解安全强化型 GKE 节点。
- 阅读 GKE 安全概览。
- 了解如何加固集群的安全。