阿里云Kubernetes服务简化了K8S集群的创建、升级和手动扩缩容。然而使用Kubernetes集群经常问到的一个问题是,我应该保持多大的节点规模来满足应用需求呢? Autoscaler的出现解决了这个问题,它可以自动的根据部署的应用所请求的资源量来动态的伸缩集群。
tips: 一个好的实践是显示的为你的每个应用指定资源请求的值request.
前置条件
为了实现集群规模的自动扩展,需要完成以下工作。
使用阿里云Kubernete服务在阿里云某个Region创建一个kubernetes集群,这里以杭州Region为例。
在相应的Region(示例杭州)创建ESS弹性伸缩实例,并配置。
获取kubernetes集群的添加节点命令
为了使得ESS实例节点可以动态加入Kubernetes集群,我们需要获取Kubernetes集群添加节点命令作为,ESS伸缩组的userdata数据。
进入上一步创建好的Kubernetes集群的管理控制台,选择刚刚创建的集群,点击[更多]->[添加已有节点]:
拷贝黑框中的内容备用:
curlhttp://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/pkg/run/attach/attach_node.sh | bash -s -- --docker-version17.06.2-ce-1--token 9e3606.1de6xxxxxxxx9a9 --endpoint192.168.223.87:6443--cluster-dns172.19.0.1
ESS 需要这段脚本来初始化新扩展出来的节点。
创建ESS实例。
自动扩展kubernetes集群需要阿里云ESS(弹性伸缩组)的支持,因此需要先创建一个ESS。
进入ESS控制台. 选择杭州Region(和kubernetes集群所在region保持一致),点击【创建伸缩组】,在弹出的对话框中填写相应信息,注意网络类型选择专有网络,并且专有网络选择前置条件1中的Kubernetes集群的vpc网络名,然后选择一个vswitch,然后提交。如下图:
注意:
这里的VPC网络的选择一定要是前面创建的kubernetes集群所使用的VPC网络,可以进入容器服务kubernetes集群[控制台](),选择该集群,点击管理,查看该VPC信息,如下图:
最后记录刚刚创建的伸缩组的名字,格式为regionid.ess_group_name, eg. cn-hangzhou.kubernetes-hangzhou-group,这个名字在配置autoscaler的时候会用上。
创建伸缩配置项
选择刚才创建的伸缩组,点击添加[伸缩配置], 选择实例规格、安全组(和kubernetes集群同属于一个安全组)、带宽峰值选择0(不分配公网IP)、公共镜像选择centos 7.4、设置云盘大小, 最后设置用户数据。
注意用户数据选择【使用文本形式】,同时将获取kubernetes集群的添加节点命令粘贴到该文本框中,并在之前添加#!/bin/bash和yum clean all。 下面是一个用户数据的示例,替换成你自己的:
#!/bin/bashyum clean allcurl http://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/public/pkg/run/attach/attach_node.sh | bash-s-- --docker-version 17.06.2-ce-1 --token 9e3606.1de6xxxxxxxx9a9 --endpoint 192.168.223.87:6443 --cluster-dns 172.19.0.10
然后完成创建,启用配置。
部署Autoscaler到kubernetes集群中
由于autoscaler会调用阿里云ESS api来触发集群规模调整,因此需要配置api 访问的accesskey。 同时需要手动指定上面刚刚创建伸缩组,格式为regionid.ess_group_name, 上面示例:cn-hangzhou.kubernetes-hangzhou-group
创建AutoScaler kubernetes deployment。 所有命令均在其中一台master上面执行。
完成创建。
测试自动扩展节点效果
Autoscaler根据用户应用的资源静态请求量来决定是否扩展集群大小,因此请设置好应用的资源请求量。
测试前节点数量如下,配置均为2核4G ECS,其中两个节点可调度。
接下来我们创建一个副本nginx deployment, 指定每个nginx副本需要消耗1核1G内存。
看到由于有足够的cpu内存资源,所以pod能够正常调度。接下来我们使用kubectl scale 命令来扩展副本数量到4个。
发现由于没有足够的cpu内存资源,该pod无法被调度(pod 处于pending状态)。这时候autoscaler会介入,尝试创建一个新的节点来让pod可以被调度。接下来我们执行一个watch kubectl get no 的命令来监视node的添加。大约几分钟后,就有新的节点添加进来了
可以观察到比测试前新增了一个节点,并且pod也正常调度了。
测试自动收缩节点数量
当Autoscaler发现通过调整Pod分布时可以空闲出多余的node的时候,会执行节点移除操作。这个操作不会立即执行,通常设置了一个冷却时间,300s左右才会执行scale down。
通过kubectl scale 来调整nginx副本数量到1个,观察集群节点的变化。
总结
Autoscaler会作为一个开源工具独立使用,阿里云Kubernetes服务也将进一步简化弹性伸缩的用户体验,将弹性计算和Kubernetes集群管理完美结合在一起。也欢迎您的意见和建议,帮助我们迭代产品能力。
阿里云Kubernetes服务 全球首批通过Kubernetes一致性认证,简化了Kubernetes集群生命周期管理,内置了与阿里云产品集成,也将进一步简化Kubernetes的开发者体验,帮助用户关注云端应用价值创新。
本文作者:初扬