集群自动扩缩器

本页面介绍如何根据工作负载需求自动调整 Google Kubernetes Engine (GKE) 集群的节点池大小。当需求较高时,集群自动扩缩程序会将节点添加到节点池中。当需求较低时,集群自动扩缩程序会将节点池缩减到您指定的最小大小。这样可以在您需要时提高工作负载的可用性,同时控制费用。您还可以在集群上配置集群自动扩缩程序

概览

GKE 的集群自动扩缩器会根据工作负载的需求自动调整给定节点池中的节点数量。您不需要手动添加或移除节点,也不需要过度预配节点池。您只需指定节点池的最小大小和最大大小即可,其他操作都是自动执行的。

在系统自动扩缩集群时,如果删除或移动资源,则工作负载可能会暂时中断。例如,如果工作负载包含具有单个副本的控制器,则在删除该副本的 Pod 的当前节点时,系统可能会将此 Pod 重新调度到其他节点上。启用集群自动扩缩程序之前,请设计好工作负载以容忍潜在的中断或确保关键的 Pod 不会中断。

集群自动扩缩程序的工作原理

集群自动扩缩程序以每个节点池为单位进行扩缩。配置具有集群自动扩缩程序的节点池时,您需要指定节点池的最小大小和最大大小。

集群自动扩缩程序会根据在该节点池的节点上运行的 Pod 的资源请求(而不是实际资源利用率)自动增大或减小节点池的大小。它会定期检查 Pod 和节点的状态,并执行相应的操作:

  • 如果由于节点池中的节点不足而无法调度 Pod,则集群自动扩缩程序会添加节点(最多添加到节点池的最大大小)。
  • 如果节点利用不足,并且系统在节点池中的节点减少的假设下仍可以调度所有 Pod,则集群自动扩缩程序会移除节点(最多移除到节点池的最小大小)。如果该节点无法在超时期限(目前为 10 分钟)后正常排空,则会被强制终止。GKE 集群的宽限期不可配置。

如果您的 Pod 请求的资源太少(或者没有更改可能不够的默认值),并且节点出现短缺情况,集群自动扩缩程序不会纠正此情况。您可以通过为所有工作负载发出显式资源请求,帮助确保集群自动扩缩器尽可能准确地工作。

操作条件

集群自动扩缩器在调整节点池的大小时会做出以下假设:

  • 所有复制的 Pod 都可以在其他节点上重启,可能会导致短暂的中断。如果您的服务无法容忍中断,则不建议使用集群自动扩缩器。
  • 用户或管理员不会以手动方式管理节点;因此扩缩器可以替换您执行的任何手动节点管理操作。
  • 单个节点池中的所有节点都具有一组相同的标签。
  • 集群自动扩缩程序会考虑各个池中实例类型的相对费用,并尝试扩展尽可能便宜的节点池。包含抢占式虚拟机的节点池的减少的费用已考虑在内。
  • 未跟踪初始集群或节点池创建后手动添加的标签。集群自动扩缩程序创建的节点在创建节点池时分配有使用 --node-labels 指定的标签。

跨地区保持平衡

如果您的集群池包含具有相同实例类型的多个托管实例组,集群自动扩缩器将尝试在扩充时保持这些托管实例组的大小平衡。这有助于防止节点在节点池多个地区的托管实例组中分布不均匀。

如需详细了解集群自动扩缩程序如何做出平衡决策,请参阅 Kubernetes 文档的自动扩缩常见问题解答

最小和最大节点池大小

您可以为集群中的每个节点池指定最小和最大大小,集群自动扩缩器会在这些范围内做出重新缩放决策。在启用自动扩缩的情况下,如果当前节点池大小低于指定的最小值或者大于指定的最大值,则自动扩缩程序将等待生效,直至节点池中需要新节点或者可以从节点池中安全删除节点为止。

自动扩缩限制

自动扩缩集群时,节点池扩缩限制由地区可用性决定。

