节点池自动创建简介

Google Kubernetes Engine (GKE) 可以根据工作负载的配置自动创建和管理集群中的节点池。本文档介绍了节点池自动创建的工作原理、扩缩参数和默认行为,并提供了一些建议,可帮助您提高可伸缩性。本文档适用于希望减少 Standard 模式集群中与手动基础设施管理相关的费用的集群管理员。

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

在 Autopilot 模式下,GKE 会始终根据您的工作负载为您创建和管理节点及节点池。您无需为 Autopilot 集群或 Standard 集群中的 Autopilot 工作负载手动配置节点池自动创建。如需了解详情,请参阅 GKE Autopilot 概览

什么是节点池自动创建?

在 GKE 中,节点池是节点的逻辑分组。节点池中的每个节点都具有与该节点池中每个其他节点相同的配置。节点池自动创建是一种基础设施自动扩缩机制,可让 GKE 在集群中创建满足工作负载要求的新节点池。GKE 会管理这些自动创建的节点池,执行更新节点元数据、在节点池中创建和删除节点,以及在不再需要整个节点池时将其删除等任务。节点池自动创建是 GKE 集群自动扩缩器的扩展功能,可自动扩缩各个节点池中的节点。

节点池自动创建旨在让 GKE 自动缩容并移除集群中的空节点池。您无法设置每个自动创建的节点池必须具有的最小数量的节点,因为大于零的最小数量会阻止移除空节点池。 如果您的应用场景要求集群中始终运行最小数量的节点,请手动创建启用了自动扩缩的节点池

工作原理

节点池自动创建扩展了 GKE 集群自动扩缩器,以便使 GKE 能够预配满足待处理 Pod 的硬件要求和资源请求的新节点池。您可以通过以下方式定义硬件要求:

  • 使用 ComputeClass,然后使用节点选择器在各种 Pod 中选择这些 ComputeClass。我们建议采用此方法,因为您可以集中定义多个工作负载可使用的通用节点配置。
  • 使用节点选择器或节点亲和性在 Pod 规范中请求特定的 GKE 节点标签。

GKE 会根据以下参数配置新的节点池:

  • Pod 和容器中的 CPU、内存和临时存储资源请求,包括由 DaemonSet 管理的任何 Pod。
  • Pod 规范或 ComputeClass 中的 GPUTPU 请求。
  • 待处理 Pod 的规范或 ComputeClass 中的硬件要求,例如机器类型或启动磁盘类型。
  • 具有匹配节点选择器的待处理 Pod 的规范中的容忍设置

GKE 会将自动创建的节点池中每个节点的资源容量配置为大于或等于待处理 Pod 的资源请求量。您必须确保资源请求足够大,以便 Pod 按预期运行。如果 Pod 请求量过低,则在 GKE 将 Pod 调度到自动创建的节点上后,Pod 将无法按预期运行。

节点元数据配置

GKE 还会根据您的工作负载要求配置节点元数据(例如标签、注解和节点污点),如以下示例所示:

  • 如果您请求 N2 系列机器,GKE 会向每个节点添加 cloud.google.com/machine-family: n2 节点标签。
  • 如果您在 Pod 中选择 ComputeClass,GKE 会添加一个节点标签,并将 cloud.google.com/compute-class 键设置为该 ComputeClass 的名称。
  • 如果 Pod 针对同一节点标签同时具有容忍设置和节点选择器,则 GKE 会为自动创建的节点添加这些容忍设置对应的节点污点。

删除自动创建的节点池

借助节点池自动创建,集群自动扩缩器可以创建新的节点池和节点来运行传入的待处理 Pod。如果自动创建的节点池中的 Pod 数量减少,则集群自动扩缩器会逐步缩容节点池。 如果可能,GKE 会排空节点池中利用率过低的节点,将 Pod 整合到其他节点上,然后移除空节点。

如果自动创建的节点池中的节点数量为零,则 GKE 会删除该节点池。GKE 不会删除您从节点池自动创建中排除的节点池,例如手动创建的节点池。如需详细了解集群自动扩缩器如何缩容节点池,请参阅集群自动扩缩器的工作原理

