自定义 ComputeClass 简介

您可以创建自己的 ComputeClass 来控制 Google Kubernetes Engine (GKE) 在自动扩缩集群时预配的节点的属性。本页面适用于希望以声明方式为节点定义自动扩缩配置文件,以便特定工作负载在满足其要求的硬件上运行的平台管理员。如需详细了解 ComputeClass,请参阅 GKE ComputeClass 简介

ComputeClass 概览

在 GKE 中,ComputeClass 是由一组节点属性组成的配置文件,GKE 使用这些属性在自动扩缩事件期间预配运行工作负载的节点。ComputeClass 可以针对特定优化,例如预配高性能节点或优先使用可降低运行费用的费用优化配置。借助自定义计算类,您可以定义配置文件,GKE 随后会使用这些配置文件来自动扩缩更符合特定工作负载要求的节点。

自定义 ComputeClass 可在 1.30.3-gke.1451000 版及更高版本的 GKE Autopilot 模式和 GKE Standard 模式下使用,并提供了一种声明式方法定义节点属性和自动扩缩优先级。默认情况下,自定义 ComputeClass 可在所有符合条件的 GKE 集群中进行配置和使用。

自定义 ComputeClass 的优势

自定义 ComputeClass 具有以下优势:

  • 后备计算优先级:在每个 ComputeClass 中定义节点配置的层次结构,供 GKE 优先使用。如果最优先配置不可用,GKE 会自动选择层次结构中的下一个配置。这种回退模式可确保即使计算资源不可用,您的工作负载仍会在经过优化的硬件上运行,并且调度延迟时间最短。
  • 精细自动扩缩控制:定义最适合特定工作负载的节点配置。在扩缩期间创建节点时,GKE 会优先使用这些配置。
  • 声明式基础设施配置:采用声明式基础设施管理方法,以便 GKE 自动为您创建满足特定工作负载要求的节点。
  • 主动迁移:如果您所在位置有更优先的机器配置的计算资源可用,GKE 会自动将您的工作负载迁移到使用优先配置的新节点。
  • 费用优化:优先使用经济实惠的节点类型(例如 Spot 虚拟机),以降低集群开支。
  • 默认自定义 ComputeClass:将自定义 ComputeClass 设置为整个集群或特定 Kubernetes 命名空间的默认设置,以便工作负载在经过优化的硬件上运行,即使它们没有请求特定 ComputeClass。
  • 自定义节点整合阈值:为节点定义自定义资源用量阈值。如果特定节点的资源用量低于您的阈值,GKE 会尝试将工作负载整合到类似的可用节点中,并缩减未充分利用的节点。

自定义 ComputeClass 的应用场景

在以下这类场景中请考虑使用自定义 ComputeClass:

  • 您希望在特定 GPU 或 TPU 配置上运行 AI/机器学习工作负载。
  • 您希望为特定团队运行的工作负载设置默认硬件配置,从而减少应用运维人员的开销。
  • 您运行的工作负载在特定 Compute Engine 机器系列或硬件配置上性能最佳。
  • 您想要声明满足特定业务要求(例如高性能、费用优化或高可用性)的硬件配置。
  • 您希望 GKE 在计算资源不可用期间以分层方式回退到使用特定的硬件配置,以便工作负载始终在满足其要求的机器上运行。
  • 您希望在整个企业舰队中集中确定最佳配置,以便费用更容易预测且工作负载运行更可靠。
  • 您希望集中指定 GKE 应使用哪些 Compute Engine 容量预留来为特定工作负载预配新节点。
  • 您希望指定一个紧凑布置政策,以便与 GKE Autopilot 搭配使用。如需了解详情,请参阅紧凑布置

自定义 ComputeClass 的工作原理

自定义 ComputeClass 是用于预配Google Cloud 基础设施的 Kubernetes 自定义资源。您可在集群中定义 ComputeClass 对象,然后在工作负载中请求该 ComputeClass,或将该计算类设置为 Kubernetes 命名空间的默认设置。当匹配的工作负载需要新基础设施时,GKE 会根据您在 ComputeClass 定义中设置的优先级预配新节点。

您在 ComputeClass 中设置的属性会定义 GKE 如何配置新节点来运行工作负载。修改现有计算类后,GKE 为该 ComputeClass 创建的所有未来节点都会使用修改的配置。GKE 不会追溯性地更改现有节点的配置以匹配您的修改。

自定义 ComputeClass 会影响自动扩缩决策,但 kube-scheduler 不会考虑它们。在 Pod 调度期间,即使可使用具有各种优先级的现有节点,调度器也可能不会优先考虑具有较高自定义 ComputeClass 优先级的节点。

如需确保自定义 ComputeClass 针对舰队进行优化,请考虑以下准则:

  • 了解舰队的计算要求,包括任何特定于应用的硬件要求。
  • 确定一个引导每个 ComputeClass 设计的主题。例如,性能优化型 ComputeClass 可能具有仅使用高 CPU 机器类型的后备策略。
  • 确定最适合您的工作负载的 Compute Engine 机器家族和机器系列。如需了解详情,请参阅机器家族资源和比较指南
  • 在每个 ComputeClass 中规划后备策略,以便工作负载始终在使用类似机器配置的节点上运行。例如,如果 N4 机器系列不可用,您可以采用 C3 机器作为后备。