例如,以下命令会创建一个自动扩缩的多地区集群,其中包含 3 个地区中的 6 个节点,每个地区至少有 1 个节点,最多有 4 个节点:

gcloud container clusters create example-cluster \
  --zone us-central1-a \
  --node-locations us-central1-a,us-central1-b,us-central1-f \
  --num-nodes 2 --enable-autoscaling --min-nodes 1 --max-nodes 4

此集群的总大小介于 3 到 12 个节点之间,这些节点分布在三个地区。如果其中某个地区出现故障,则集群的总大小将介于 2 到 8 个节点之间。

自动扩缩配置文件

决定何时移除节点时,需要在提高资源利用率或可用性之间进行权衡取舍。移除使用率过低的节点可以提高集群利用率,但新的工作负载可能需要等待重新预配资源才能运行。

您可以指定在做出此类决定时使用哪种自动扩缩配置文件。 目前可用的配置文件包括:

  • balanced:默认配置文件。
  • optimize-utilization:优先提高利用率,而非在集群中保留空闲资源。选择集群后,集群自动扩缩程序会更主动地缩减集群:移除更多节点,并更快地移除节点。此配置文件经过优化,适合与对启动延迟时间不敏感的批处理工作负载结合使用。目前,我们不建议将此配置文件用于处理工作负载。

在 GKE 1.18 及更高版本中,当您指定 optimize-utilization 自动扩缩配置文件时,GKE 会先在利用率较高的节点中调度 Pod,从而帮助集群自动扩缩程序识别并移除未充分利用的节点。为了实现此优化,GKE 将 Pod 规范中的调度程序名称设置为 gke.io/optimize-utilization-scheduler。指定自定义调度程序的 Pod 不受影响。

以下命令可在现有集群中启用 optimize-utilization 自动扩缩配置文件:

gcloud beta container clusters update example-cluster \
--autoscaling-profile optimize-utilization

考虑 Pod 安排和中断

进行缩减时,集群自动扩缩器会遵循对 Pod 设置的安排和删除规则。这些限制可以防止自动扩缩器删除节点。如果节点包含满足以下任意条件的 Pod,则可以阻止删除该节点:

  • Pod 的相似性或反相似性规则阻止重新安排。
  • Pod 具有本地存储空间。
  • Pod 不受控制器(如 Deployment、StatefulSet、Job 或 ReplicaSet)管理。

应用的 PodDisruptionBudget 也可以阻止自动扩缩;如果删除节点会导致超出预算,则集群不会缩减。

如需详细了解集群自动扩缩程序以及如何防止中断,请参阅集群自动扩缩程序常见问题解答中的以下问题:

其他信息

您可以在开放源代码 Kubernetes 项目中的自动扩缩常见问题解答中详细了解集群自动调节程序。

限制

集群自动扩缩器具有以下限制:

  • 集群自动扩缩器目前不支持本地 PersistentVolume
  • 对于请求 CPU、内存和 GPU 以外的资源(例如临时存储空间)的 Pod,纵向扩容大小为 0 的节点组。
  • 集群自动扩缩器支持多达 5000 个节点,每个节点运行 30 个 Pod。如需详细了解可扩缩性保证,请参阅可扩缩性报告
  • 进行缩减时,集群自动扩缩程序会保留 10 分钟的正常终止时间段,以便将节点的 Pod 重新调度到其他节点上,然后再强制终止该节点。
  • 有时,集群自动扩缩程序无法完全缩减,缩减后还会有额外节点存在。当所需的系统 Pod 被安排到其他节点上时会发生这种情况,因为没有任何触发器适用于任何这些移动到其他节点的 Pod。请参阅我有一些利用率较低的节点,但它们没有被缩减。为什么?。 要解决此限制,您可以配置 Pod 中断预算
  • 不支持使用更改的过滤条件进行的自定义调度。

后续步骤