使用节点自动预配

本页面介绍如何在 Google Kubernetes Engine (GKE) 中使用节点自动预配功能。

概览

节点自动预配代表用户自动管理一组节点池。如果没有节点自动预配功能,则 GKE 只会考虑启动一组用户创建的节点池中的新节点。有了节点自动预配功能,系统便可以自动创建新节点池以及删除节点池。

准备工作

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

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 选择默认的 Compute Engine 区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project PROJECT_ID
  • 如果您使用的是可用区级集群,请设置默认计算可用区
    gcloud config set compute/zone COMPUTE_ZONE
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/region COMPUTE_REGION
  • gcloud 更新到最新版本:
    gcloud components update

要求

以下 GKE 版本中提供节点自动预配功能:

  • 1.11.2-gke.25 及更高版本,适用于区域级集群。
  • 1.12.x 及更高版本,适用于地区级集群。

不支持的特性

节点自动预配功能不支持以下特性,也就是说,节点自动预配功能不会预配具有这些特性的节点池,但会自动扩缩现有节点池:

操作

节点自动预配是集群自动扩缩器的一种机制,该程序以每个节点池为单位进行扩缩。启用节点自动预配功能后,集群自动扩缩器可以根据无法调度的 Pod 的规范自动扩展节点池。

节点自动预配功能会根据以下信息创建节点池:

资源限制

节点自动预配功能和集群自动扩缩器有两个级层的限制:

  • 节点池级层
  • 集群级层

节点池限制

由节点自动预配功能创建的节点池不得超过 1000 个节点。

集群限制

您定义的限制将根据整个集群使用的 CPU 和内存资源总量强制执行,而不仅仅针对自动预配的节点池。

如果创建新节点会导致超出定义的某个限制,那么集群自动调节程序不会执行此操作。如果已超出限制,系统不会自动删除节点。

工作负载分离

如果待处理 Pod 使用节点相似性和容忍设置,则节点自动预配功能可以为节点预配匹配的标签和污点。

如果满足以下所有条件,则节点自动预配功能可能会创建带有标签和污点的节点池:

  • 待处理 Pod 需要具有特定标签键和值的节点。
  • Pod 对具有相同键的污点使用容忍设置。
  • 容忍设置适用于 NoSchedule 效果、NoExecute 效果或全部效果。

Pod 的规范可以通过以下两种方式来表明它需要具有特定标签的节点:

  • 使用 nodeSelector 字段。
  • nodeAffinity 字段与 In 运算符和一个值(且仅有一个)搭配使用。

以下示例摘录自 Pod 规范,它被解释为工作负载分离请求。在此示例中,集群管理员已选择 dedicated 作为用于工作负载隔离的键,并且界面团队已确定需要使用专用节点来处理工作负载。

Pod 对标有 dedicated=ui-team 的节点使用容忍设置,并使用 nodeAffinity 选择节点:

spec:
  tolerations:
  - key: dedicated
    operator: Equal
    value: ui-team
    effect: NoSchedule
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: dedicated
            operator: In
            values:
            - ui-team

如果此 Pod 存在,则节点自动预配功能会考虑创建具有污点 dedicated=ui-team:NoSchedule 和标签 dedicated=ui-team 的节点。

以下示例使用 nodeSelector,但效果是相同的:

spec:
  tolerations:
  - key: dedicated
    operator: Equal
    value: ui-team
    effect: NoSchedule
  nodeSelector:
    dedicated: ui-team

删除自动预配的节点池

当自动预配的节点池中没有节点时,GKE 会删除该节点池。未标记为自动预配的节点池不会被删除。

支持的机器类型

从 GKE 1.19.7-gke.800 开始,创建节点池时节点自动预配功能会考虑使用所有机器类型,但 N1 机器除外,节点自动预配功能只会考虑使用配备多达 64 个 vCPU 的机器。默认情况下,系统会使用 E2 机器系列,以下情况除外:

  • E2 机器系列无法满足工作负载请求。例如,如果工作负载请求 GPU,则 N1 机器系列将用于新节点池。
  • 工作负载使用机器系列标签。如果无法满足工作负载请求(根据上一点),则此设置会被覆盖。如需了解详情,请参阅使用自定义机器系列

在 GKE 1.19.7-gke.800 之前的版本中,节点自动预配功能只会考虑具有多达 64 个 vCPU 的 N1 机器类型

支持的节点映像

目前,节点自动预配功能只会考虑使用 Container-Optimized OS 节点映像创建节点池。

对抢占式虚拟机的支持

