本文档介绍了 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 集群自动扩缩器常见问题解答中的以下问题: