在 GKE on VMware 1.10 版中,用户集群中节点池的集群自动扩缩功能已正式发布。集群自动扩缩功能会根据工作负载的需求调整给定节点池中的节点数量。您不需要手动添加或移除节点,也不需要过度预配节点池。您只需指定节点池的最小大小和最大大小即可,其他操作都是自动执行的。
在系统自动扩缩集群时,如果删除或移动资源,则工作负载可能会暂时中断。例如,如果您的工作负载是单个 Pod,并且其当前节点被删除,则 Pod 会被重新调度到其他节点上。启用自动扩缩之前,请设计好工作负载以容忍潜在的中断并确保关键的 Pod 不会中断。
默认情况下,会为节点池停用集群自动扩缩功能。在集群创建期间或创建集群之后,您可以使用 gkectl update
命令对用户集群节点池启用和停用自动扩缩功能。
集群自动扩缩的工作原理
集群自动调节程序基于每个节点池工作。配置具有集群自动扩缩器的节点池时,您需要指定节点池的最小大小和最大大小。
根据在该节点池的节点上运行的 Pod 的资源请求(而不是实际资源利用率),集群自动扩缩器会自动增大或减小节点池的大小。它会定期检查 Pod 和节点的状态,并执行相应的操作:
- 如果由于节点池中的节点不足而无法调度 Pod,则集群自动扩缩器会添加节点(最多添加到节点池的最大大小)。
- 如果节点利用率过低,并且在节点池中的节点减少的条件下系统仍可以调度所有 Pod,则集群自动扩缩器会移除节点(最多移除到节点池的最小大小)。如果该节点无法正常排空,则会被强制终止,并安全地分离由 Kubernetes 管理的已挂接磁盘。
如果您的 Pod 请求的资源太少(或者没有更改可能不够的默认值),并且节点出现短缺情况,集群自动扩缩器不会纠正此情况。您可以通过为所有工作负载发出显式资源请求,帮助确保集群自动扩缩器尽可能准确地工作。
操作条件
集群自动扩缩器在调整节点池的大小时会做出以下假设:
- 所有复制的 Pod 都可以在其他节点上重启,这可能会导致短暂的中断。如果您的服务无法容忍中断,则不建议使用集群自动扩缩器。
- 用户或管理员不会手动管理节点。如果为节点池启用了集群自动扩缩器,则不能替换节点池的
replicas
字段。 - 单个节点池中的所有节点都具有一组相同的标签。
- 集群自动扩缩器会考虑各个节点池中实例类型的相对费用,并尝试以尽可能减少浪费的方式扩展节点池。
最小和最大节点池大小
您可以使用 autoscaling.minReplicas
和 autoscaling.maxReplicas
值来为集群中的每个节点池指定大小下限和上限。集群自动扩缩器会在这些范围内做出重新扩缩决策。节点池的 replicas
值(它是未启用自动扩缩的默认节点数量)应大于指定的 minReplicas
值且小于指定的 maxReplicas
值。启用自动扩缩功能后,集群自动扩缩器将等待生效,直至节点池中需要新节点或者可以从节点池中安全删除节点为止。
考虑 Pod 安排和中断
进行缩减时,集群自动扩缩器会遵循对 Pod 设置的安排和删除规则。这些限制可以防止自动扩缩器删除节点。如果节点的 Pod 具有以下任何条件,则它可能不会被删除。
- Pod 的亲和性或反亲和性规则阻止重新安排。
- Pod 具有本地存储空间。
- Pod 不受控制器(如 Deployment、StatefulSet、Job 或 ReplicaSet)管理。
- Pod 位于 kube-system 命名空间中,并且没有 PodDisruptionBudget。
应用的 PodDisruptionBudget 也可以阻止自动扩缩。如果删除节点会导致超出预算,则集群不会纵向缩容。
如需详细了解集群自动扩缩器以及如何防止中断,请参阅集群自动扩缩器常见问题解答中的以下问题:
限制
集群自动扩缩器具有以下限制:
- 不允许在节点池中缩减到零个副本。
- 在任何给定时间,用户集群工作器节点的总和必须至少为 3。这意味着所有自动扩缩的节点池的
minReplicas
值之和,加上所有非自动扩缩节点池的replicas
值之和的总和必须至少为 3。 - 有时,集群自动扩缩器无法完全缩减,缩减后还会有额外节点存在。当所需的系统 Pod 被安排到其他节点上时会发生这种情况,因为没有任何触发器适用于任何这些移动到其他节点的 Pod。请参阅我有一些利用率较低的节点,但它们没有被缩减。为什么?。 要解决此限制,您可以配置 Pod 中断预算。
- 不支持使用更改的过滤条件进行的自定义调度。
- 如果 Pod 的
PriorityClass
值低于-10
,则节点不会纵向扩容。如需了解详情,请参阅集群自动扩缩器如何使用 Pod 优先级和抢占?