节点自动预配功能支持基于抢占式虚拟机 (VM) 实例创建节点池。

仅当存在容忍 cloud.google.com/gke-preemptible="true":NoSchedule 污点的不可调度的 Pod 时,才应考虑创建基于抢占式虚拟机的节点池。

基于抢占式虚拟机并且由自动预配的节点池创建的节点已应用污点。

对请求临时存储的 Pod 的支持

当 Pod 请求临时存储时,节点自动预配功能支持创建节点池。在节点池中预配的启动磁盘的大小对于所有新自动预配的节点池都相同。该启动磁盘的大小可自定义,默认为 100 GiB。

只有当具有指定磁盘大小的节点的可分配临时存储大于或等于待处理 Pod 的临时存储请求时,节点自动预配功能才会预配节点池。如果临时存储请求高于可分配的存储,则节点自动预配功能不会预配节点池。节点的磁盘大小不会根据待处理 Pod 的临时存储请求动态配置。

GKE 版本 1.19.7-gke.800 或更高版本以及 1.18.12-gke.1210 或更高版本支持对 Pod 的临时存储支持。

可扩缩性限制

节点自动预配功能不但具有与集群自动扩缩器相同的限制,还具有以下其他限制:

对分离的工作负载数量的限制
节点自动预配功能支持最多 100 个不同的分离工作负载。
对节点池数量的限制
节点自动预配功能会在池数接近 100 时不再优先创建新的节点池。您可以创建超过 100 个节点池,但仅在创建节点池是计划待处理 Pod 的唯一选择时才采用此做法。

启用节点自动预配功能

您可以使用 gcloud 或 Google Cloud Console 在集群上启用节点自动预配功能。

gcloud

如需启用节点自动预配功能,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning \
    --min-cpu minimum-cpu \
    --min-memory minimum-memory \
    --max-cpu maximum-cpu \
    --max-memory maximum-memory
    --autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • minimum-cpu:集群中的最小核心数。
  • minimum-memory:集群中的最小内存数量 (GB)。
  • maximum-cpu:集群中的最大核心数。
  • maximum-memory:集群中的最大内存数量 (GB)。

以下示例在 dev-cluster 上启用节点自动预配功能,并允许集群总大小在 1 个 CPU 和 1 GB 内存到 10 个 CPU 和 64 GB 内存(最大值)这一范围内扩缩:

gcloud container clusters update dev-cluster \
    --enable-autoprovisioning \
    --min-cpu 1 \
    --min-memory 1 \
    --max-cpu 10 \
    --max-memory 64

控制台

如需启用节点自动预配功能,请执行以下步骤:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

访问 Google Kubernetes Engine 菜单

  1. 选择所需的集群。
  2. 点击 图标。
  3. 向下滚动到节点自动预配,然后选择已启用
  4. 设置所需的集群 CPU 和内存使用量最小值和最大值。
  5. 点击保存。GKE 会更新您的集群。

使用自动预配配置文件

可以使用 YAML 配置文件来配置节点自动预配功能。如果配置文件用于更改单个设置,则其中只能有一行。可以在单个配置文件中指定多个设置。在这种情况下,在应用配置文件后,系统将更改所有这些设置。

部分高级配置只能通过使用配置文件指定。

示例 1:应用以下配置文件可为节点自动预配功能创建的所有新节点池启用节点自动修复和自动升级功能

management:
  autoRepair: true
  autoUpgrade: true

示例 2:应用以下配置文件将会更改以下设置:

  • 为 CPU、内存和 GPU 设置资源限制。如果集群的总大小超过指定的资源限制,则节点自动预配将不会创建节点。
  • 为节点自动预配功能创建的所有新节点池启用节点自动修复和自动升级功能
  • 为节点自动预配功能创建的所有新节点池启用安全启动和完整性监控功能
  • 针对节点自动预配功能创建的所有新节点池,将启动磁盘大小设置为 100 GB。
resourceLimits:
  -resourceType: 'cpu'
   minimum: 4
   maximum: 10
  -resourceType: 'memory'
   maximum: 64
  -resourceType: 'nvidia-tesla-k80'
   maximum: 4
management:
  autoRepair: true
  autoUpgrade: true
shieldedInstanceConfig:
  enableSecureBoot: true
  enableIntegrityMonitoring: true
diskSizeGb: 100