查看完整的自定义资源定义

如需查看 ComputeClass 自定义资源的最新自定义资源定义 (CRD),包括所有字段及其关系,请参阅 ComputeClass 参考文档

您还可以通过运行以下命令来查看集群中的 CRD:

kubectl describe crd computeclasses.cloud.google.com

规划自定义 ComputeClass

如需在集群中有效地规划、部署和使用自定义 ComputeClass,请执行以下步骤:

  1. 选择后备计算优先级:定义一系列规则,用于控制 GKE 为 ComputeClass 创建的节点的属性。
  2. 配置 GKE Standard 节点池和 ComputeClass:对于 Standard 模式集群,请执行必要的配置步骤,以便将 ComputeClass 与节点池搭配使用。
  3. 定义未应用优先级规则时的扩缩行为:(可选)指示 GKE 在无法预配符合优先级规则的节点时应执行的操作。
  4. 为节点整合设置自动扩缩参数:指示 GKE 何时整合工作负载以及移除未充分利用的节点。
  5. 对主动迁移到优先级更高的节点进行配置:(可选)指示 GKE 在硬件可用时将工作负载迁移到更优先的节点。
  6. 使用 Compute Engine 预留:可选择在创建新节点时,告知 GKE 使用现有的 Compute Engine 可用区级预留。

选择回退计算优先级

使用自定义 ComputeClass 的主要优点是,当首选节点因资源耗尽和配额限制等因素而不可用时,可以控制后备策略。

您可以通过在自定义 ComputeClass 中定义一系列优先级规则来创建后备策略。当集群需要扩容时,GKE 会优先创建符合第一条优先级规则的节点。如果 GKE 无法创建这些节点,它会回退到下一条优先级规则,重复此过程,直到 GKE 成功扩容集群或用尽所有规则。如果所有规则都用尽,GKE 会根据定义未应用优先级规则时的扩缩行为中所述的默认或指定行为创建节点。

不同的 Compute Engine 机器系列支持不同的技术和功能。较早代的机器系列可能不支持与较新代机器系列相同的存储类型。如果您运行依赖于持久性数据的有状态工作负载,请避免使用跨机器系列的多个世代的 ComputeClass。如果 GKE 将工作负载放置在不支持相应存储类型的机器类型上,工作负载可能无法访问持久性数据。如需了解详情,请按特定存储类型过滤机器系列对比表

优先级规则

您可以在 ComputeClass 自定义资源的 spec.priorities 字段中定义优先级规则priorities 字段中的每个规则都描述要预配的节点的属性。GKE 会按顺序处理 priorities 字段,这意味着该字段中的第一项对于节点预配具有最高优先级。

优先级规则分为两种类型:

  • 声明式规则类型:使用节点特征来描述您要预配的节点

  • 节点池规则类型:在 GKE Standard 集群中,提供 GKE 应在其中预配节点且与 ComputeClass 关联的手动创建的节点池列表。

声明式优先级规则

借助声明式优先级规则,您可以指定机器属性(例如机器系列或类型、Spot 虚拟机、加速器选项、存储选项预留和最低资源要求),以供 GKE 在预配节点时使用。如需查看支持的字段的完整列表,请参阅 ComputeClass CRD 参考文档

machineFamily 配置

machineFamily 字段接受 Compute Engine 机器系列,例如 n4c4。如果您未指定此项,则默认设置为 e2

您可以将其他 spec.priorities 字段machineFamily 字段一起使用,以声明方式定义计算要求,例如:

  • spot:Spot 虚拟机。默认值为 false
  • minCores:每个节点的 vCPU 数量下限。默认值为 0
  • minMemoryGb:每个节点的内存下限。默认值为 0
  • storage.bootDiskKMSKey:用于启动磁盘加密的 Cloud Key Management Service 密钥的路径。
  • storage.secondaryBootDisks:用于为 GKE 节点预加载数据(例如机器学习 [ML] 模型或容器映像)的永久性磁盘。需要 GKE 1.31.2-gke.1105000 或更高版本。如需为集群设置辅助启动磁盘,请参阅配置辅助启动磁盘
    • storage.secondaryBootDisks.diskImageName:要预加载的磁盘映像的名称。
    • storage.secondaryBootDisks.project:磁盘映像所属的项目的名称。如果未指定此值,则默认使用您的集群项目。
    • storage.secondaryBootDisks.mode:使用辅助启动磁盘时应采用的模式。如果此值设置为 CONTAINER_IMAGE_CACHE,则辅助启动磁盘将用作容器映像缓存。此值必须等于 CONTAINER_IMAGE_CACHEMODE_UNSPECIFIED。如果未指定此值,则默认值为 MODE_UNSPECIFIED
  • placement:机器布置的具体细节:

以下示例展示了使用 machineFamily 的优先级规则:

priorities:
- machineFamily: n4
  spot: true
  minCores: 16
  minMemoryGb: 64
  storage:
    bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1
    secondaryBootDisks:
    - diskImageName: pytorch-mnist
      project: k8s-staging-jobset
machineType 配置

machineType 字段接受 Compute Engine 预定义机器类型(例如 n4-standard-32)或自定义机器类型字符串(例如 n4-custom-8-20480)。使用自定义机器类型需要 GKE 1.33.2-gke.1111000 版或更高版本。

