一直以来,系统的自动弹性扩展是一个重点话题,希望系统可根据应用负载的变化而自动增加或者减少计算资源。
自动弹性扩展一般包括两种方式:
水平扩展:针对实例数目的增减;
垂直扩展:对单个实例可用资源的增减;
我们知道,通过Replication Controller可以非常方便地实现Pod的弹性伸缩,如果在此基础上,获取并分析Kubernetes平台所监控的Pod各项资源监控指标,就可以实现自动伸缩的功能,即基于Pod的资源使用情况,根据配置的策略自动调整Pod的副本数。
Horizontal Pod Autoscaler(HPA)属于水平扩展。在Kubernetes中通过Horizontal Pod Autoscaler来实现Pod的自动伸缩。
Horizontal Pod Autoscaler的操作对象是Replication Controller、Deployment/Replica Set对应的Pod,根据监测到各关联Pod的CPU实际平均使用率与用户的期望值进行比对,从而做出是否需要增减Pod实例数量的决策,并通过Replication Controller来调整Pod的副本数,实现自动伸缩。目前使用heapSter来检测Pod的CPU使用量,检测周期默认是30s。
举例说明通过创建Horizontal Pod Autoscaler来实现Nginx Pod的自动弹性伸缩,HorizontalPod Autoscaler定义文件deployment.yaml如下:
apiVersion: apps/v1
kind: HorizontalPodAutoscaler
metadata:
name: mydeployment
namespace: default
spec:
scaleRef:
kind: ReplicationController
name: mydeployment
subresource: scale
minReplicas: 1
maxReplicas:
cpuUtilization:
targetPercentage: 60
在此Horizontal Pod Autoscaler中通过.spec.scaleRef指定对应的Replication Controller,.spec.minReplicas和.spec.maxReplicas分别设定Pod可伸缩的最小和最大副本数。另外,其设置了自动伸缩策略:当所有关联Pod的CPU平均使用率超过60%的时候进行扩容,而少于60%的时候进行缩容。
在Horizontal Pod Autoscaler Controller检测到CPU的实际使用量之后,会求出当前的CPU使用率(实际使用量与Pod请求量的比率)。然后,Horizontal Pod Autoscaler Controller会通过调整副本数量使得CPU使用率尽量向期望值靠近。
另外,由于自动扩展的决策一般需要一段时间后才会显现,而且在短期内还会引入一些新的CPU负荷(如创建或者删除Pod等)。比如,当Pod所需要的CPU负荷过大,经过分析判断需要运行一个新的Pod进行分流,在新建Pod的过程中系统的CPU使用量可能会有一个攀升的过程。因此,在每次决策后的一段时间内将不再进行扩展决策。对于水平扩容(ScaleUp)而言,这个时间段为3分钟;对于水平收缩(ScaleDown)而言,这个时间段为5分钟。再者,Horizontal Pod Autoscaler Controller允许一定范围内的CPU使用量的不稳定,也就是说,出于维护系统稳定性的考虑,只有当CurrentPodConsumption/Target的比值低于0.9或者高于1.1时才进行实例调整。
参考书籍:《基于Kubernetes的容器云平台实战》
个人github账号:https://github.com/SpecialAll