GKE ComputeClass 简介


您可以使用 ComputeClasses 定义一组节点属性和自动扩缩设置,供 Google Kubernetes Engine (GKE) 用于创建节点来运行 Pod。本页介绍了 ComputeClass 的工作原理、使用情形和优势,以及可用的 ComputeClass 类型。

此信息适用于以下人员:

  • 希望减少与集群基础架构管理相关的开销的云架构师和平台工程师。
  • 应用运维人员和 SRE,他们希望专注于工作负载的运维,而无需考虑底层基础架构。

ComputeClass 和集群自动扩缩简介

ComputeClass 是一组节点属性和自动扩缩设置,以 Kubernetes API 对象的形式存在于 GKE 集群中。您可以在部署的任何 Kubernetes 工作负载中选择 ComputeClass。GKE 集群自动扩缩功能使用 ComputeClass 中的属性为工作负载创建节点。

平台工程师可以使用 ComputeClass 为各种类型的工作负载配置基础架构,以便每个新节点都针对应用的特定要求进行优化。ComputeClass 可提高 GKE 自动扩缩的速度和灵活性,并为您提供一种声明式方法来配置集群中的基础架构选项。如需了解详情,请参阅使用 ComputeClasses 的优势部分。

某些特定的 GKE 功能和特性仅适用于 ComputeClass,例如:

  • 回退计算优先级:在 ComputeClass 中定义多组基础设施配置,并根据您的偏好设置确定优先级。在扩缩期间,如果最优先配置不可用,GKE 会回退到下一个配置。
  • 主动迁移到优先级更高的节点:配置后,GKE 会随时间自动将回退优先级列表中级别较低的节点替换为该列表中级别较高的节点。这样一来,您的 Pod 最终会在 ComputeClass 中最优先的节点上运行,即使在您创建工作负载时该硬件不可用也是如此。
  • GKE Standard 中的 Autopilot:在 GKE Autopilot 模式下运行工作负载,即使在 Standard 集群中也能使用 Autopilot 功能,例如容器优化型计算平台和基于 Pod 的结算。GKE 会管理这些节点和工作负载,让您在任何集群中都能享受到 Autopilot 模式的优势。

ComputeClasses 的优势

ComputeClasses 可为平台管理员和运维人员带来以下优势:

  • 资源获取能力更强:ComputeClass 扩展了 GKE 集群自动扩缩的功能。ComputeClass 功能(例如回退优先级和节点整合参数)可以降低 Pod 陷入“待处理”状态的风险,并增加可用于扩缩节点的选项范围。
  • 声明式平台级配置:借助 ComputeClass,平台工程师可以声明式地描述各种工作负载类型的节点配置。GKE 自动扩缩功能可管理节点和节点池的创建与配置。您可以将 ComputeClass 集成到 CI/CD 流水线中,以确保整个平台中预配的基础设施保持一致。
  • 降低管理开销:ComputeClass 可降低大规模管理基础架构和工作负载的复杂性。平台工程师声明基础设施类,应用运维人员在工作负载中选择相关类。GKE 会管理扩缩、节点硬件配置,并应用污点、容忍和标签。

ComputeClass 自定义资源简介

ComputeClass 是 Kubernetes 自定义资源。您可以在清单文件中定义 ComputeClass 的规范,并在集群中创建该规范,这与定义和创建 Kubernetes 工作负载资源(例如 Deployment 和 Service)的方式类似。

以下示例清单定义了一个名为 n4 的 ComputeClass:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: n4
spec:
  nodePoolAutoCreation:
    enabled: true
  priorities:
  - machineFamily: n4
  - machineFamily: n2
  whenUnsatisfiable: DoNotScaleUp

当 Pod 选择此 ComputeClass 时,GKE 在创建新节点时会执行以下操作:

  1. GKE 会创建使用 N4 机器系列的节点。
  2. 如果 N4 机器系列不可用,GKE 会创建使用 N2 机器系列的节点。
  3. 如果 N2 机器系列不可用,GKE 会等待资源可用,然后调度 Pod。

您可以使用 ComputeClass 控制节点的各种设置,包括加速器、节点系统设置、节点位置以及在硬件资源不可用时 GKE 的回退行为。如需详细了解 ComputeClass 的所有可用配置,请参阅 ComputeClass CustomResourceDefinition

工作负载中的 ComputeClass 选择

如需为 GKE 工作负载使用 ComputeClass,您可以在工作负载清单中使用 cloud.google.com/compute-class 标签的节点选择器来选择 ComputeClass。