您可以将其他 spec.priorities 字段与 machineType 字段一起指定,以声明方式定义计算要求,例如:

  • spot:使用 Spot 虚拟机。默认值为 false
  • storage:配置节点存储空间。
    • storage.bootDiskType:启动磁盘类型。 在 Autopilot 上,仅支持 bootDiskTypepd-balanced 类型。
    • storage.bootDiskKMSKey:用于启动磁盘加密的 Cloud KMS 密钥的路径。
    • storage.bootDiskSize:节点启动磁盘的大小(以 GB 为单位)。
    • storage.localSSDCount:要挂接到节点的本地 SSD 的数量。如果指定,则必须至少为 1

以下示例展示了使用 machineType 来预配 n4-standard-32 机器类型的优先级规则:

priorities:
- machineType: n4-standard-32
  spot: true
  storage:
    bootDiskType: pd-balanced
    bootDiskSize: 250
    localSSDCount: 2
    bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1
GPU 配置

如需在优先级规则中选择 GPU,请在优先级规则的 gpu 字段中指定 GPU 的类型、数量和驱动程序版本(可选)。支持以下字段:

  • gpu.type:GPU 类型,例如 nvidia-l4。如需了解详情,请参阅选择使用 Autopilot 或 Standard 的 GPU 支持
  • gpu.count:要挂接的 GPU 的数量。如需了解按 GPU 类型支持的数量,请参阅支持的 GPU 数量
  • gpu.driverVersion:要安装的 NVIDIA 驱动程序版本。必须为 defaultlatest。需要 GKE 1.31.1-gke.1858000 或更高版本。

您还可以结合使用 gpu 字段来指定其他 spec.priorities 字段,例如 Spot 虚拟机、存储选项预留

以下示例展示了针对 GPU 的规则:

priorities:
- gpu:
    type: nvidia-l4
    count: 1
  storage:
    secondaryBootDisks:
    - diskImageName: big-llm
      project: k8s-llm
  spot: true
TPU 配置

需要 GKE 1.31.2-gke.1518000 或更高版本

如需在优先级规则中选择 TPU,请在优先级规则的 tpu 字段中指定 TPU 的类型、数量和拓扑。以下字段是必填字段:

您还可以在优先级规则中将其他 spec.priorities 字段tpu 字段一起指定,例如:

  • spot:使用 Spot 虚拟机。默认值为 false
  • storage:配置节点存储空间。
    • storage.bootDiskType:启动磁盘类型。
    • storage.bootDiskKMSKey:用于启动磁盘加密的 Cloud KMS 密钥的路径。
    • storage.bootDiskSize:节点启动磁盘的大小(以 GB 为单位)。
  • reservations:使用 Compute Engine 预留。如需了解详情,请参阅使用 Compute Engine 预留部分。

以下示例展示了针对 TPU 的规则:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: tpu-class
spec:
  priorities:
  - tpu:
      type: tpu-v5p-slice
      count: 4
      topology: 4x4x4
    reservations:
      specific:
      - name: tpu-reservation
        project: reservation-project
      affinity: Specific
  - spot: true
    tpu:
      type: tpu-v5p-slice
      count: 4
      topology: 4x4x4
  nodePoolAutoCreation:
    enabled: true

此示例定义了以下后备行为:

  1. GKE 尝试使用来自 reservation-project 项目且名称为 tpu-reservation 的共享 Compute Engine 预留来预配 16 节点多主机 TPU v5p 切片。
  2. 如果预留没有可用的 TPU,GKE 会尝试在 Spot 虚拟机上预配 16 节点多主机 TPU v5p 切片。
  3. 如果上述规则均不满足,GKE 会遵循定义未应用优先级规则时的扩缩行为部分中的逻辑。

将 TPU 自定义 ComputeClass 部署到集群后,请在工作负载中选择该自定义 ComputeClass:

此外,对于 TPU 工作负载,您还可以执行以下操作:

加速器和机器配置规范

声明性加速器配置不需要明确指定 machineTypemachineFamily 字段,除非您将它们与预留结合使用。

节点池优先级规则

nodepools 字段接受 GKE 尝试在其中创建待处理 Pod 的现有节点池的列表。GKE 不会按顺序处理此字段中的值。您无法在同一优先规则项中将其他 spec.priorities 字段与 nodepools 字段一起使用,因为包含 nodepools 字段的规则本质上不是声明性的。只有 GKE Standard 模式支持此字段。如需了解用法详情,请参阅在 ComputeClass 定义中定位特定节点池

GKE 如何使用优先级规则创建节点

当您部署请求 ComputeClass 的工作负载且需要新节点时,GKE 会按顺序处理 ComputeClass 规范的 priorities 字段中的规则列表。

例如,请考虑以下规范:

spec:
  ...
  priorities:
  - machineFamily: n4
    spot: true
    minCores: 64
  - machineFamily: n4
    spot: true
  - machineFamily: n4
    spot: false