如需使用自动预配配置文件,请执行以下操作:

  1. gcloud 能够访问的位置配置具有所需配置的文件。

  2. 运行以下命令,将配置应用于您的集群:

    gcloud container clusters update cluster-name \
       --enable-autoprovisioning \
       --autoprovisioning-config-file file-name

    请替换以下内容:

    • cluster-name:要启用节点自动预配功能的集群的名称。
    • file-name:包含所需配置的 YAML 文件的名称。

    如需了解详情,请参阅 gcloud container clusters update 文档。

自动预配默认值

节点自动预配功能会查看集群中的 Pod 要求,以确定这些 Pod 最适合使用哪种类型的节点。但是,某些节点池设置并非由 Pod 直接指定(例如,与节点升级相关的设置)。您可以为这些设置设置默认值,这些默认值将应用于所有新创建的节点池。

为自动预配的节点池设置身份默认值

Google Cloud 资源的权限由身份提供。

您可以使用 gcloud 工具或通过配置文件为新的自动预配节点池指定默认身份(服务帐号或一个或多个范围)。

gcloud

如需指定节点自动预配功能使用的默认 IAM 服务帐号,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning --autoprovisioning-service-account=service-account

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • service-account:默认服务帐号的电子邮件地址。

以下示例将 test-service-account@google.com 设置为 dev-cluster 集群的默认服务帐号:

gcloud container clusters update dev-cluster \
    --enable-autoprovisioning --autoprovisioning-service-account=test-service-account@google.com

如需指定节点自动预配功能使用的默认范围,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning --autoprovisioning-scopes=scope

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • scope:自动预配的节点池使用的 Google Cloud 范围。如需指定多个范围,请用英文逗号分隔这些范围(例如 scope, scope,…)。

以下示例将 dev-cluster 集群的默认范围设置为 devstorage.read_only

gcloud container clusters update dev-cluster \
    --enable-autoprovisioning \
    --autoprovisioning-scopes=https://www.googleapis.com/auth/pubsub,https://www.googleapis.com/auth/devstorage.read_only

文件

您可以使用配置文件指定节点自动预配功能使用的默认身份。以下 YAML 配置可设置 IAM 服务帐号:

  serviceAccount: service-account

service-account 替换为默认服务帐号的电子邮件地址。

或者,您也可以使用以下 YAML 配置指定节点自动预配功能使用的默认范围:

  scopes: scope

scope 替换为自动预配的节点池使用的 Google Cloud 范围。如需指定多个范围,请用英文逗号分隔这些范围(例如 scope, scope,…)。

如需使用自动预配配置文件,请执行以下操作:

  1. gcloud 能够访问的位置创建指定默认身份的配置文件。

  2. 运行以下命令,将配置应用于您的集群:

    gcloud container clusters update cluster-name \
       --enable-autoprovisioning \
       --autoprovisioning-config-file file-name

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • file-name:配置文件的名称。

客户管理的加密密钥 (CMEK)

您可以指定新的自动预配节点池使用的客户管理的加密密钥 (CMEK)

您可以使用配置文件为启动磁盘启用客户管理的加密。以下 YAML 配置可设置 CMEK 密钥:

  bootDiskKmsKey: projects/key-project-id/locations/location/keyRings/key-ring/cryptoKeys/key

请替换以下内容:

  • zone:要在其中创建集群的区域。
  • key-project-id:您的密钥项目 ID。
  • location:密钥环的位置。
  • key-ring:密钥环的名称。
  • key:密钥的名称。
  • cluster-project-id:您的集群项目 ID。

如需使用自动预配配置文件,请执行以下操作:

  1. gcloud 能够访问的位置中创建指定 CMEK 密钥的配置文件。

  2. 运行以下命令,将配置应用于您的集群:

    gcloud container clusters update cluster-name \
       --enable-autoprovisioning \
       --autoprovisioning-config-file file-name

    请替换以下内容:

    • cluster-name:要启用节点自动预配功能的集群的名称。
    • file-name:配置文件的名称。

节点完整性

节点自动预配功能支持在启用安全启动和完整性监控功能的情况下创建节点池。

您可以使用配置文件启用“安全启动和完整性监控功能”。以下 YAML 配置可启用安全启动并停用完整性监控功能:

  shieldedInstanceConfig:
    enableSecureBoot: true
    enableIntegrityMonitoring: false

如需使用自动预配配置文件,请执行以下操作:

  1. 将以上配置复制到 gcloud 可以访问的某个位置中的文件内。修改 enableSecureBootenableIntegrityMonitoring 的值。保存文件。

  2. 运行以下命令,将配置应用于您的集群:

    gcloud container clusters update cluster-name \
       --enable-autoprovisioning \
       --autoprovisioning-config-file file-name

    请替换以下内容:

    • cluster-name:要启用节点自动预配功能的集群的名称。
    • file-name:配置文件的名称。