GKE 扩缩偏好设置

GKE 自动扩缩基础设施时,遵循以下偏好设置:

  • 减少浪费的计算资源:GKE 会使用集群中现有自动创建的节点池的资源容量来确定要用于新节点池的机器类型。随着集群大小的扩大,GKE 会优先为新节点池使用更大的机器类型,以便更多 Pod 可以在节点池中的每个节点上运行。
  • 优化可伸缩性和延迟:GKE 始终优先扩容现有的兼容节点池,而不是创建新的节点池。随着集群中不同节点池数量的增加,此偏好设置的强度也会随之增加。当不同节点池的数量接近支持的最佳延迟和可伸缩性限制时,GKE 不再优先创建新的节点池。

这些优先级有助于确保集群大规模高效使用计算资源,如以下示例场景所示:

  • 在节点池数量较少且资源用量较低的集群中,GKE 会更频繁地创建新节点池,并为这些节点池使用较小的机器类型。
  • 在具有大量节点池的集群中,资源用量很高。 GKE 会减少创建新节点池的频率,并为这些节点池使用更大的机器类型,以便继续进行 Pod 调度,同时还减缓集群可伸缩性和延迟限制的实现进度。

您可以使用具有 priorities.machineFamily 字段以及 priorities.minCores 字段或 priorities.minMemoryGb 字段的 ComputeClass,手动控制 GKE 用于自动创建的节点池的实例大小下限。

节点池自动创建的启用方法

GKE 可以根据集群的配置方式,为特定 ComputeClass 或使用兼容配置的任何工作负载自动创建节点池。

启用方法
工作负载级(推荐)

在 GKE 1.33.3-gke.1136000 版及更高版本中,请使用 ComputeClass 启用节点池自动创建,而无需使用集群级节点自动预配。GKE 仅会为选择已启用自动创建的特定 ComputeClass 的工作负载创建新的节点池。集群中的现有工作负载不受影响。

即使在 1.33.3-gke.1136000 之前的 GKE 版本中,也建议使用 ComputeClass 为工作负载请求和配置基础设施。ComputeClass 提供独特的功能,让您能够灵活地优化集群中的扩缩。如需了解详情,请参阅自定义 ComputeClass 简介

集群级层

为整个集群启用节点自动预配。您必须为集群中的 CPU 和内存等资源设置限制。这些限制适用于整个集群。如需在 1.33.3-gke.1136000 之前的 GKE 版本中启用节点池自动创建,必须进行集群级配置。

GKE 可以在 Pod 规范中使用 ComputeClass 或选择器,为集群中任何待处理的工作负载创建新的节点池。

这些配置方法并不相互排斥。您可以使用 ComputeClass 在使用节点自动预配的集群中自动创建节点池。如果您同时使用这两种方法在集群中启用节点池自动创建,GKE 会按以下优先顺序查找要用于节点池的配置设置值:

  1. ComputeClass 或 Pod 规范:如果您在 ComputeClass 或 Pod 规范中指定了设置(例如机器类型),则 GKE 会使用该设置。
  2. 集群级节点自动预配默认值:如果未在 ComputeClass 或 Pod 规范中指定设置,GKE 会检查您是否在集群中为节点自动预配设置了默认值。如果存在集群级默认值,GKE 会使用该值。
  3. 集群级默认值:如果未在 ComputeClass、Pod 规范中指定设置,也未将其指定为集群级节点自动预配的默认值,则 GKE 会使用 Google Cloud 为集群设置的默认值。

例如,假设 GKE 尝试查找要用于自动创建的节点池的机器类型。上述偏好顺序的适用情况如下:

  1. GKE 会检查 Pod 规范或 Pod 的 ComputeClass 是否指定了机器类型。
  2. 如果 Pod 规范或 ComputeClass 未指定机器类型,GKE 会检查您是否在集群中为节点自动预配设置了默认机器类型。
  3. 如果您没有为节点自动预配设置默认机器类型,GKE 会使用集群的默认机器类型。

我们建议您在大多数情况下仅使用 ComputeClass 启用方法。以下各部分详细介绍了每种配置方法,包括任何限制和注意事项。