当您部署的工作负载按照这些优先级规则请求 ComputeClass 时,GKE 会按如下方式匹配节点:

  1. GKE 会将 Pod 放置在与此 ComputeClass 关联的任何现有节点上。
  2. 如果现有节点无法容纳 Pod,则 GKE 会预配新节点,这些节点使用 N4 机器系列,采用 Spot 虚拟机,并且至少具有 64 个 vCPU。
  3. 如果至少具有 64 个 vCPU 的 N4 Spot 虚拟机在相应区域中不可用,则无论核心数量如何,GKE 都会预配使用可以容纳相应 Pod 的 N4 Spot 虚拟机的新节点。
  4. 如果相应区域中没有可用的 N4 Spot 虚拟机,GKE 会预配新的按需 N4 虚拟机。
  5. 如果上述规则均不满足,GKE 会遵循定义未应用优先级规则时的扩缩行为部分中的逻辑。

优先级规则的默认值

您可以为 ComputeClass 规范的优先级规则中的某些字段设置默认值。如果特定规则中省略了相应字段,系统会应用这些默认值。您可以使用 ComputeClass 规范中的 priorityDefaults 字段设置这些默认值。

priorityDefaults 字段具有以下限制:

  • 需要 GKE 1.32.1-gke.1729000 或更高版本。
  • 与不包含任何字段的 nodepools 优先级规则不兼容。

如需详细了解您可以设置的默认值类型,请参阅 ComputeClass CustomResourceDefinition 中的 priorityDefaults 部分。

GKE Standard 节点池和 ComputeClass

如果您使用 GKE Standard 模式,则可能需要执行手动配置,以确保 ComputeClass Pod 按预期调度。

  • 由节点自动预配管理的节点池:无需手动配置。节点自动预配会自动为您执行 ComputeClass 配置步骤。如需了解详情,请参阅节点自动预配和 ComputeClass
  • 手动创建的节点池:需要手动配置。您必须向手动创建的节点池添加节点标签和节点污点,以将节点与特定 ComputeClass 相关联。如需了解详情,请参阅配置手动创建的节点池以使用 ComputeClass

配置手动创建的节点池以使用 ComputeClass

如果 GKE Standard 集群具有在不使用节点自动预配的情况下手动创建的节点池,则您必须配置这些节点池,将其与特定 ComputeClass 相关联。GKE 仅会将请求特定 ComputeClass 的 Pod 调度到与该 ComputeClass 关联的节点池中的节点上。此要求不适用于您配置为集群级默认设置的 ComputeClass。

通过节点自动预配创建的 GKE Autopilot 模式节点池和 GKE Standard 模式节点池会自动为您执行此配置。

如需将手动创建的节点池与 ComputeClass 相关联,您可以在创建或更新期间通过指定 --node-labels 标志和 --node-taints 标志向节点池添加节点标签和节点污点,如下所示:

  • 节点标签cloud.google.com/compute-class=COMPUTE_CLASS
  • 污点cloud.google.com/compute-class=COMPUTE_CLASS:NoSchedule

在这些属性中,COMPUTE_CLASS 是自定义 ComputeClass 的名称。

例如,以下命令会一起更新现有节点池并将节点池与 dev-class ComputeClass 相关联:

gcloud container node-pools update dev-pool \
    --cluster=example-cluster \
    --node-labels="cloud.google.com/compute-class=dev-class"

gcloud container node-pools update dev-pool \
    --cluster=example-cluster \
    --node-taints="cloud.google.com/compute-class=dev-class:NoSchedule"

您可以将集群中的每个节点池与一个自定义 ComputeClass 相关联。GKE 调度到这些手动创建的节点池上的 Pod 仅会在自动扩缩事件期间触发这些节点池内的节点创建。

节点自动预配和 ComputeClass

您可以将节点自动预配与自定义 ComputeClass 搭配使用,让 GKE 根据您的优先级规则自动创建和删除节点池。

如需将节点自动预配与 ComputeClass 搭配使用,您必须执行以下操作:

  1. nodePoolAutoCreation 字段(值为 enabled: true)添加到 ComputeClass 规范中。
  2. 除非您的集群已在快速渠道中注册并运行 GKE 1.33.3-gke.1136000 版或更高版本,否则您还必须启用节点自动预配

然后,GKE 可以将使用配置节点自动预配的 ComputeClass 的 Pod 放置在新节点池上。GKE 会根据集群大小和 Pod 要求等因素来决定是扩容现有的节点池还是创建新的节点池。具有未配置节点自动预配的 ComputeClass 的 Pod 会继续仅扩容现有节点池。

您可以将与节点自动预配交互的 ComputeClass 以及与同一集群中手动创建的节点池交互的 ComputeClass 结合使用。

请考虑以下与节点自动预配的交互:

  • 您无法使用机器家族Spot 虚拟机节点选择器,因为这些选择器与 ComputeClass 行为冲突。GKE 会拒绝任何请求 ComputeClass 并同时请求 Spot 虚拟机或特定机器系列的 Pod。
  • 如果您为集群设置了默认 ComputeClass,则使用机器家族节点选择器的 Pod 仅会在以下情况之一触发为该默认类进行节点创建:

    • Pod 选择与集群级默认类中的某条优先级规则相匹配的机器家族。例如,如果集群级默认类具有针对 N4 实例的优先级规则,则选择 N4 实例的 Pod 会触发节点创建。
    • 集群级默认 ComputeClass 的 spec.whenUnsatisfiable 字段中的值为 ScaleUpAnyway。即使 Pod 选择的机器家族不在 ComputeClass 优先级中,GKE 也会创建具有该机器家族的新节点。

    如果 Pod 选择的机器家族不在集群级默认类优先级中,并且 ComputeClass 的 whenUnsatisfiable 字段中的值为 DoNotScaleUp,则不会触发节点创建。

  • 您可以为使用 nodepools 字段引用现有节点池的 ComputeClass 配置节点自动预配。节点自动预配会按顺序处理优先级,并尝试扩容现有节点池以放置 Pod。

