默认情况下,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 版及更高版本中,您可以选择要求受信任的 GKE 控制平面组件(名为 gcp-controller-manager)创建 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
command
和 clusters create-auto
command中指定 --node-creation-mode 标志。
停用控制平面节点创建
您可以随时通过在
--node-creation-mode Google Cloud CLI 标志中指定值KUBELET或在
NodeCreationConfig GKE API 方法中指定VIA_KUBELET来恢复到kubelet
创建节点的默认 GKE 行为。对于现有集群,此更改仅影响该集群中的新节点。
以下命令会更新集群以停用控制平面节点创建:
gcloud container clusters update CLUSTER_NAME \
--node-creation-mode=KUBELET \
--location=CONTROL_PLANE_LOCATION \
替换以下内容:
CLUSTER_NAME:您的集群的名称。CONTROL_PLANE_LOCATION:集群控制平面的区域或可用区。
后续步骤
- 详细了解 安全强化型 GKE 节点。
- 阅读 GKE 安全 概览。
- 了解如何强化集群的 安全性。