通过 ComputeClass 实现工作负载级启用

您可以使用 ComputeClass 规范中的以下字段之一,为集群中的任何 ComputeClass 启用节点池自动创建:

  • nodePoolAutoCreation:让 GKE 根据需要自动创建节点池。您仍然可以与节点池交互。GKE 仅会实现您配置的设置或限制。
  • autopilot:以 Autopilot 模式运行选择此 ComputeClass 的工作负载。与 Autopilot 集群类似,GKE 会为您完全管理节点,并实现各种 Autopilot 限制和设置。如果您使用 autopilot 字段,则可以跳过本文档。如需了解详情,请参阅 Standard 中的 Autopilot 模式工作负载简介

在满足以下要求的集群中,您可以在 ComputeClass 中使用这些字段,而无需在集群级层启用节点自动预配:

  • 使用 GKE 1.33.3-gke.1136000 版或更高版本。
  • 已在快速发布渠道中注册。

如果您在 ComputeClass 中配置了节点池自动创建,但没有为集群启用节点自动预配,则 GKE 仅会为使用该 ComputeClass 的工作负载创建新的节点池。其他工作负载不受影响。

以下示例 ComputeClass 清单会为使用 ComputeClass 的任何 Pod 启用节点池自动创建:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: example-computeclass
spec:
  priorities:
  - machineFamily: n4
  - machineFamily: c4
  whenUnsatisfiable: ScaleUpAnyway
  nodePoolAutoCreation:
    enabled: true

通过节点自动预配实现集群级启用

如需为整个集群启用节点池自动创建,请使用 Google Kubernetes Engine API 为集群启用节点自动预配功能。借助节点自动预配,GKE 可以根据 Pod 规范或 ComputeClass 配置,按需为集群中的任何工作负载创建新的节点池。GKE 不会管理集群中的任何现有节点池,但您可以在为集群启用节点自动预配后,将各个节点池标记为自动预配。

在以下情况下启用节点自动预配:

  • 您希望 GKE 在运行 1.33.3-gke.1136000 之前的 GKE 版本的集群中自动创建节点池。
  • 您希望手动设置集群范围的资源限制。在 1.33.3-gke.1136000 之前的 GKE 版本中,即使您使用 ComputeClass,也必须设置集群范围的资源限制。

  • 您想使用 ComputeClass 不支持的特定功能或配置。

  • 您希望为整个集群设置默认节点配置值。

启用节点自动预配后,您可以使用 Google Cloud CLI 或 YAML 配置文件为各种节点设置配置默认值。

使用节点自动预配指定集群级资源限制

为整个集群启用节点自动预配时,您还必须为集群中的 CPU、内存、GPU 和 TPU 等资源配置限制。这些限制适用于集群中的所有资源容量总和,包括手动创建的节点池和 ComputeClass。如果操作导致超出上述某项资源限制,GKE 不会创建新节点或节点池。

只有在集群中启用节点自动预配时,才需要指定这些集群级资源限制。在满足以下要求的集群中,您可以在 ComputeClass 中使用节点池自动创建,而无需启用节点自动预配:

  • 使用 GKE 1.33.3-gke.1136000 版或更高版本。
  • 已在快速发布渠道中注册。

如果您的集群满足这些要求,我们建议您仅使用 ComputeClass 来配置自动创建的节点池。

自动创建的节点池的默认设置

您可以指定 GKE 在工作负载级层或集群级层应用于自动创建的节点池的默认值。

  • 工作负载级默认设置:您可以使用 ComputeClass 规范中的 spec.nodePoolConfig 字段和 spec.priorityDefaults 字段为特定节点设置默认值。这些默认值仅适用于 GKE 为相应 ComputeClass 创建的节点池。
  • 集群级默认设置:配置节点自动预配时,您可以为自动创建的节点池设置默认值。如需指定默认值,您可以使用 gcloud CLI 或 YAML 配置文件。

这些设置默认值的方法并不相互排斥。如果您为 ComputeClass 中的特定设置和整个集群配置了默认值,则 GKE 会使用 ComputeClass 的值。如果 ComputeClass 没有为该设置指定值,GKE 会改为使用集群级默认值。