请考虑以下同时具有手动创建的节点池和节点自动预配功能的集群示例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - nodepools: [manually-created-pool]
  - machineFamily: n4
  - machineFamily: c4
  nodePoolAutoCreation:
    enabled: true

在此示例中,GKE 会尝试执行以下操作:

  1. manually-created-pool 节点池中创建新节点。
  2. 在现有 N4 节点池中或通过创建新节点池来预配 N4 节点。
  3. 如果 GKE 无法创建 N4 节点,则会尝试扩容现有的 C4 节点池或创建新的 C4 节点池。

在 ComputeClass 定义中定位特定节点池

借助 priorities.nodepools 字段,您可以指定手动创建的节点池列表,GKE 会尝试在使用集群自动扩缩的 GKE Standard 集群中按无特定顺序将 Pod 调度到这些节点池上。此字段仅支持节点池列表;您无法在同一优先级规则中指定其他机器属性(例如机器系列)。当您部署的工作负载请求具有已命名节点池的 ComputeClass 时,GKE 会尝试在这些节点池中调度待处理的 Pod。GKE 可能会在这些节点池中创建新节点来放置 Pod。

您必须使用节点标签和节点污点将 priorities.nodepools 字段中指定的节点池与该 ComputeClass 相关联,如为 ComputeClass 配置手动创建的节点池部分中所述。

您在 nodepools 字段中指定的节点池列表没有优先级。如需为已命名节点池配置回退顺序,您必须指定多个单独的 priorities.nodepools 项。例如,请考虑以下规范:

spec:
  ...
  priorities:
  - nodepools: [pool1, pool2]
  - nodepools: [pool3]

在此示例中,GKE 会先尝试将请求此 ComputeClass 的待处理 Pod 放置在使用此 ComputeClass 进行标记的节点池中的现有节点上。如果现有节点不可用,则 GKE 会尝试在 pool1pool2 中预配新节点。如果 GKE 无法在这些节点池中预配新节点,则会尝试在 pool3 中预配新 Pod。

定义未应用优先级规则时的扩缩行为

通过 ComputeClass 自定义资源,您可以指定在没有符合任何优先级规则的节点时 GKE 应执行的操作。规范中的 whenUnsatisfiable 字段支持以下值。

  • ScaleUpAnyway:创建一个使用集群的默认机器配置的新节点。在 1.33 之前的 GKE 版本中,如果您省略此字段,则这是默认行为。

    GKE 会执行以下操作之一:

    • 在 Autopilot 集群中,GKE 会将 Pod 放置在新节点或现有节点上,无论节点机器配置如何。
    • 在未使用节点自动预配的 Standard 集群中,GKE 会尝试扩容任何定义与给定 ComputeClass 匹配的标签和污点的手动创建节点池。
    • 在使用节点自动预配的 Standard 集群中,GKE 可能会创建一个使用默认 E2 机器系列的新节点池来放置 Pod。
  • DoNotScaleUp:让 Pod 保持 Pending 状态,直到有满足 ComputeClass 要求的节点可用。在 GKE 1.33 及更高版本中,如果您省略此字段,则这是默认行为。

请求布置政策

从 GKE 1.33.2-gke.1335000 版开始,在 GKE Autopilot 集群中,您可以将紧凑布置与自定义布置政策或工作负载政策搭配使用。如需了解详情,请参阅紧凑布置政策与工作负载政策的比较

布置政策和工作负载政策都会将节点放置在物理位置彼此靠近的位置,以缩短网络延迟时间。如需使用特定政策,请在 policyName 字段中提供其名称。该政策必须是 GKE 项目中已存在的 Compute Engine 资源政策。

请参考以下示例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n4
    placement:
      policyName: my-placement-policy
  nodePoolAutoCreation:
    enabled: true

在此配置中,GKE 会为使用此 ComputeClass 的所有工作负载应用紧凑布置政策,并根据名为 my-placement-policy 的现有资源政策预配其节点。

为节点整合设置自动扩缩参数

默认情况下,GKE 会移除在运行工作负载方面未得到充分利用的节点,并将这些工作负载整合到具有容量的其他节点上。对于所有 ComputeClass,这都是默认行为,因为使用 ComputeClass 的所有集群都必须使用集群自动扩缩器,或者是 Autopilot 集群。在节点整合期间,GKE 会排空未充分利用的节点,在另一个节点上重新创建工作负载,然后删除已排空的节点。

