本文档介绍 Google Distributed Cloud 中用户集群的自动扩缩。
集群自动扩缩功能会根据工作负载的需求增加或减少节点池中的节点数量。
准备工作
了解集群自动扩缩器的限制。
集群自动扩缩器做出以下假设:
所有复制的 Pod 都可以在其他节点上重启,这可能会导致短暂的中断。如果您的服务无法容忍中断,我们不建议使用集群自动扩缩器。
用户或管理员不会手动管理节点。如果为节点池启用了自动扩缩功能,则无法替换该节点池的
replicas
字段。单个节点池中的所有节点都具有一组相同的标签。
集群自动扩缩的工作原理
集群自动扩缩器在节点池上运行。为节点池启用自动扩缩功能时,您可以为该池指定最小和最大节点数。
集群自动扩缩器会根据节点上运行的 Pod 的资源请求(而不是实际资源利用率)自动增加或减少池中的节点数量。它会定期检查 Pod 和节点的状态,并执行相应的操作:
如果由于池中没有足够的节点而无法调度 Pod,则集群自动扩缩器会添加节点,直至达到指定的最大值。
如果节点利用率过低,并且可以通过池中的节点较少来调度所有 Pod,则集群自动扩缩器会移除节点,并降至指定的最小值。如果某个节点无法正常排空,系统会强制终止该节点,并安全分离挂接的 Kubernetes 托管磁盘。
如果您的 Pod 请求的资源太少(或者没有更改可能不够的默认值),并且节点出现短缺情况,则集群自动扩缩器不会纠正这种情况。您可以通过为所有工作负载发出显式资源请求,帮助确保集群自动扩缩器准确工作。
对于单个节点池,minReplicas
必须 ≥ 1。但是,在任何给定时间,未设置污点的用户集群节点的总和必须至少为 3。这意味着所有自动扩缩的节点池的 minReplicas
值之和,加上所有非自动扩缩节点池的 replicas
值之和的总和必须至少为 3。
集群自动扩缩器会考虑各个节点池中实例类型的相对费用,并尝试以尽可能减少浪费的方式扩展节点池。
创建启用自动扩缩功能的用户集群
如需创建用户集群并为节点池启用自动扩缩功能,请在用户集群配置文件中填写节点池的 autoscaling
部分。例如:
nodePools: - name: pool‐1 … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5
上述配置会创建一个具有 3 个副本的节点池,并应用自动扩缩(最小节点池大小为 1,最大节点池大小为 5)。
minReplicas
值必须大于等于 1。节点池不能缩减到零个节点。
添加启用自动扩缩功能的节点池
如需将具有自动扩缩功能的节点池添加到现有集群,请执行以下操作:
修改用户集群配置文件以添加新的节点池,并为该池添加
autoscaling
部分。根据需要设置replicas
、minReplicas
和maxReplicas
的值。例如:nodePools: - name: my-new-node-pool … replicas: 3 ... autoscaling: minReplicas: 2 maxReplicas: 6
更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
为现有节点池启用自动扩缩功能
如需为现有集群中的节点池启用自动扩缩功能,请执行以下操作:
修改用户集群配置文件中的特定
nodePool
,并添加autoscaling
部分。根据需要设置minReplicas
和maxReplicas
的值。nodePools: - name: my-existing-node-pool … replicas: 3 ... autoscaling: minReplicas: 1 maxReplicas: 5
更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG \ --kubeconfig ADMIN_CLUSTER_KUBECONFIG
为现有节点池停用自动扩缩功能
要为特定节点池停用自动扩缩功能,请执行以下操作:
修改用户集群配置文件并移除该节点池的
autoscaling
部分。运行
gkectl update cluster
。
检查集群自动扩缩器的行为
您可以通过多种方式确定集群自动扩缩器正在执行的操作。
检查集群自动扩缩器日志
首先,找到集群自动扩缩器 Pod 的名称:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n USER_CLUSTER_NAME | grep cluster-autoscaler
检查集群自动扩缩器 Pod 上的日志:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG logs cluster-autoscaler-POD_NAME --container cluster-autoscaler -n USER_CLUSTER_NAME
将 POD_NAME 替换为集群自动扩缩器 Pod 的名称。
检查配置映射
集群自动扩缩器发布 kube-system/cluster-autoscaler-status
配置映射。
如需查看配置映射,请执行以下操作:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get configmap cluster-autoscaler-status -n kube-system -o yaml
检查集群自动扩缩事件。
您可以检查以下对象上的集群自动扩缩事件:
- pod 上(特别是无法调度的 pod 或未充分利用的节点上)
- 节点上
kube-system/cluster-autoscaler-status
配置映射。
限制
集群自动扩缩器具有以下限制:
不支持使用更改后的过滤条件进行自定义安排。
如果 Pod 的
PriorityClass
值低于-10
,则节点不会纵向扩容。如需了解详情,请参阅集群自动扩缩器如何与 Pod 优先级和抢占配合使用?。不支持 Windows 节点池的自动伸缩。
问题排查
有时,集群自动扩缩器无法完全缩减,缩减后还会有额外节点存在。当所需的系统 Pod 被安排到其他节点上时会发生这种情况,因为没有任何触发器适用于任何这些移动到其他节点的 Pod。请参阅我有一些利用率较低的节点,但它们没有被缩减。为什么?。 要解决此限制,您可以配置 Pod 中断预算。
如果您在缩减集群时遇到问题,请参阅 Pod 调度和中断。您可能需要为
kube-system
Pod 添加PodDisruptionBudget
。如需详细了解如何为kube-system
Pod 手动添加PodDisruptionBudget
,请参阅 Kubernetes 集群自动扩缩器常见问题解答。进行缩减时,集群自动扩缩器会遵循对 Pod 设置的安排和删除规则。这些限制可以防止自动扩缩器删除节点。如果节点包含满足以下任意条件的 Pod,则可以阻止删除该节点:
Pod 的亲和性或反亲和性规则阻止重新调度。
Pod 具有本地存储空间。
Pod 不受控制器(如 Deployment、StatefulSet、Job 或 ReplicaSet)管理。
Pod 位于 kube-system 命名空间中,并且没有 PodDisruptionBudget
应用的 PodDisruptionBudget 可能会阻止自动扩缩。如果删除节点会导致超出预算,则集群不会缩减。
更多信息
如需详细了解集群自动扩缩器以及如何防止中断,请参阅 Kubernetes 集群自动扩缩器常见问题解答中的以下问题: