一、什么是cluster-autoscaler
CA( cluster-autoscaler)是用来弹性伸缩kubernetes集群的。我们在使用kubernetes集群经常问到的一个问题是,我应该保持多大的节点规模来满足应用需求呢? cluster-autoscaler的出现解决了这个问题,它可以自动的根据部署的应用所请求的资源量来动态的伸缩集群。
二、CA架构
CA由以下几个模块组成:
- autoscaler:核心模块,负责整体扩缩容功能
- Estimator:负责评估计算扩容节点
- Simulator:负责模拟调度,计算缩容节点
- CA Cloud-Provider:与云交互进行节点的增删操作。社区目前仅支持AWS和GCE,其他云厂商需要自己实现CloudProvider和NodeGroup相关接口。
CA的架构如下图所示:
三、其他细节
3.1 什么时候CA改变集群大小
扩容: 由于资源不足,pod调度失败,即有pod一直处于Pending状态。
缩容:node的资源利用率较低时,且此node上存在的pod都能被重新调度到其他node上运行。
3.2 什么样的节点不会被CA删除
- 节点上有pod被PodDisruptionBudget控制器限制。
- 节点上有命名空间是kube-system的pods。
- 节点上的pod不是被控制器创建,例如不是被deployment, replica set, job, stateful set创建。
- 节点上有pod使用了本地存储
- 节点上pod驱逐后无处可去,即没有其他node能调度这个pod
- 节点有注解:”cluster-autoscaler.kubernetes.io/scale-down-disabled”: “true”
3.3 如何防止节点被CA删除
可以通过给节点打上特定注解保证节点不给CA删除:
kubectl annotate node <nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
3.4 CA如何与HPA协同工作
HPA(Horizontal Pod Autoscaling)是k8s中pod的水平自动扩展,HPA的操作对象是RC、RS或Deployment对应的Pod,根据观察到的CPU等实际使用量与用户的期望值进行比对,做出是否需要增减实例数量的决策。
当CPU负载增加,HPA扩容pod,如果此pod因为资源不足无法被调度,则此时CA出马扩容节点。
当CPU负载减小,HPA减少pod,CA发现有节点资源利用率低甚至已经是空时,CA就会删除此节点。
四、部署使用CA
直接在集群中部署即可,简化的yaml如下所示,启动参数按需添加,其中{{MIN}}是最小节点数,{{MAX}}是最大节点数
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cluster-autoscaler
labels:
k8s-app: cluster-autoscaler
spec:
replicas: 1
selector:
matchLabels:
k8s-app: cluster-autoscaler
template:
metadata:
labels:
k8s-app: cluster-autoscaler
spec:
containers:
- image: cluster-autoscaler:latest
name: cluster-autoscaler
command:
- ./cluster-autoscaler
- --nodes={{MIN}}:{{MAX}}:k8s-worker-asg-1