节点自动修复和自动升级

节点自动预配功能支持创建启用了节点自动修复和节点自动升级的节点池。

gcloud

如需为所有自动预配的新节点池启用自动修复和自动升级,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning --enable-autoprovisioning-autorepair \
    --enable-autoprovisioning-autoupgrade

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。

如需为所有自动预配的节点池停用自动修复和自动升级功能,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning --no-enable-autoprovisioning-autorepair \
    --no-enable-autoprovisioning-autoupgrade

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。

文件

您可以使用配置文件启用或停用节点自动修复和自动升级功能。以下 YAML 配置会启用自动修复并停用自动升级:

  management:
    autoRepair: true
    autoUpgrade: false

如需使用自动预配配置文件,请执行以下操作:

  1. 将以上配置复制到 gcloud 可以访问的某个位置中的文件内。修改 autoUpgradeautoRepair 的值。保存文件。

  2. 运行以下命令,将配置应用于您的集群:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning \
    --autoprovisioning-config-file file-name

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • file-name:配置文件的名称。

节点超额配置升级设置

节点自动预配功能支持创建具有指定超额配置升级设置的节点池。

gcloud

如需为所有自动预配的新节点池指定超额配置升级设置,请运行以下命令:

gcloud container clusters update cluster-name \
    --autoprovisioning-max-surge-upgrade max-surge-upgrade \
    --autoprovisioning-max-unavailable-upgrade max-unavailable-upgrade

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • max-surge-upgrade:在自动预配节点池上设置的 max-surge-upgrade 值。
  • max-unavailable-upgrade:在自动预配节点池中设置的 max-unavailable-upgrade 值。

文件

您可以使用如下所示的配置文件为所有自动预配的新节点池指定超额配置升级设置。

  upgradeSettings:
    maxSurgeUpgrade: 1
    maxUnavailableUpgrade: 2

如需使用自动预配配置文件,请执行以下操作:

  1. 将以上配置复制到 gcloud 可以访问的某个位置中的文件内。修改 maxSurgeUpgrademaxUnavailableUpgrade 的值。 保存文件。

  2. 运行以下命令,将配置应用于您的集群:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning \
    --autoprovisioning-config-file file-name

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • file-name:配置文件的名称。

如需了解详情,请参阅 gcloud container clusters update 文档。

自定义启动磁盘

节点自动预配功能支持使用自定义启动磁盘创建节点池。

您可以使用配置文件自定义启动磁盘设置。以下 YAML 配置会促使节点自动预配功能创建包含 100 GB SSD 磁盘的节点池:

  diskSizeGb: 100
  diskType: pd-ssd

指定下列内容:

  • diskSizeGb:磁盘的大小(以 GB 为单位)。
  • diskType:磁盘的类型,可以是以下值之一:
    • pd-standard:标准永久性磁盘(默认值)。
    • pd-ssd:SSD 永久性磁盘。

如需使用自动预配配置文件,请执行以下操作:

  1. gcloud 能够访问的位置创建具有所需启动磁盘配置的文件。

  2. 运行以下命令,将配置应用于您的集群:

    gcloud container clusters update cluster-name \
       --enable-autoprovisioning \
       --autoprovisioning-config-file file-name

    请替换以下内容:

    • cluster-name:要启用节点自动预配功能的集群的名称。
    • file-name:配置文件的名称。

配置 GPU 限制

将节点自动预配功能与 GPU 搭配使用时,您可以使用 gcloud 工具或 Google Cloud Console 为集群中的每种 GPU 类型设置上限。如需配置多种类型的 GPU,您必须使用配置文件。

如需列出可用的 resourceType,请运行 gcloud compute accelerator-types list

gcloud

gcloud container clusters update cluster-name \
    --enable-autoprovisioning \
    --max-cpu maximum-cpu \
    --max-memory maximum-memory \
    --min-accelerator type=gpu-type,count=minimum-accelerator \
    --max-accelerator type=gpu-type,count=maximum-accelerator

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • maximum-cpu:集群中的最大核心数。
  • maximum-memory:集群中的最大内存数量 (GB)。
  • gpu-type:GPU 加速器的类型。
  • minimum-accelerator:集群中 gpu-type GPU 加速器的最小数量。
  • maximum-accelerator:集群中 gpu-type GPU 加速器的最大数量。

