使用自定义计算类控制自动扩缩的节点属性


本页面介绍了如何使用自定义计算类,根据工作负载的特定需求控制 Google Kubernetes Engine (GKE) 集群的计算基础设施和自动扩缩行为。您应该已经熟悉自定义计算类的概念。如需了解详情,请参阅自定义计算类简介

本页面适用于希望以声明方式为节点定义自动扩缩配置文件的平台管理员,以及希望在特定计算类上运行其工作负载的集群运营商。

自定义计算类简介

自定义计算类是 Kubernetes 自定义资源,可让您在预配节点以运行工作负载时为 GKE 定义要遵循的优先级。您可以使用自定义计算类执行以下操作:

  • 为 GKE 提供一组优先级,以便在预配节点时按顺序遵循这些优先级,每个节点都具有特定参数,例如 Compute Engine 机器系列或最小资源容量
  • 定义自动扩缩阈值和参数,以移除未充分利用的节点并在现有计算容量上高效整合工作负载
  • 指示 GKE 自动将次优先节点配置替换为更优先的节点配置,以实现最佳工作负载性能

如需了解所有配置选项及彼此如何进行交互,以及如何与 GKE Autopilot 模式和 GKE Standard 模式交互,请参阅自定义计算类简介

价格

在 GKE 中,使用 ComputeClass 自定义资源无需额外付费。需要注意以下价格事项:

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 确保您已有运行 1.30.3-gke.1451000 版或更高版本的 GKE 集群。如需了解详情,请参阅创建 Autopilot 集群
  • 如果您使用的是 Standard 模式集群,请确保您至少有一个启用了自动扩缩功能的节点池,或者您的集群使用节点自动预配功能。

计算类的示例场景

本页面展示了一个示例场景,您需要为其定义自定义计算类。在实践中,您应考虑特定工作负载和组织的要求,并定义满足这些要求的计算类。如需查看计算类的所有选项的完整说明并了解特殊注意事项,请参阅自定义计算类简介

请考虑以下示例场景:

  • 您的目标是优化工作负载的运行费用
  • 您的工作负载具有容错性,不需要优雅关停或延长运行时
  • 您的工作负载至少需要 64 个 vCPU 才能以最佳状态运行
  • 您只能使用 N2 Compute Engine 机器系列

根据示例场景,您决定需要一个计算类来执行以下操作:

  • 优先使用至少具有 64 个 vCPU 的 N2 Spot 节点
  • 让 GKE 回退到任何 N2 Spot 节点,无论计算容量如何
  • 如果没有可用的 N2 Spot 节点,则让 GKE 使用按需 N2 节点
  • 指示 GKE 在工作负载再次可用时将工作负载移至 Spot 节点

在 Autopilot 模式下配置计算类

在 GKE Autopilot 中,您可以定义计算类、将其部署到集群,并在工作负载中请求该计算类。GKE 会为您执行所有节点配置步骤,例如应用标签和污点。

将以下清单保存为 compute-class.yaml

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodePoolAutoCreation:
    enabled: true

在 Standard 模式下配置计算类

在 GKE Standard 模式集群中,您可以定义计算类,之后可能需要执行手动配置,以确保计算类 Pod 按预期调度。手动配置取决于是否自动预配节点池,如下所示:

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

将计算类与手动创建的节点池搭配使用

本部分介绍如何在仅使用手动创建的节点池的集群中定义计算类。

  1. 将以下清单保存为 compute-class.yaml

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: cost-optimized
    spec:
      priorities:
      - machineFamily: n2
        spot: true
        minCores: 64
      - machineFamily: n2
        spot: false
      activeMigration:
        optimizeRulePriority: true
    
  2. 创建一个使用 Spot 虚拟机的新自动扩缩的节点池,并将其与计算类关联:

    gcloud container node-pools create cost-optimized-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-standard-64 \
        --spot \
        --enable-autoscaling \
        --max-nodes=9 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

    替换以下内容:

    • LOCATION:您的集群的位置。
    • CLUSTER_NAME:现有集群的名称。
  3. 创建一个具有按需虚拟机的新自动扩缩的节点池,并将其与计算类关联:

    gcloud container node-pools create on-demand-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-standard-64 \
        --enable-autoscaling \
        --max-nodes=9 \
        --num-nodes=0 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

当您部署请求此计算类的 Pod 并且需要创建新节点时,GKE 会优先在 cost-optimized-pool 节点池中创建节点。如果无法创建新节点,GKE 会在 on-demand-pool 节点池中创建节点。

如需详细了解手动创建的节点池如何与自定义计算类进行交互,请参阅配置手动创建的节点池以供计算类使用

将计算类与自动预配的节点池搭配使用

本部分介绍如何在使用节点自动预配功能的集群中定义计算类。

将以下清单保存为 compute-class.yaml

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodePoolAutoCreation:
    enabled: true

当您部署请求此计算类的 Pod 并且需要创建新节点时,GKE 会优先根据 priorities 字段中的排序项创建节点。如果需要,GKE 会创建满足计算类的硬件要求的新节点池。

如需详细了解节点自动预配如何与自定义计算类搭配使用,请参阅节点自动预配和计算类

为节点整合自定义自动扩缩阈值

默认情况下,GKE 会移除利用率过低的节点,并将您的工作负载重新调度到其他可用节点上。您可以通过在计算类定义中使用 autoscalingPolicy 字段,进一步自定义节点成为移除候选节点所需达到的阈值和时间,如以下示例所示:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  autoscalingPolicy:
    consolidationDelayMinutes : 5
    consolidationThreshold    : 70

在此示例中,如果节点的 70% 可用 CPU 和内存容量利用率过低超过 5 分钟,则该节点会成为移除的候选节点。如需查看可用参数的列表,请参阅为节点整合设置自动扩缩参数

在集群中部署计算类

定义计算类后,将其部署到集群:

kubectl apply -f compute-class.yaml

此计算类已可在集群中使用。您可以在 Pod 规范中请求计算类,或者视需要将其设置为特定命名空间中的默认计算类。

为命名空间设置默认计算类

为命名空间设置默认计算类时,GKE 会使用该计算类为您在该命名空间中部署的任何 Pod 创建节点。如果 Pod 明确请求其他计算类,则 Pod 级请求会替换命名空间默认计算类。

如需将计算类设置为特定命名空间的默认计算类,请执行以下操作:

  1. 创建命名空间:

    kubectl create namespace cost-optimized-ns
    
  2. 使用计算类为命名空间添加标签:

    kubectl label namespaces cost-optimized-ns \
        cloud.google.com/default-compute-class=cost-optimized
    

在工作负载中请求计算类

如需在工作负载中请求计算类,请在清单中为该计算类添加节点选择器。

  1. 将以下清单保存为 cc-workload.yaml

    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"
    
  2. 部署工作负载:

    kubectl apply -f cc-workload.yaml
    

部署此工作负载时,GKE 会自动向 Pod 添加与请求的计算类的节点污点对应的容忍设置。此容忍设置可确保只有请求计算类的 Pod 在计算类节点上运行。

后续步骤