移除节点的时间和条件取决于自动扩缩配置文件。您可以使用自定义 ComputeClass 定义中的 autoscalingPolicy 部分,微调触发节点移除和工作负载整合的资源利用率过低阈值。您可以微调以下参数:

  • consolidationDelayMinutes:分钟数,在此之后,GKE 会移除未充分利用的节点
  • consolidationThreshold:CPU 和内存的利用率阈值(以节点可用资源的百分比表示)。只有当资源利用率低于此阈值时,GKE 才会考虑移除节点。
  • gpuConsolidationThreshold:GPU 的利用率阈值(以节点可用资源的百分比表示)。只有当资源利用率低于此阈值时,GKE 才会考虑移除节点。请考虑将此值设置为 1000,以便 GKE 整合挂接的 GPU 利用率未达到 100% 的所有节点。

请思考以下示例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n4
  - machineFamily: c4
  autoscalingPolicy:
    consolidationDelayMinutes: 5
    consolidationThreshold: 70

在此配置中,GKE 会在 5 分钟后移除未使用的节点,并且只有当节点的 CPU 和内存利用率均小于 70% 时,才会成为整合候选节点。

主动迁移

主动迁移是自定义 ComputeClass 中的一项可选自动扩缩功能,可自动将现有节点替换为新节点。系统会根据特定条件替换节点,具体取决于迁移类型。

发生主动迁移时,GKE 会创建新节点,然后排空并删除过时节点。迁移过程会逐步进行,以尽量减少工作负载中断。主动迁移需注意以下事项:

  • 活跃迁移不会迁移存储在永久性存储(例如 Compute Engine 永久性磁盘)中的数据。为最大限度降低数据丢失的风险,请勿在有状态工作负载使用的 ComputeClass 中启用主动迁移。
  • 如果您在 Standard 集群上启用了节点自动预配功能,并且如果现有节点池不符合自定义计算类中定义的条件,则主动迁移可能会触发新节点池的创建。
  • 主动迁移不会替换无法移除的节点。例如,如果替换节点会违反 --min-nodes 节点池设置,则主动迁移不会进行替换。
  • 为避免关键工作负载中断,主动迁移不会移动以下 Pod:
    • 设置 PodDisruptionBudget 的 Pod(如果移动操作会超出 PodDisruptionBudget)。
    • 具有 cluster-autoscaler.kubernetes.io/safe-to-evict: "false" 注解的 Pod。
  • 使用具有可用区级资源(例如 Hyperdisk)的永久性卷的工作负载可能无法很好地与活跃迁移搭配使用。某些 Hyperdisk 产品的可用区限制和机器类型限制可能会降低活跃迁移的有效性。此外,某些有状态工作负载可能无法承受活跃迁移造成的中断。
  • 如果您更新现有 ComputeClass 以启用主动迁移,GKE 会随着时间的推移将现有 Pod 迁移到新节点。

支持以下类型的主动迁移:

对主动迁移到优先级更高的节点进行配置

您可以配置主动迁移,以将 ComputeClass 后备优先级列表中级别较低的现有节点替换为该优先级列表中级别较高的新节点。此配置有助于确保所有正在运行的 Pod 最终都会在该 ComputeClass 的最优先节点上运行,即使 GKE 最初必须在次优先的节点上运行这些 Pod 也是如此。

请考虑以下 ComputeClass 规范示例,其中 N4 节点的优先级高于 C4 节点:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n4
  - machineFamily: c4
  activeMigration:
    optimizeRulePriority: true

如果您使用此 ComputeClass 部署 Pod 时 N4 节点不可用,则 GKE 使用了 C4 节点作为后备选项。如果稍后可以预配 N4 节点(例如,您的配额增加或 N4 虚拟机在您所在的位置可用),GKE 会创建新的 N4 节点,并将 Pod 从现有的 C4 节点逐步迁移到新的 N4 节点。然后,GKE 会删除过时的 C4 节点。

配置主动迁移以运行无法调度的 DaemonSet Pod

您可以配置主动迁移,以自动将具有无法调度的 DaemonSet Pod 的现有节点替换为能够运行所有所需 DaemonSet Pod 的更大节点。

请考虑以下 ComputeClass 规范示例:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-class
spec:
  priorities:
  - machineFamily: n1
  activeMigration:
    ensureAllDaemonSetPodsRunning: true

例如,如果部署具有此 ComputeClass 的 Pod 导致 n1-standard-2 机器扩容,并且您稍后部署了请求两个 CPU 的 DaemonSet,则主动迁移会将 n1-standard-2 节点替换为同一 n1 机器家族中更大的节点(例如 n1-standard-4),以便为所有 Pod 创建足够的空间。

使用 Compute Engine 预留

在 GKE 1.31.1-gke.2105000 及更高版本中可用

如果您使用 Compute Engine 容量预留来提高特定Google Cloud 可用区中硬件可用性的保障水平,则可以在自定义 ComputeClass 中配置每个后备优先级,以便 GKE 在创建新节点时使用预留。

在自定义 ComputeClass 中使用预留有以下要求:

  • Standard 模式集群必须使用节点自动预配,以便 GKE 使用预留来创建新节点。如需了解详情,请参阅节点自动预配和 ComputeClass 部分。您还可以在集群中手动创建节点池时继续使用预留。
  • 只有在定义了 machineTypemachineFamily 时,才能使用非 TPU 预留。
  • 配置本地 SSD 的 ComputeClass 必须使用 machineType 优先级规则,而非 machineFamily。如需了解详情,请参阅 machineType 规则类型部分。
  • 为挂接了本地 SSD 的 machineType 指定预留的 ComputeClass 必须明确包含 localSSDCount: 字段。