以下示例为 dev-cluster 集群中的 nvidia-tesla-k80 GPU 加速器类型设置 GPU 限制:

gcloud container clusters update dev-cluster \
    --enable-autoprovisioning \
    --max-cpu 10 \
    --max-memory 64 \
    --min-accelerator type=nvidia-tesla-k80,count=1 \
    --max-accelerator type=nvidia-tesla-k80,count=4

文件

您可以使用配置文件为多种类型的 GPU 加载限制。 以下 YAML 配置可配置两种不同类型的 GPU:

  resourceLimits:
    -resourceType: 'cpu'
     minimum: 4
     maximum: 10
    -resourceType: 'memory'
     maximum: 64
    -resourceType: 'nvidia-tesla-k80'
     maximum: 4
    -resourceType: 'nvidia-tesla-v100'
     maximum: 2

如需使用自动预配配置文件,请执行以下操作:

  1. 将以上配置复制到 gcloud 可以访问的某个位置中的文件内。修改 cpumemory 的值。根据需要为 resourceType 添加任意数量的值。保存文件。

  2. 运行以下命令,将配置应用于您的集群:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning \
    --autoprovisioning-config-file file-name

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • file-name:配置文件的名称。

如需了解详情,请参阅 gcloud container clusters update 文档。

控制台

要启用用于 GPU 资源的节点自动预配功能,请执行以下步骤:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

访问 Google Kubernetes Engine 菜单

  1. 选择所需的集群。
  2. 点击 修改图标。
  3. 向下滚动到节点自动预配,然后选择已启用
  4. 设置所需的集群 CPU 和内存使用量最小值和最大值。
  5. 点击 添加资源
  6. 选择要添加的 GPU 类型(例如 NVIDIA TESLA K80)。 设置需要添加到集群中的最小和最大 GPU 数量。
  7. 在 GKE 中接受 GPU 限制
  8. 点击保存。GKE 会更新您的集群。

节点自动预配位置

您可以设置节点自动预配功能可在其中创建新节点池的区域。不支持地区位置。区域必须属于集群所在的地区,但不限于在集群级层定义的节点位置。更改节点自动预配位置不会影响任何现有节点池。

如需设置节点自动预配功能可在其中创建新节点池的位置,请运行以下命令:

gcloud container clusters update cluster-name \
    --enable-autoprovisioning --autoprovisioning-locations=zone

请替换以下内容:

  • cluster-name:要启用节点自动预配功能的集群的名称。
  • zone:节点自动预配功能可在其中创建新节点池的区域。如需指定多个区域,请用英文逗号分隔这些区域(例如 zone, zone,…)。

停用节点自动预配功能

对集群停用节点自动预配功能时,系统将不再自动预配节点池。

gcloud

如需为集群停用节点自动预配功能,请运行以下命令:

gcloud container clusters update cluster-name --no-enable-autoprovisioning

控制台

如需使用 Google Cloud Console 停用节点自动预配功能,请执行以下操作:

  1. 访问 Cloud Console 中的 Google Kubernetes Engine 菜单。

访问 Google Kubernetes Engine 菜单

  1. 选择所需的集群。
  2. 点击 修改图标。
  3. 向下滚动到节点自动预配,然后选择已停用

将节点池标记为自动预配

在集群上启用节点自动预配功能后,您可以指定自动预配哪些节点池。自动预配的节点池在没有工作负载使用它时,会被自动删除。

如需将节点池标记为自动预配,请运行以下命令:

gcloud container node-pools update node-pool-name --enable-autoprovisioning

node-pool-name 替换为节点池的名称。

将节点池标记为不自动预配

如需将节点池标记为不自动预配,请运行以下命令:

gcloud container node-pools update node-pool-name --no-enable-autoprovisioning

node-pool-name 替换为节点池的名称。

使用自定义机器系列

从 GKE 1.19.7-gke.800 开始,您可以为工作负载选择机器系列。这可通过以下任一方式实现:

  • 使用 cloud.google.com/machine-family 键、运算符 In 以及设置为所需机器系列的值(例如 n2)设置节点亲和性。
  • 添加键为 cloud.google.com/machine-familynodeSelector 以及设置为所需机器系列的值。

以下示例将 nodeAffinity 设置为机器系列 n2

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/machine-family
            operator: In
            values:
            - n2

应用更改后,节点自动预配功能会根据指定机器系列中的机器类型选择最佳节点池。如果多个值用于匹配表达式,则系统将任意选择一个值。

后续步骤