使用配置文件配置集群级默认设置

启用节点自动预配后,您可以使用 YAML 配置文件为自动创建的节点池指定集群范围的默认设置。您可以在单个配置文件中指定多个设置。部分高级配置(例如自动修复设置)只能通过使用配置文件指定。

  • 以下示例配置文件会为任何自动创建的新节点池启用节点自动修复和自动升级

    management:
      autoRepair: true
      autoUpgrade: true
    
  • 以下示例配置文件会为节点自动预配设置集群范围的资源限制,并配置多项默认设置:

    resourceLimits:
      - resourceType: 'cpu'
        minimum: 4
        maximum: 10
      - resourceType: 'memory'
        maximum: 64
      - resourceType: 'nvidia-tesla-t4'
        maximum: 4
    management:
      autoRepair: true
      autoUpgrade: true
    shieldedInstanceConfig:
      enableSecureBoot: true
      enableIntegrityMonitoring: true
    diskSizeGb: 100
    

    此配置文件设置了以下默认值:

将配置文件应用于集群后,GKE 仅会将该文件中的设置用于集群中自动创建的新节点池。 您在该文件中指定的新设置或修改后的设置不会应用于 GKE 在集群中创建的现有节点池。如果您更新之前为集群设置的值,GKE 会将新值用于所有新节点池。例如,如果您之前将默认机器系列设置为 N2,然后在配置文件中将该值更新为 N4,则所有新节点池都会使用 N4 机器类型。

如需详细了解如何使用集群级配置文件,请参阅使用节点自动预配配置文件配置设置

节点池自动创建应用场景

以下部分介绍了节点池自动创建功能的一些热门应用场景和支持的硬件。如需详细了解其他应用场景和支持的配置,请参阅适用于您的具体应用场景的文档。

机器系列或机器类型选择

您可以选择 Compute Engine 机器系列或机器类型,供 GKE 使用以下方式之一用于自动创建的节点池:

  • ComputeClass:使用 machineFamilymachineType 优先级规则
  • Pod 规范:对于机器系列,请将节点选择器用于 cloud.google.com/machine-family 节点标签。对于机器类型,请同时使用 cloud.google.com/machine-familynode.kubernetes.io/instance-type 节点标签。如需了解详情,请参阅选择机器系列或机器类型

如果您未明确选择机器,GKE 会使用 E2 机器系列或与工作负载所请求的硬件兼容的机器类型。 例如,GKE 使用 GPU 机器类型来处理 GPU,并使用专用机器来处理 TPU 资源

请求机器系列或机器类型时,请确保其他节点选择器和 Pod 资源请求与指定的机器兼容。例如,您不能同时请求 GPU 和 N2 机器系列。

支持的机器系列

您可以在 ComputeClass 或工作负载中明确请求任何受支持的 Compute Engine 机器系列或机器类型。节点池自动创建仅在特定 GKE 版本中支持以下机器系列:

  • Z3 机器系列:1.29 及更高版本。
  • C4 机器系列
    • 1.28.15-gke.1159000 及更高版本。
    • 1.29.10-gke.1227000 及更高版本。
    • 1.30.3-gke.1225000 及更高版本。
  • C4A 机器系列
    • 1.28.15-gke.1344000 及更高版本。
    • 1.29.11-gke.1012000 及更高版本。
    • 1.30.7-gke.1136000 及更高版本。
    • 1.31.3-gke.1056000 及更高版本。
  • C4D 机器系列:1.32.3-gke.1717000 及更高版本。
  • N4 机器系列:1.29.3 及更高版本。

所有 GKE 版本都支持其他机器系列。

GPU 选择

您可以通过以下方式之一为自动创建的节点池请求 GPU:

  • ComputeClass
    1. 使用 gpu 优先级规则配置 GPU。
    2. 在 Pod 中请求 GPU 资源。
  • Pod 规范
    1. 为节点自动预配配置集群范围的 GPU 限制。
    2. 使用节点选择器配置 GPU。
    3. 在 Pod 中请求 GPU 资源。

