自定义计算类简介


本页介绍了如何使用自定义计算类来控制 Google Kubernetes Engine (GKE) 在自动扩缩集群时预配的节点的属性。本文档适用于希望以声明方式为节点定义自动扩缩配置文件,以使特定工作负载在满足其要求的硬件上运行的平台管理员。

计算类概览

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

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

自定义计算类的优势

自定义计算类具有以优势:

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

自定义计算类的应用场景

请考虑在如下场景中使用自定义计算类:

  • 您希望在特定 GPU 配置上运行 AI/机器学习工作负载。
  • 您希望为特定团队运行的工作负载设置默认硬件配置,从而降低应用运维人员的开销。
  • 您运行的工作负载在特定 Compute Engine 机器系列或硬件配置上可实现最佳性能。
  • 您想要声明满足特定业务要求(例如高性能、费用优化或高可用性)的硬件配置。
  • 您希望 GKE 在计算资源不可用期间以分层方式回退到使用特定的硬件配置,以便工作负载始终在满足其要求的机器上运行。
  • 您希望在整个企业舰队中集中确定最佳配置,以便费用更容易预测且工作负载运行更可靠。

限制

您无法在 Autopilot 模式或自动预配的 Standard 模式节点池中将自定义计算类与 Compute Engine 容量预留搭配使用。手动创建的 Standard 模式节点池支持容量预留。

自定义计算类的工作原理

自定义计算类是用于预配 Google Cloud 基础设施的 Kubernetes 自定义资源。您可以在集群中定义 ComputeClass 对象,然后在工作负载中请求该计算类,或将该计算类设置为 Kubernetes 命名空间的默认计算类。当您部署请求计算类的工作负载时,GKE 会尝试将 Pod 放置在满足计算类要求的节点上。

为了确保自定义计算类针对舰队进行了优化,请考虑以下准则:

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

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

如需查看 ComputeClass 自定义资源的完整自定义资源定义 (CRD),请运行以下命令:

kubectl describe crd computeclasses.cloud.google.com

输出会显示整个 CRD,包括所有支持的字段以及字段之间的关系。如需更好地了解自定义计算类,请在阅读本文档时参考此定义。

规划自定义计算类

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

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

选择回退计算优先级

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

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

优先级规则

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

根据优先级规则的类型,您可以指定其他机器属性(例如 Spot 虚拟机或最小 CPU 容量),以供 GKE 在预配节点时使用。priorities 字段支持以下优先级规则类型:

  • machineFamily:使用 Compute Engine 机器系列(例如 n2c3)定义节点。
  • machineType:使用预定义的 Compute Engine 机器类型(例如 n2-standard-4)定义节点。
  • nodepools:在 GKE Standard 集群中,提供 GKE 应在其中预配节点且与计算类关联的手动创建的节点池列表。

machineFamily 规则类型

machineFamily 字段接受 Compute Engine 机器系列,例如 n2c3。如果未指定,则默认值为 e2。您可以将以下字段与 machineFamily 规则类型结合使用:

  • spot:Spot 虚拟机。默认值为 false
  • minCores:每个节点的 vCPU 数下限。默认值为 0
  • minMemoryGb:每个节点的最小内存。默认值为 0
  • storage.bootDiskKMSKey:用于启动磁盘加密的 Cloud Key Management Service 密钥的路径。

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

priorities:
- machineFamily: n2
  spot: true
  minCores: 16
  minMemoryGb: 64
  storage:
    bootDiskKMSKey: projects/example/locations/us-central1/keyRings/example/cryptoKeys/key-1

machineType 规则类型

machineType 字段接受 Compute Engine 预定义机器类型,例如 n2-standard-32。该机器类型必须支持您指定的任何 GPU。

您可以将以下字段与 machineType 规则类型结合使用:

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

以下示例展示了 n2-standard-32 机器类型的 machineType 规则:

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

以下示例展示了 GPU 的 machineType 规则:

priorities:
- machineType: g2-standard-16
  spot: false
  gpu:
    type: nvidia-l4
    count: 1

nodepools 规则类型

nodepools 字段接受 GKE 尝试在其中创建待处理 Pod 的现有节点池的列表。GKE 不会按顺序处理此字段中的值。您不能在同一优先级规则项中同时指定此字段和其他机器属性。只有 GKE Standard 模式支持此字段。如需了解使用详情,请参阅在计算类定义中定位特定节点池

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

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

