Pod 自动扩缩容
幸运的是Kubernetes
为我们提供了这样一个资源对象:Horizontal Pod Autoscaling
(Pod水平自动伸缩),简称HPA
。HAP
通过监控分析RC
或者Deployment
控制的所有Pod
的负载变化情况来确定是否需要调整Pod
的副本数量,这是HPA
最基本的原理。
HPA
在kubernetes
集群中被设计成一个controller
,我们可以简单的通过kubectl autoscale
命令来创建一个HPA
资源对象,HPA Controller
默认30s轮询一次(可通过kube-controller-manager
的标志--horizontal-pod-autoscaler-sync-period
进行设置),查询指定的资源(RC或者Deployment)中Pod
的资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能。
当你创建了HPA
后,HPA
会从Heapster
或者用户自定义的RESTClient
端获取每一个一个Pod
利用率或原始值的平均值,然后和HPA
中定义的指标进行对比,同时计算出需要伸缩的具体值并进行相应的操作。目前,HPA
可以从两个地方获取数据:
- Heapster:仅支持使用率
- 自定义监控:我们到后面的监控的课程中再给大家讲解这部分的使用方法
我们这节课来给大家介绍从Heapster
获取监控数据来进行自动扩缩容的方法,所以首先我们得安装Heapster
,前面我们在kubeadm
搭建集群的课程中,实际上我们已经默认把Heapster
相关的镜像都已经拉取到节点上了,所以接下来我们只需要部署即可,我们这里使用的是Heapster
1.4.2 版本的,前往Heapster
的github
页面:
https://github.com/kubernetes/heapster
同样的,我们来创建一个Deployment
管理的Nginx
Pod,然后利用HPA
来进行自动扩缩容。定义Deployment
的YAML
文件如下:(hap-deploy-demo.yaml)
然后创建Deployment
:
$ kubectl create -f hpa-deploy-demo.yaml
现在我们来创建一个HPA
,可以使用kubectl autoscale
命令来创建:
$ kubectl autoscale deployment hpa-nginx-deploy --cpu-percent=10 --min=1 --max=10
deployment "hpa-nginx-deploy" autoscaled
···
$ kubectl get hpa
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 0% 1 10 13s
此命令创建了一个关联资源 hpa-nginx-deploy 的HPA
,最小的 pod 副本数为1,最大为10。HPA
会根据设定的 cpu使用率(10%)动态的增加或者减少pod数量。
当然出来使用命令来创建外,我们依然可以通过创建YAML
文件的形式来创建HPA
资源对象。如果我们不知道怎么编写的话,可以查看上面命令行创建的HPA
的YAML
文件:
好,现在我们根据上面的YAML
文件就可以自己来创建一个基于YAML
的HPA
描述文件了。
$ kubectl run -i --tty load-generator --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.
/ # while true; do wget -q -O- http://172.16.255.60:4000; done
下图可以看到,HPA已经开始工作。
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 29% 1 10 27m
同时我们查看相关资源hpa-nginx-deploy的副本数量,副本数量已经从原来的1变成了3。
同时再次查看HPA
,由于副本数量的增加,使用率也保持在了10%左右。
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 9% 1 10 35m
同样的这个时候我们来关掉busybox
来减少负载,然后等待一段时间观察下HPA
和Deployment
对象
$ kubectl get hpa
NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE
hpa-nginx-deploy Deployment/hpa-nginx-deploy 10% 0% 1 10 48m
$ kubectl get deployment hpa-nginx-deploy
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
可以看到副本数量已经由3变为1。
不过当前的HPA
只有CPU
使用率这一个指标,还不是很灵活的,在后面的课程中我们来根据我们自定义的监控来自动对进行扩缩容。