GKE 会选择足够大的 GPU 机器类型来支持相应数量的 GPU。您选择的 GPU 数量会影响节点的 CPU 和内存容量。

Cloud TPU 选择

您可以通过以下方式之一为自动创建的节点池请求 Cloud TPU 资源:

  • ComputeClass:使用 tpu 优先级规则来配置 TPU。然后,在 Pod 中请求相同数量的 TPU 资源。如需了解详情,请参阅使用自定义计算类预配 TPU
  • Pod 规范:配置集群范围的 TPU 限制。然后,使用节点选择器配置 TPU 并在 Pod 中请求 TPU 资源。如需了解详情,请参阅配置 Cloud TPU

单主机 TPU 切片节点池多主机 TPU 切片节点池都支持自动扩缩和节点池自动创建。对于节点池自动创建,GKE 会创建具有 TPU 版本和拓扑的单主机或多主机 TPU 切片节点池,以满足待处理工作负载的要求。

Cloud TPU 的 GKE 版本要求

节点池自动创建仅在特定 GKE 版本中支持以下 Cloud TPU:

  • TPU v3:1.31.0 及更高版本。
  • TPU v5 和 TPU v4:1.29.0 及更高版本。
  • TPU Trillium:1.31.1-gke.1146000 及更高版本。
  • Ironwood (TPU7x)预览版):1.34.1-gke.2541000 或更高版本。

所有 GKE 版本都支持其他 Cloud TPU 类型。

Cloud TPU 节点池自动扩缩

GKE 会使用以下方式之一扩缩使用集群自动扩缩器自动创建或手动创建的 Cloud TPU 节点池:

  • 单主机 TPU 切片节点池:GKE 会在现有节点池中添加或移除 TPU 节点。节点池可以包含零到节点池最大大小(由 --max-nodes--total-max-nodes 自动扩缩标志确定)之间的任意数量的 TPU 节点。节点池中的所有 TPU 节点都具有相同的机器类型和拓扑。如需详细了解如何创建单主机 TPU 切片节点池,请参阅创建单主机 TPU 切片节点池
  • 多主机 TPU 切片节点池:GKE 以原子方式将节点池从零扩容到满足 TPU 拓扑所需的节点数。例如,对于机器类型为 ct5lp-hightpu-4t 且拓扑为 16x16 的 TPU 节点池,该节点池始终包含 64 个节点或零个节点。如果节点池中没有 TPU 工作负载,GKE 会缩容节点池。如需缩容节点池,GKE 会逐出所有已调度的 Pod 并移除节点池中的所有节点。如需详细了解如何创建多主机 TPU 切片节点池,请参阅创建多主机 TPU 切片节点池

Cloud TPU 节点池配置

GKE 会使用 Pod 或 ComputeClass 中的配置来确定 TPU 节点的配置。以下清单是一个 Deployment 规范示例,该示例在 Pod 规范中请求 TPU。如果启用了集群级节点自动预配设置,此 Deployment 会触发节点池自动创建。创建此示例 Deployment 时,GKE 会创建一个节点池,其中包含一个具有 2x2x2 拓扑和两个 ct4p-hightpu-4t 机器的 TPU v4 切片。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tpu-workload
  labels:
    app: tpu-workload
spec:
  replicas: 2
  template:
    spec:
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v4-podslice
        cloud.google.com/gke-tpu-topology: 2x2x2
      containers:
      - name: tpu-job
        image: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
        ports:
        - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
        securityContext:
          privileged: true # Required for GKE versions earlier than 1.28 to access TPUs.
        command:
        - bash
        - -c
        - |
          python -c 'import jax; print("Total TPU chips:", jax.device_count())'
        resources:
          requests:
            google.com/tpu: 4
          limits:
            google.com/tpu: 4
        ports:
        - containerPort: 80

在此清单中,以下字段定义了 TPU 配置:

  • cloud.google.com/gke-tpu-acceleratorTPU 版本和类型。例如,对于 Ironwood (TPU7x),请使用 tpu7x-standard-4t
  • cloud.google.com/gke-tpu-topology:包含 TPU 切片中 TPU 芯片的数量和物理排列方式的拓扑。例如,使用 2x2x2
  • limits.google.com/tpu:每个虚拟机的 TPU 芯片数量。例如,如果您使用 tpu7x-standard-4t,则每个虚拟机的 TPU 芯片数量为 4

