Skip to Content
集群弹性伸缩集群伸缩(CA)

Cluster Autoscaler

前言

Cluster Autoscaler(CA)用于自动调整集群中Node节点的数量,以满足业务需求。

我们知道,在创建Pod的时候,我们可以为每个容器指定CPU、内存、GPU等资源的请求量(Request),Kubernetes的调度组件(scheduler)会通过Request来判断将Pod调度到哪个Node节点。如果集群内没有节点有足够的空闲余量,则该Pod将无法被成功创建,而是一直处于Pending状态,直到有新的Node节点加入集群或者存量Pod被删除释放出空闲余量。

CA组件查找无法被成功调度的Pod,并遍历伸缩组,判断通过伸缩组模版扩容的新节点是否满足要求,如果判断新加节点可以使得Pod被成功调度,则CA将扩容集群。

CA组件同样也会缩容集群,缩容的触发条件为某个Node节点的Request请求率低于缩容阈值,不过缩容并不是马上进行的,而是等待一段时间(目前默认是10分钟),可以通过—scale-down-unneeded-time这个参数来修改。

和HPA不同,CA不是内置的,而是以Deployment的形式运行在Kubernetes集群中,UK8S已支持CA,你可以在UK8S的管理界面中配置CA。

工作原理

CA的扩容触发条件为存在因为集群资源不足导致无法成功创建的Pod,这里的资源包括CPU、内存和GPU。以GPU为例,当Pod申请了GPU资源nvidia.com/gpu(参考GPU节点使用文档),但因集群中无GPU节点而处于pending状态时,CA就会在配置了GPU机型模版的伸缩组中自动扩容节点。

CA的缩容触发条件为node节点在一定时间内(默认10分钟)资源请求率(Request)低于缩容阈值(如50%)且节点上的所有Pod都能被调度到其他节点上

值得注意的是节点上的所有Pod都能被调度到其他节点这个条件,很多配置了CA的同学会疑问某节点资源申请量低于阈值却没有触发缩容,原因其实很简单,如果这个节点上运行了一个独立的Pod(没有被任何控制器管理),因为Pod无法被重新调度,为了保证业务正常运行,则节点的缩容不会进行。

在UK8S中使用集群伸缩

1、创建伸缩配置

2、填写配置参数

一般默认值即可

3、创建伸缩组

重要,即触发集群扩容时,Node节点的配置,伸缩区间主要用于防范因为DDos等导致的无限制扩容。

4、开启集群伸缩

创建完伸缩组后,我们之后还需要开启伸缩组,点击开启操作后,你的UK8S集群会出现一个Cluster-Autoscaler的Deployment,如果手动删除该Deployment,会导致集群伸缩无法正常工作,您需要在集群伸缩页面先关闭,再开启以触发重新创建。

CA参数说明

CA本身有很多命令参数,可以调整伸缩的一些行为。可以通过更改CA deployment的args参数来调整。

下面是一些CA参数以及说明:

参数类型默认值说明
scale-down-delay-after-addDuration10min扩容后进行缩容的延迟。
scale-down-delay-after-deleteDuration同scan-interval删除节点后进行缩容的延迟。
scale-down-unneeded-timeDuration10min节点标记为unneeded之后,多久进行缩容。
node-deletion-delay-timeoutDuration2minCA等待节点删除完成的超时时间。
scan-intervalDuration10s多久进行一次扩缩容扫描。
max-nodes-totalint0最大扩容节点数量。
cores-totalString[0:32E+04]集群的CPU核心扩缩容范围。
memory-totalString[0:64E+05]集群的内存扩缩容范围。