集群自动扩缩器

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

借助 Autopilot 集群,您无需担心预配节点或节点池,因为节点池通过节点自动预配自动预配;并自动扩缩以满足工作负载的要求。

概览

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

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

您可以使用映像流式传输功能提高集群自动扩缩器的性能,该功能可远程流式传输符合条件的容器映像所需的映像数据,同时在本地缓存映像以允许新节点上的工作负载能够以更快的速度启动。

集群自动扩缩器的工作原理

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

通过在自动扩缩器的底层 Compute Engine 托管实例组 (MIG) 中添加或移除虚拟机 (VM) 实例,集群自动扩缩器会自动增大或减小节点池的大小。集群自动扩缩器会根据在该节点池的节点上运行的 Pod 的资源请求(而不是实际资源利用率)做出这些扩缩决策。它会定期检查 Pod 和节点的状态,并执行相应的操作:

  • 如果由于节点池中的节点不足而无法调度 Pod,则集群自动扩缩程序会添加节点(最多添加到节点池的最大大小)。
  • 如果节点利用不足,并且系统在节点池中的节点减少的假设下仍可以调度所有 Pod,则集群自动扩缩器会移除节点(最多移除到节点池的最小大小)。如果节点上有 Pod 无法移动到集群中的其他节点,则集群自动扩缩器不会尝试纵向缩容该节点。如果 Pod 可以移动到其他节点,但系统不能在超时期限(目前为 10 分钟)后正常排空节点,则节点会被强制终止。GKE 集群无法配置宽限期。如需详细了解纵向缩容的工作原理,请参阅集群自动扩缩器文档

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

操作条件

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

  • 所有复制的 Pod 都可以在其他节点上重启,可能会导致短暂的中断。如果您的服务无法容忍中断,则不建议使用集群自动扩缩器。
  • 用户或管理员不会以手动方式管理节点;因此扩缩器可以替换您执行的任何手动节点管理操作。
  • 单个节点池中的所有节点都具有一组相同的标签。
  • 集群自动扩缩程序会考虑各个池中实例类型的相对费用,并尝试扩展尽可能便宜的节点池。包含 Spot 虚拟机的节点池所节省的费用已考虑在内。
  • 未跟踪初始集群或节点池创建后手动添加的标签。集群自动扩缩程序创建的节点在创建节点池时分配有使用 --node-labels 指定的标签。
  • 在 GKE 1.21 版或更早版本中,集群自动扩缩器会考虑使用节点池中现有节点的污点信息来表示整个节点池。从 GKE 1.22 版开始,集群自动扩缩器会将集群和节点池中现有节点的信息组合在一起。集群自动扩缩器会检测手动节点更改和节点池更改,以进行扩容。

跨地区保持平衡

如果您的节点池包含具有相同实例类型的多个代管式实例组,则集群自动扩缩器会尝试在扩容时保持这些代管式实例组的大小平衡。这有助于防止节点在节点池多个可用区的代管式实例组中分布不均匀。GKE 在缩容时不会考虑自动扩缩政策。

地点政策

从 GKE 1.24.1-gke.800 版开始,您可以更改 GKE 集群自动扩缩器的位置政策。您可以通过使用以下任何值指定 location_policy 标志来控制集群自动扩缩器分布政策:

  • BALANCED:自动扩缩器会考虑 Pod 要求以及每个可用区的资源可用性。这不保证类似的节点组具有完全相同的大小,因为自动扩缩器会考虑许多因素,包括给定可用区的可用容量以及触发扩容的 Pod 的可用区亲和性。
  • ANY:自动扩缩器会优先利用未使用的预留并考虑可用资源的当前限制条件。

    如果您使用的是 Spot 虚拟机,或者想要使用可用区之间不相等的虚拟机预留,则建议使用此政策。

默认值

对于 Spot 虚拟机节点池,默认的集群自动扩缩器分布政策为 ANY。在此政策中,Spot 虚拟机被抢占的风险较低。

对于非抢占式节点池,默认的集群自动扩缩器分布政策为 BALANCED

最小和最大节点池大小

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

自动扩缩限制

您可以设置在扩缩节点池时要使用的集群自动扩缩器的最小和最大节点数。如果集群在多个可用区中有节点,则最小和最大节点数会应用到每个可用区。

例如,以下命令创建一个自动扩缩多可用区集群,该集群最初跨三个可用区有 6 个节点,每个可用区至少有 1 个节点,每个可用区最多有 4 个节点:

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

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

如需查看您可以指定的标志的完整列表,请参阅 gcloud container clusters create 文档。

自动扩缩配置文件

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

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

  • balancedKubernetes 项目集群自动扩缩器的默认参数
  • optimize-utilization:优先提高利用率,而非在集群中保留空闲资源。选择集群后,集群自动扩缩器会更主动地缩减集群:移除更多节点,并更快地移除节点。

在 GKE 1.18 及更高版本中,当您启用 optimize-utilization 自动扩缩配置文件时,GKE 首选在已具有高 CPU 或内存分配的节点中调度 Pod。在 GKE 1.22 及更高版本中,如果启用了 optimize-utilization 自动扩缩配置文件,则 GKE 在安排 Pod 时也会考虑高 GPU 分配。

optimize-utilization 自动扩缩配置文件可帮助集群自动扩缩器识别和移除未充分利用的节点。为了实现此优化,GKE 将 Pod 规范中的调度程序名称设置为 gke.io/optimize-utilization-scheduler。指定自定义调度程序的 Pod 不受影响。

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

gcloud container clusters update CLUSTER_NAME \
    --autoscaling-profile optimize-utilization

考虑 Pod 安排和中断

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

  • Pod 的相似性或反相似性规则阻止重新安排。
  • Pod 不受控制器(如 Deployment、StatefulSet、Job 或 ReplicaSet)管理。
  • Pod 具有本地存储空间,GKE 控制平面版本低于 1.22。在具有控制平面版本 1.22 或更高版本的 GKE 集群中,具有本地存储空间的 Pod 不再阻止缩容。
  • 该 Pod 具有 "cluster-autoscaler.kubernetes.io/safe-to-evict": "false" 注解。
  • 节点的删除将超出配置的 PodDisruptionBudget

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

其他信息

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

限制

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

已知问题

  • 在 1.22 之前的 GKE 控制平面版本中,GKE 集群自动扩缩器会停止对空(零节点)集群的所有节点池进行扩容。GKE 1.22 及更高版本中不会出现此行为。

后续步骤