Spot 虚拟机选择

您可以通过以下方式之一为自动创建的节点池选择 Spot 虚拟机

  • ComputeClass:使用优先级规则中的 spot 字段。
  • Pod 规范:使用具有 NoSchedule 效果的 cloud.google.com/gke-spot="true" 节点标签的容忍设置。为 cloud.google.com/gke-spot=truecloud.google.com/gke-provisioning=spot 节点标签添加节点选择器。或者,您也可以在容忍设置和节点选择器中使用 cloud.google.com/gke-preemptible 节点标签来选择抢占式虚拟机。不过,我们强烈建议您改用 Spot 虚拟机。

临时存储配置

GKE 会将一部分节点启动磁盘用于 Pod 临时存储。您可以通过以下方式之一自定义 GKE 用于自动创建的节点的启动磁盘的大小:

  • ComputeClass:使用优先级规则中的 storage.bootDiskSizestorage.bootDiskType 字段。 您可以为不同的 ComputeClass 配置不同的启动磁盘设置。
  • Pod 规范:使用集群级配置文件中的 diskSizeGbdiskType 字段。您无法使用此方法控制各个 Pod 的启动磁盘大小和类型。

如需了解详情,请参阅自定义启动磁盘。 如果您未明确修改启动磁盘设置,则默认值为容量为 100 GiB 的 pd-balanced 卷。

只有当具有指定启动磁盘的节点的可分配临时存储大于或等于待处理 Pod 的临时存储请求时,GKE 才会创建新节点池。如果临时存储请求大于节点的可分配临时存储,GKE 将不会创建新的节点池,并且 Pod 会保持待处理状态。GKE 不会根据您的 Pod 临时存储请求动态调整启动磁盘大小。

工作负载分离

您可以请求让特定 Pod 始终在与集群中其他 Pod 分开的节点上运行。GKE 会使用节点污点来防止其他工作负载在这些节点上运行。您可以通过以下方式在自动创建的节点池中配置工作负载分离:

  • ComputeClass:GKE 为特定 ComputeClass 创建的节点只能运行选择该 ComputeClass 的 Pod。您无需修改 Pod 规范。您可以使用 Pod 间亲和性和反亲和性来分离ComputeClass 中的 Pod。
  • Pod 规范:如果您为集群启用节点自动预配,则可以使用 Pod 规范中的字段来配置工作负载分离。在节点池自动创建期间,如果满足以下所有条件,GKE 可能会创建具有标签和污点的节点池:
    • Pod 使用节点选择器请求自定义节点标签键和值。您无法使用系统节点标签来隔离工作负载。
    • Pod 对同一节点标签键使用容忍设置
    • 容忍效果为 NoScheduleNoExecute 或未指定。

如需详细了解如何配置这些字段以及相关限制,请参阅在 GKE 中配置工作负载隔离

限制

  • 集群自动扩缩器的所有限制也适用于节点池自动创建。
  • 如果集群的总节点池数量超过 200 个,则在自动扩缩期间延迟时间可能会增加。任何会触发新节点池创建的配置(例如工作负载分离或使用多个 ComputeClass)都会增加此数量。如需详细了解集群限制,请参阅“规划大型集群”中的限制和最佳实践
  • 您在启用节点自动预配时为集群设置的任何资源限制也会应用于 GKE 为 ComputeClass 创建的节点池。
  • ComputeClass 不支持以下设置:
    • 超额配置升级或蓝绿升级。
    • 节点完整性和安全启动。
  • 如需在 1.33.3-gke.1136000 之前的 GKE 版本中为 ComputeClass 启用节点池自动创建,您还必须启用集群级节点自动预配。此限制不适用于 GKE 1.33.3-gke.1136000 版及更高版本。

不支持的配置

GKE 不会创建使用以下配置的新节点池:

集群自动扩缩器可以扩缩使用这些配置的现有节点池中的节点。

后续步骤