以下示例 Deployment 清单选择了一个 ComputeClass:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      labels:
        app: hello
    spec:
      nodeSelector:
        # Replace with the name of a compute class
        cloud.google.com/compute-class: COMPUTE_CLASS 
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "250m"
            memory: "4Gi"

COMPUTE_CLASS 替换为集群中存在的 ComputeClass 的名称。例如,您可以指定关于 ComputeClass 自定义资源部分中的 n4 ComputeClass,也可以指定 autopilot 内置 ComputeClass

工作负载规范中的节点配置

借助 GKE Autopilot 集群和 GKE Standard 中的节点自动预配功能,您可以在 Pod 中使用节点选择器来创建具有特定属性(例如机器家族、Spot 虚拟机或 GPU 和 TPU)的节点。借助 ComputeClass,您可以集中定义这些要求,而无需为每个工作负载添加单独的选择器。

关于默认应用 ComputeClasses

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

下表介绍了将 ComputeClass 设置为命名空间或集群的默认值所带来的影响:

默认 ComputeClass 的效果
命名空间级默认值
  • GKE 仅将 ComputeClass 应用于特定命名空间中的 Pod。
  • GKE 会修改 Pod,以添加命名空间级默认类的节点选择器。
  • GKE 仅会扩容具有相应 ComputeClass 的节点标签和节点污点的节点,与其他任何计算类类似。
  • GKE 会向为命名空间级默认类创建的节点添加节点标签和节点污点。
集群级默认值
  • GKE 会将 ComputeClass 应用于任何命名空间中的 Pod。
  • GKE 仅将 ComputeClass 应用于没有现有 ComputeClass 选择器的 Pod。
  • GKE 不会修改 Pod 规范来为集群级默认类添加节点选择器。
  • GKE 会扩缩满足以下任一条件的节点:
    • 节点没有其他计算类的标签和污点。
    • 节点具有 cloud.google.com/compute-class: default 节点标签。
  • GKE 会将 cloud.google.com/compute-class: default 节点标签添加到 GKE 为集群级默认类创建的节点。GKE 不会向这些节点添加任何节点污点。
  • 如果您更新 Autopilot 集群以使用自定义计算类作为集群级默认设置,GKE 默认不会在 Autopilot 容器优化计算平台上运行 Pod。在 GKE 1.33.1-gke.1107000 版及更高版本中,您可以通过将 cloud.google.com/compute-class: autopilot 节点选择器添加到特定 Pod,为这些 Pod 使用 Autopilot 计算平台。

如果 GKE 将命名空间级默认 ComputeClass 应用于 Pod,则该 Pod 不会激活集群级默认 ComputeClass,因为 GKE 会为命名空间级默认类向 Pod 添加节点选择器。

集群级默认 ComputeClass

启用集群级默认 ComputeClass 时,名为 defaultComputeClass 对象会定义集群的节点自动扩缩规则。如果您的集群已具有名为 default 的 ComputeClass,则 GKE 会使用该 ComputeClass 配置来配置集群。如果集群没有名为 default 的自定义 ComputeClass,GKE 的行为就好像应用了以下 ComputeClass 规则一样:

spec:
  whenUnsatisfiable: ScaleUpAnyway
  nodePoolAutoCreation:
    enabled: true

默认情况下,GKE 不会应用任何回退行为,也不会更改自动扩缩节点的配置。如需默认将特定属性应用于自动扩缩的节点,您必须部署名为 default 的自定义 ComputeClass。

配置默认的集群级计算类时,请考虑以下事项:

  • 为防止 Pod 卡在 Pending 状态,请将 spec.whenUnsatisfiable 字段设置为 ScaleUpAnyway。此值可让 GKE 创建节点,即使 Pod 请求的 Compute Engine 机器系列不在集群级默认类的优先级规则中也是如此。如果您想强制这些 Pod 使用默认 ComputeClass 中的机器系列,请将此字段设置为 DoNotScaleUp
  • 如需限制对 default ComputeClass 的更改,请使用 RBAC ClusterRole 来限制对名为 defaultComputeClass 资源的 updatepatchdeletecreate 操作。
  • 如需更改集群自动扩缩器的默认节点整合参数,请使用 ComputeClass 规范中的 spec.autoscalingPolicy 字段。您在集群级默认 ComputeClass 中为此字段指定的参数适用于集群中的所有节点。如需了解详情,请参阅为节点整合设置自动扩缩参数

后续步骤