请考虑以下 ComputeClass 规范示例,其中会在预配 a3-highgpu-1g 实例时优先使用特定的共享预留。如果优先级较高的实例类型不可用,GKE 随后会回退到规范中的任何匹配预留:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: accelerator-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineType: a3-highgpu-1g
    storage:
      localSSDCount: 2
    gpu:
      type: nvidia-h100-80gb
      count: 1
    reservations:
      specific:
      - name: a3-shared-reservation
        project: reservation-project
      affinity: Specific
  - machineType: a3-highgpu-1g
    storage:
      localSSDCount: 2
    gpu:
      type: nvidia-h100-80gb
      count: 1
    reservations:
      affinity: AnyBestEffort
  whenUnsatisfiable: DoNotScaleUp

如果您部署使用 accelerator-reservations ComputeClass 的 Pod,GKE 会先尝试在创建新 a3-highgpu-1g 实例以运行 Pod 时使用 a3-shared-reservation 预留。如果此特定预留没有可用容量,GKE 会尝试使用任何匹配的预留来扩容 a3-highgpu-1g 实例。如果无法访问任何预留,GKE 会回退到 a3-highgpu-1g Spot 虚拟机。最后,如果没有可用的 Spot 虚拟机,扩缩操作会失败。

在此示例中,由于 a3-highgpu-1g 机器配置包含本地 SSD,因此具有预留参考的两个优先级规则都明确要求提供 localSSDCount: 字段。

以下示例展示了一个共享的特定预留,该预留会回退到 Spot 虚拟机,然后最终回退到按需虚拟机:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: shared-specific-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineFamily: n4
    reservations:
      specific:
      - name: n4-shared-reservation
        project: reservation-project
      affinity: Specific
  - machineFamily: n4
    spot: true
  - machineFamily: n4
  whenUnsatisfiable: DoNotScaleUp

您可以使用以下类型的预留:

  • 特定单项目预留:配置以下字段:

    • reservations.specific.name:预留名称。
    • reservations.affinity:必须为 Specific
  • 特定共享预留:配置以下字段:

    • reservations.specific.name:预留名称。
    • reservations.specific.project:拥有预留的项目的项目 ID。
    • reservations.affinity:必须为 Specific
  • 任何匹配的预留:配置以下字段:

    • reservations.affinity:必须为 AnyBestEffort
    • 请勿设置预留名称或项目。

TPU 预留需要特定亲和性。不支持 reservations.affinity: AnyBestEffort

如果 GKE 无法在预留中找到可用容量,则产生的行为取决于在 ComputeClass 优先级规则中选择的预留类型,如下所示:

  • 特定预留:GKE 会尝试 ComputeClass 中的下一个优先级规则。
  • 任何匹配的预留:GKE 会尝试预配符合该优先级规则要求的按需节点。如果 GKE 无法预配按需节点,则会尝试 ComputeClass 中的下一个优先级规则。

如果 GKE 无法满足 ComputeClass 的任何优先级规则的要求,则会发生未应用规则时的行为

使用特定预留区块

从 GKE 1.31.4-gke.1072000 版开始,您可以在硬件支持的预留中指定特定的预留区块。此功能适用于 A3 UltraA4 机器类型。

如需使用特定预留区块,请按此示例所示配置 ComputeClass 资源:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: specific-reservations
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineFamily: a3
    gpu:
      type: nvidia-h200-141gb
      count: 8
    reservations:
      specific:
      - name: a3ultra-specific-reservation
        reservationBlock:
          name: RESERVATION_BLOCK_NAME
      affinity: Specific

RESERVATION_BLOCK_NAME 替换为目标预留区块名称。

从 GKE 1.33.1-gke.1788000 版开始,您可以在预留区块内指定特定的预留子区块。此功能适用于 A4X 机器类型。

如需使用特定预留子区块,请按使用特定预留子区块中的示例所示配置 ComputeClass 资源。

使用此功能时,请注意以下事项:

  • 这些功能仅适用于单个项目或共享项目中的特定预留

自定义节点系统配置

您可以使用 ComputeClass 规范中的 nodeSystemConfig 字段来自定义 kubelet 和 Linux 内核中的某些参数。您可以在定义 Compute Engine 机器系列或机器类型的任何优先级规则中指定此字段。您还可以通过在计算类的 priorityDefaults 字段中添加 nodeSystemConfig 字段,为优先级规则中省略的任何节点系统配置字段设置默认全局值。

GKE 1.32.1-gke.1729000 版及更高版本中提供此功能。

如需了解详情,请参阅以下页面:

集群和命名空间的默认 ComputeClass

您可以将 GKE 配置为默认将 ComputeClass 应用于未选择特定 ComputeClass 的 Pod。您可以为特定命名空间或整个集群定义默认 ComputeClass。如需详细了解如何使用默认类配置集群或命名空间,请参阅默认将 ComputeClass 应用于 Pod

对节点池进行分组

从 GKE 1.32.2-gke.1359000 版开始,您可以使用 ComputeClass 规范中的 nodePoolGroup 字段将多个节点池分组为一个名为集合的逻辑单元。通过此分组,您可以将共享配置应用于多个节点池。

TPU 多主机集合