例如,请考虑以下规范:

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

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

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

GKE Standard 节点池和计算类

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

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

配置手动创建的节点池以供计算类使用

如果 GKE Standard 集群具有在不使用节点自动预配的情况下手动创建的节点池,则您必须配置这些节点池,将其与特定计算类相关联。GKE 仅会将请求特定计算类的 Pod 调度到与该计算类关联的节点池中的节点上。通过节点自动预配创建的 GKE Autopilot 模式节点池和 GKE Standard 模式节点池会自动为您执行此配置。

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

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

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

例如,以下命令会更新现有节点池并将其与 dev-class 计算类相关联:

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

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

节点自动预配和计算类

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

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

  1. 确保您已在集群中启用节点自动预配功能。
  2. 将值为 enabled: truenodePoolAutoCreation 字段添加到 ComputeClass 规范中。

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

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

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

  • 您无法使用机器家族Spot 虚拟机节点选择器,因为这些选择器与计算类行为冲突。GKE 会拒绝任何请求计算类同时请求 Spot 虚拟机或特定机器系列的 Pod。
  • 您可以为使用 nodepools 字段引用现有节点池的计算类配置节点自动预配。节点自动预配会按顺序处理优先级,并尝试扩容现有节点池以放置 Pod。

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

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

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

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

在计算类定义中定位特定节点池

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

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

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

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

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

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

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

  • ScaleUpAnyway:创建一个使用集群的默认机器配置的新节点。这是默认行为。
    • 在 Autopilot 集群中,无论节点机器配置如何,GKE 都会将 Pod 放置在新节点或现有节点上。
    • 在未使用节点自动预配的 Standard 集群中,GKE 会尝试扩容任何手动创建的节点池,以定义与给定计算类匹配的标签和污点。
    • 在使用节点自动预配的 Standard 集群中,GKE 可能会创建一个使用默认 E2 机器系列的新节点池来放置 Pod。
  • DoNotScaleUp:让 Pod 保持 Pending 状态,直到有满足计算类要求的节点可用。

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

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

移除节点的时间和条件取决于自动扩缩配置文件。您可以使用自定义计算类定义中的 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: n2
  - machineFamily: n2d
  autoscalingPolicy:
    consolidationDelayMinutes: 5
    consolidationThreshold: 70

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

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

主动迁移是自定义计算类中的一项可选自动扩缩功能,可自动将计算类回退优先级列表中级别较低的现有节点替换为该优先级列表中级别较高的新节点。这样可确保所有正在运行的 Pod 最终都会在该计算类的最优先节点上运行,即使 GKE 最初必须在次优先的节点上运行这些 Pod 也是如此。

发生主动迁移时,GKE 会根据计算类优先级规则创建新节点,然后排空并删除优先级较低的过时节点。迁移会逐步进行,以最大限度地减少工作负载中断。主动迁移需注意以下事项:

  • 主动迁移仅适用于使用 machineFamily 优先级规则类型的计算类。如果您的计算类具有 nodepoolsmachineType 优先级规则,则不支持主动迁移。
  • 如果您在 Standard 集群上启用了节点自动预配功能,并且如果现有节点池不符合自定义计算类中定义的优先级较高的条件,则主动迁移可能会触发新节点池的创建。
  • 为避免关键工作负载中断,主动迁移不会移动以下 Pod:
    • 设置 PodDisruptionBudget 的 Pod(如果移动操作会超出 PodDisruptionBudget)。
    • 具有 cluster-autoscaler.kubernetes.io/safe-to-evict: "false" 注解的 Pod。

请考虑以下计算类规范示例,其中 N2 节点的优先级高于 E2 节点:

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

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

在工作负载中请求计算类

如需在完成自定义计算类设计后使用该计算类,Pod 必须在 Pod 规范中明确请求该计算类。您可以视情况将计算类设置为特定 Kubernetes 命名空间中的默认计算类,在这种情况下,该命名空间中的 Pod 会使用该计算类,除非 Pod 请求了其他计算类。

如需了解如何在 GKE 中请求和使用计算类,请参阅使用自定义计算类控制自动扩缩的节点属性

后续步骤