本页面介绍 Google Kubernetes Engine (GKE) 如何根据工作负载需求自动调整 Standard 集群的节点池大小。 当需求较高时,集群自动扩缩器会将节点添加到节点池中。如需了解如何配置集群自动扩缩器,请参阅自动扩缩集群。
借助 Autopilot 集群,您无需担心预配节点或节点池,因为节点池通过节点自动预配自动预配;并自动扩缩以满足工作负载的要求。
为何使用集群自动扩缩器
GKE 的集群自动扩缩器会根据工作负载的需求自动调整给定节点池中的节点数量。当需求较低时,集群自动扩缩器会将节点池缩减到您指定的最小大小。这样可以在您需要时提高工作负载的可用性,同时控制费用。您不需要手动添加或移除节点,也不需要过度预配节点池。您只需指定节点池的最小大小和最大大小即可,其他操作都是自动执行的。
在系统自动扩缩集群时,如果删除或移动资源,则工作负载可能会暂时中断。例如,如果工作负载包含具有单个副本的控制器,则在删除该副本的 Pod 的当前节点时,系统可能会将此 Pod 重新调度到其他节点上。启用集群自动扩缩器之前,请设计好工作负载以容忍潜在的中断或确保关键的 Pod 不会中断。
您可以使用映像流式传输功能提高集群自动扩缩器的性能,该功能可远程流式传输符合条件的容器映像所需的映像数据,同时在本地缓存映像以允许新节点上的工作负载能够以更快的速度启动。
集群自动扩缩器的工作原理
集群自动扩缩器以每个节点池为单位进行扩缩。配置具有集群自动扩缩器的节点池时,您需要指定节点池的最小大小和最大大小。
通过在自动扩缩器的底层 Compute Engine 托管实例组 (MIG) 中添加或移除虚拟机 (VM) 实例,集群自动扩缩器会自动增大或减小节点池的大小。集群自动扩缩器会根据在该节点池的节点上运行的 Pod 的资源请求(而不是实际资源利用率)做出这些扩缩决策。它会定期检查 Pod 和节点的状态,并执行相应的操作:
- 如果由于节点池中的节点不足而无法调度 Pod,则集群自动扩缩器会添加节点(最多添加到节点池的最大大小)。
- 如果节点利用不足,并且系统在节点池中的节点减少的假设下仍可以调度所有 Pod,则集群自动扩缩器会移除节点(最多移除到节点池的最小大小)。如果节点上有 Pod 无法移动到集群中的其他节点,则集群自动扩缩器不会尝试纵向缩容该节点。如果 Pod 可以移动到其他节点,但系统不能在超时期限(目前为 10 分钟)后正常排空节点,则节点会被强制终止。GKE 集群无法配置宽限期。如需详细了解纵向缩容的工作原理,请参阅集群自动扩缩器文档。
如果您的 Pod 请求的资源太少(或者没有更改可能不够的默认值),并且节点出现短缺情况,集群自动扩缩器不会纠正此情况。您可以通过为所有工作负载发出显式资源请求,帮助确保集群自动扩缩器尽可能准确地工作。
操作条件
集群自动扩缩器在调整节点池的大小时会做出以下假设:
- 所有复制的 Pod 都可以在其他节点上重启,可能会导致短暂的中断。如果您的服务无法容忍中断,则不建议使用集群自动扩缩器。
- 用户或管理员不会以手动方式管理节点;因此扩缩器可以替换您执行的任何手动节点管理操作。
- 单个节点池中的所有节点都具有一组相同的标签。
- 集群自动扩缩程序会考虑各个池中实例类型的相对费用,并尝试扩展尽可能便宜的节点池。包含 Spot 虚拟机的节点池所节省的费用已考虑在内。
- 在调度 Pod 之前,集群自动扩缩器会考虑 init 容器请求。Init 容器请求可以使用节点上可用的任何未分配资源,这可能会阻止 Pod 调度。集群自动扩缩器遵循的请求计算规则与 Kubernetes 使用的规则相同。如需了解详情,请参阅使用 init 容器。
- 未跟踪初始集群或节点池创建后手动添加的标签。集群自动扩缩程序创建的节点在创建节点池时分配有使用
--node-labels
指定的标签。 - 在 GKE 1.21 版或更早版本中,集群自动扩缩器会考虑使用节点池中现有节点的污点信息来表示整个节点池。从 GKE 1.22 版开始,集群自动扩缩器会将集群和节点池中现有节点的信息组合在一起。集群自动扩缩器会检测手动节点更改和节点池更改,以进行扩容。
跨地区保持平衡
如果您的节点池包含具有相同实例类型的多个代管式实例组,则集群自动扩缩器会尝试在扩容时保持这些代管式实例组的大小平衡。这有助于防止节点在节点池多个可用区的代管式实例组中分布不均匀。GKE 在缩容时不会考虑自动扩缩政策。
地点政策
从 GKE 1.24.1-gke.800 版开始,您可以更改 GKE 集群自动扩缩器的位置政策。您可以通过使用以下任何值指定 location_policy
标志来控制集群自动扩缩器的分布政策:
BALANCED
:自动扩缩器会考虑 Pod 要求以及每个可用区的资源可用性。这不保证类似的节点组具有完全相同的大小,因为自动扩缩器会考虑许多因素,包括给定可用区的可用容量以及触发扩容的 Pod 的可用区亲和性。ANY
:自动扩缩器会优先利用未使用的预留并考虑可用资源的当前限制条件。 如果您使用的是 Spot 虚拟机,或者想要使用可用区之间不相等的虚拟机预留,则建议使用此政策。
预留
从 GKE 1.27 版开始,集群自动扩缩器在进行纵向扩容决策时始终会考虑预留。在选择纵向扩容的节点池时,自动扩缩器会优先选择具有匹配的未使用预留的节点池,即使该节点池不是最高效的节点池也是如此。此外,在对多可用区纵向扩容进行负载均衡时,始终优先使用未使用的预留。
默认值
对于 Spot 虚拟机节点池,默认的集群自动扩缩器分布政策为 ANY
。在此政策中,Spot 虚拟机被抢占的风险较低。
对于非抢占式节点池,默认的集群自动扩缩器分布政策为 BALANCED
。
最小和最大节点池大小
创建新的节点池时,您可以为集群中的每个节点池指定最小和最大大小,集群自动扩缩器会在这些扩缩限制范围内做出重新扩缩决策。如需更新最小大小,请在指定新的最小值后,手动将集群大小调整为新的限制范围内的大小。然后,集群自动扩缩器会根据新的限制条件做出重新扩缩决策。
当前节点池大小 | 集群自动扩缩器操作 | 扩缩限制条件 |
---|---|---|
低于您指定的最小值 | 集群自动扩缩器会纵向扩容以预配待处理的 Pod。纵向缩容功能已停用。 | 节点池不会纵向缩容到低于您指定的值。 |
在您指定的大小下限和上限内 | 集群自动扩缩器可根据需求进行纵向扩容或纵向缩容。 | 节点池会保持在您指定的大小限制内。 |
大于您指定的上限 | 集群自动扩缩器仅纵向缩容可以安全移除的节点。纵向扩容功能已停用。 | 节点池不会扩容到超过您指定的值。 |
在 Standard 集群上,集群自动扩缩器绝不会将集群自动缩容至零个节点。集群中必须始终有一个或多个节点来运行系统 Pod。此外,如果由于手动移除节点而导致当前节点数为零,集群自动扩缩器和节点自动预配功能可以从零节点集群进行扩容。
如需详细了解自动扩缩器决策,请参阅集群自动扩缩器限制。
自动扩缩限制
您可以设置在扩缩节点池时要使用的集群自动扩缩器的最小和最大节点数。使用 --min-nodes
和 --max-nodes
标志设置每个可用区的节点数下限和上限
从 GKE 1.24 版开始,您可以对新集群使用 --total-min-nodes
和 --total-max-nodes
标志。这些标志设置所有可用区中节点池内节点总数的下限和上限。
节点数下限和上限示例
以下命令会创建一个自动扩缩的多可用区集群,该集群最初在 3 个可用区中有 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 个节点之间。
节点总数示例
以下命令(在 GKE 1.24 版或更高版本中提供)会创建一个自动扩缩的多可用区集群,该集群最初在 3 个可用区中有 6 个节点,所有可用区中节点池内的节点总数不得小于 3 和大于 12:
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 --total-min-nodes=3 --total-max-nodes=12
在此示例中,集群的总大小介于 3 到 12 个节点之间,无论这些节点在各个可用区之间的分布如何。
自动扩缩配置文件
决定何时移除节点时,需要在提高资源利用率或可用性之间进行权衡取舍。移除使用率过低的节点可以提高集群利用率,但新的工作负载可能需要等待重新预配资源才能运行。
您可以指定在做出此类决定时使用哪种自动扩缩配置文件。 可用的配置文件包括:
balanced
:Standard 集群的默认配置文件。balanced
配置文件不适用于 Autopilot 集群。optimize-utilization
:优先提高利用率,而非在集群中保留空闲资源。启用此配置文件后,集群自动扩缩器会更主动地缩减集群。GKE 可以移除更多节点,并更快地移除节点。GKE 首选在已具有高 CPU、内存或 GPU 分配的节点中调度 Pod。然而,其他因素也会影响调度,例如属于同一 Deployment、StatefulSet 或 Service 的 Pod 跨节点分布。
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。
如需详细了解集群自动扩缩器以及如何防止中断,请参阅集群自动扩缩器常见问题解答中的以下问题:
在 GKE 中自动扩缩 TPU
GKE 支持张量处理单元 (TPU) 来加速机器学习工作负载。单主机 TPU 切片节点池和多主机 TPU 切片节点池都支持自动扩缩和自动预配。
通过在 GKE 集群上使用 --enable-autoprovisioning
标志,GKE 可以创建或删除具有 TPU 版本和拓扑的单主机或多主机 TPU 切片节点池,以满足待处理工作负载的要求。
使用 --enable-autoscaling
时,GKE 会根据节点池的类型扩缩节点池,如下所示:
单主机 TPU 切片节点池:GKE 会在现有节点池中添加或移除 TPU 节点。节点池可以包含零到节点池最大大小(由 --max-nodes 和 --total-max-nodes 标志确定)之间的任意数量的 TPU 节点。当节点池扩缩时,节点池中的所有 TPU 节点具有相同的机器类型和拓扑。如需详细了解如何创建单主机 TPU 切片节点池,请参阅创建节点池。
多主机 TPU 切片节点池:GKE 以原子方式将节点池从零扩容到满足 TPU 拓扑所需的节点数。例如,对于机器类型为
ct5lp-hightpu-4t
且拓扑为16x16
的 TPU 节点池,节点池包含 64 个节点。GKE 自动扩缩器可确保此节点池正好包含 0 个或 64 个节点。缩容时,GKE 会逐出所有调度的 Pod,并将整个节点池排空为零。如需详细了解如何创建多主机 TPU 切片节点池,请参阅创建节点池。
更多信息
您可以在开放源代码 Kubernetes 项目中的自动扩缩常见问题解答中详细了解集群自动调节程序。
限制
集群自动扩缩器具有以下限制:
- 集群自动扩缩器目前不支持本地 PersistentVolume。
- 在 1.24.5-gke.600 之前的 GKE 控制平面版本中,当 pod 请求临时存储时,集群自动扩缩器不支持对使用本地 SSD 作为临时存储的节点为零的节点池进行纵向扩容。
- 集群大小限制:最多 15,000 个节点。运行此规模的集群时,请考虑其他集群限制和我们的最佳做法。
- 进行缩减时,集群自动扩缩器会保留 10 分钟的正常终止时间段,以便将节点的 Pod 重新调度到其他节点上,然后再强制终止该节点。
- 有时,集群自动扩缩器无法完全缩减,缩减后还会有额外节点存在。当所需的系统 Pod 被安排到其他节点上时会发生这种情况,因为没有任何触发器适用于任何这些移动到其他节点的 Pod。请参阅我有一些利用率较低的节点,但它们没有被缩减。为什么?。 要解决此限制,您可以配置 Pod 中断预算。
- 不支持使用更改的过滤条件进行的自定义调度。
- 如果 Pod 的
PriorityClass
值低于-10
,则节点不会纵向扩容。如需了解详情,请参阅集群自动扩缩器如何使用 Pod 优先级和抢占? - 集群自动扩缩器可能没有足够的未分配 IP 地址空间来用于添加新节点或 Pod,从而导致纵向扩容失败(由
eventResult
事件指示,其原因为scale.up.error.ip.space.exhausted
)。您可以通过扩展主要子网为节点添加更多 IP 地址,或使用不连续的多 Pod CIDR 为 Pod 添加新的 IP 地址。如需了解详情,请参阅 Pod 没有足够的可用 IP 地址空间。
已知问题
- 在 1.22 之前的 GKE 控制平面版本中,GKE 集群自动扩缩器会停止对空(零节点)集群的所有节点池进行扩容。GKE 1.22 及更高版本中不会出现此行为。