您可以对 TPU 多主机部署进行分组,以便为集合中的所有节点池设置服务等级目标 (SLO)。如需对节点池进行分组,请在 nodePoolGroup 字段中指定组的名称。使用此 ComputeClass 预配的所有节点池都属于同一组。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: tpu-multi-host-collection
spec:
  nodePoolGroup:
    name: my-tpu-collection
  ...

详情请参阅以下内容:

节点池配置

借助 ComputeClass 规范中的 nodePoolConfig 字段,您可以应用配置,该配置会反映在使用该类创建的节点池内的所有节点中。

指定映像类型

您可以使用 imageType 字段指定节点池中节点的基本操作系统。借助此字段,您可以为将在节点上运行的节点池选择映像类型。如果省略此字段,则默认值为 cos_containerd。以下示例展示了如何在 ComputeClass 中指定 imageType

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: my-node-pool-config
spec:
  nodePoolConfig:
    imageType: cos_containerd

如需了解详情,请参阅节点映像

服务账号

serviceAccount 字段用于指定由 ComputeClass 管理的节点池内节点所使用的 Google Cloud 服务账号。以下示例展示了如何在 ComputeClass 中指定 serviceAccount

spec:
  nodePoolConfig:
    serviceAccount: my-service-account@my-project.iam.gserviceaccount.com

如需了解详情,请参阅 GKE 中的服务账号简介

为 TPU SLO 定义工作负载类型

从 GKE 1.32.2-gke.1359000 版开始,您可以使用 nodePoolConfig 中的 workloadType 字段为 TPU 工作负载定义服务等级目标 (SLO)。此字段中的值会告知 GKE 关于 TPU 资源的预期用途。workloadType 字段支持以下值:

  • HIGH_AVAILABILITY:对于注重可用性的工作负载(例如推理服务),请使用此值来限制和简化中断。
  • HIGH_THROUGHPUT:对于需要所有底层基础架构在大部分时间运行才能取得进展的批量作业或训练作业,请使用此值。仅当还指定了 nodePoolGroup 时,才能使用此值。

以下示例定义了一个多主机 TPU 集合的 ComputeClass,该 ComputeClass 针对高可用性推理工作负载进行了优化。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: multi-host-inference
spec:
  nodePoolGroup:
    name: my-inference-collection
  nodePoolConfig:
    workloadType: HIGH_AVAILABILITY
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - tpu:
      type: tpu-v6e-slice
      topology: 2x4

如需了解详情,请参阅以下页面:

在工作负载中请求 ComputeClass

如需使用自定义 ComputeClass,您的 Pod 必须在 Pod 规范中使用 nodeSelector 明确请求该 ComputeClass。您可以选择将 ComputeClass 设置为特定 Kubernetes 命名空间的默认设置。该命名空间中的 Pod 会使用该 ComputeClass,除非 Pod 请求了其他 ComputeClass。

例如,以下清单请求 cost-optimized ComputeClass:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-workload
spec:
  replicas: 2
  selector:
    matchLabels:
      app: custom-workload
  template:
    metadata:
      labels:
        app: custom-workload
    spec:
      nodeSelector:
        cloud.google.com/compute-class: cost-optimized
      containers:
      - name: test
        image: gcr.io/google_containers/pause
        resources:
          requests:
            cpu: 1.5
            memory: "4Gi"

用于系统节点标签的节点选择器

GKE 会向节点添加系统标签,以按机器类型、挂接的硬件加速器或启动磁盘类型等条件来识别节点。这些系统标签的标签键中包含以下某个前缀:

  • k8s.io
  • cloud.google.com
  • gke.io

在 GKE 1.32.3-gke.1499000 版及更高版本中,您可以部署同时使用节点选择器选择系统标签和 ComputeClass 的工作负载。如果您在选择计算类的 Pod 中选择系统标签,请验证这些 Pod 是否按预期调度。ComputeClass 的配置与 Pod 中的节点选择器之间的冲突可能会导致以下问题:

  • GKE 无法创建使用 ComputeClass 最高优先级配置的节点。
  • Pod 将保持 Pending 状态。

GKE 还会拒绝选择 ComputeClass 规范中具有相应字段的任何 Pod。使用计算类时,更新工作负载以从节点选择器中移除以下标签,并在您创建的 ComputeClass 中配置相应字段:

节点标签 ComputeClass 字段
cloud.google.com/machine-family priorities.machineFamily
cloud.google.com/machine-type priorities.machineType
cloud.google.com/gke-spot priorities.spot
cloud.google.com/gke-accelerator priorities.gpu.type
cloud.google.com/gke-gpu-driver-version priorities.gpu.driverVersion
cloud.google.com/reservation-name priorities.reservations.specific.name
cloud.google.com/reservation-project priorities.reservations.specific.project
cloud.google.com/reservation-affinity priorities.reservations.affinity
cloud.google.com/gke-ephemeral-storage-local-ssd priorities.storage.localSSDCount
cloud.google.com/gke-boot-disk priorities.storage.bootDiskType
cloud.google.com/gke-boot-disk-size priorities.storage.bootDiskSize
cloud.google.com/gke-node-pool-group-name nodePoolGroup.name
cloud.google.com/gke-workload-type nodePoolConfig.workloadType

后续步骤