本文档介绍集群自动扩缩器,该自动扩缩器会自动控制节点池的大小。当您为节点池中的节点数量指定最小值和最大值时,便会启用集群自动扩缩器。您可以在创建节点池或更新节点池时指定这些值。
自动扩缩节点池
集群自动扩缩器会根据工作负载的需求自动调整给定节点池中的节点数量。您不需要手动添加或移除节点,也不需要过度预配节点池。您只需指定节点池的最小大小和最大大小即可,其他操作都是自动执行的。
在系统自动扩缩集群时,如果需要删除或移动资源,则工作负载可能会暂时中断。例如,如果工作负载包含具有单个副本的控制器,则在删除该副本的 Pod 的当前节点时,系统可能会将此 Pod 重新调度到其他节点上。因此,您必须将工作负载设计为可以容忍潜在的中断或确保关键的 Pod 不会中断。
集群自动扩缩器的工作原理
集群自动调节程序基于每个节点池工作。使用集群自动扩缩器配置节点池时,您可以指定节点池的最小大小和最大大小。 您可以在创建节点池或更新节点池时更改最小和最大大小。
集群自动扩缩器会根据该节点池中的资源请求(而不是实际资源利用率)自动增大或减小节点池的大小。如果 Pod 对象无法安排,并且节点池中的容量不足以满足请求,则集群自动扩缩器会添加节点。
如果节点未充分利用,并且所有 Pod 对象都可以安排在较少的节点上,则集群自动扩缩器也会将其移除。如果该节点无法在 10 分钟后正常排空,则会被强制终止。此时间段不可配置。
如果 Pod 请求的资源太少(例如,如果默认数量不足),则集群自动扩缩器不会纠正这种情况。您可以通过为所有工作负载创建足够的资源请求,帮助确保集群自动扩缩器尽可能准确地工作。如需了解详情,请参阅管理容器的资源。
操作条件
集群自动扩缩器在调整节点池的大小时会做出以下假设:
- 所有复制的 Pod 对象都可以在其他节点上重启,可能会导致短暂的中断。如果您的工作负载无法容忍中断,请将工作负载配置为在停用自动扩缩功能的节点池上运行。如需了解详情,请参阅使用节点污点控制调度。
- 集群自动扩缩器可以替换您执行的任何手动节点管理操作。
- 单个节点池中的所有节点都具有一组相同的标签。
- 纵向扩容后,集群自动扩缩器会选择空闲 CPU 或未使用内存最少的节点组。如果您在同一集群中有不同大小的节点(例如高 CPU 或高内存节点),则此行为会影响已扩容的节点池。
最小和最大节点池大小
您可以使用 min-nodes
和 max-nodes
标记来为集群中的每个节点池指定大小下限和上限。 如需停用自动扩缩,请将 min-nodes
和 max-nodes
设置为相同的数字。集群自动扩缩器会在这些大小边界内做出扩缩决策。
设置节点池的大小上限时,请确保其足够大,可以运行所有工作负载。如果集群中的节点池没有足够的内存和 CPU 来运行所有工作负载,则可能会发生服务中断。
使用 PodDisruptionBudget
保护工作负载
您可以使用 PodDisruptionBudget
配置 GKE on AWS 以防止工作负载中断。创建 PodDisruptionBudget
时,您可以指定应该可供使用的 Pod 副本数量下限,或是在任何给定时间可以处于不可用状态的 Pod 副本数量上限。如需了解详情,请参阅为应用指定中断预算。
从零节点扩容
从以下 GKE on AWS 版本开始,集群自动扩缩器支持从零节点扩容节点池:
- 1.29 版及更高版本
- 1.28 版(从 1.28.8-gke.800 版及更高版本开始)
- 1.27 版(从 1.27.12-gke.800 版及更高版本开始)
如果您使用的是较低版本,则需要将集群升级到以上版本之一才能使用此功能。如需为现有集群启用此功能,请将集群更新为受支持的版本,然后通过更新节点池的 Kubernetes 版本来执行滚动更新。如需详细了解如何更新节点池,请参阅更新节点池。
集群自动扩缩器在做出扩缩决策时会遵循您在节点池上定义的标签和污点,即使没有可供参考的节点也是如此。GKE on AWS 会自动在节点池的底层 AWS 自动扩缩组上设置必要的标签和污点标记。如需详细了解这些标记,请参阅 GitHub 页面的自动发现设置部分,其中介绍了 AWS 的集群自动扩缩器配置。
通过设置这些标签和污点标记,GKE on AWS 可让集群自动扩缩器创建准确的节点模板。节点模板是节点的虚拟表示形式,包含正确的节点配置、标签和污点,即使节点池中没有物理节点也是如此。由于这些准确的节点模板,集群自动扩缩器可以做出正确的扩容决策。
在节点池上配置污点时,请注意 AWS 自动扩缩组存在以下限制:如果您应用多个具有相同键但不同值效果组合的污点,则集群自动扩缩器只会考虑最后应用的具有重复键的污点。