一、Pod自动扩容


Horizontal Pod Atuosacler(HPA)的控制器,用于实现基于CPU使用率进行自动Pod扩缩容功能。HPA控制器是基于Master的kube-controller-manager服务启动参数--horizontal-pod-autoscaler-sync-period定义的探测周期(默认是15s),周期性检测目标Pod的资源性能指标,并与HPA资源对象中扩缩容条件对比,在满足条件时对Pod副本数量进行调整。

    Kubernetes早期版本只能基于Pod的CPU使用率进行自动扩缩容。从1.11版本开始,起用Heapster并转向基于Metrics Server完成数据采集。Metrics Server将采集到的Pod性能指标数据通过API提供给HAP控制器进行查询。


二、HPA的工作原理


   Kubernetes中的某个Metrics Server持续采集所有Pod副本的指标数据。HAP控制器通过 Metrics Server的API获取这些数据,基于用户定义的扩容规则进行计算,得到目标Pod的副本数量。当目标Pod副本数量与当前副本数量不同时,HPA控制器就向Pod的副本数量控制器(Deployment、RC或ReplicaSet)发起scale操作,调整Pod的副本数量完成扩缩容操作。




kubespray快速扩容 kubernetes扩容缩容_Pod


三、指标类型

Master的kube-controller-manager服务持续监测目标Pod的某种性能指标,以计算是否需要调整副本数量,目前kubernetes监测的性能指标

  • Pod资源使用率:Pod级别的性能指标,通常一个比率值,例如CPU使用率
  • Pod自定义指标:Pod级别的性能指标,通常是一个数值,例如接收请求数量
  • Object自定义指标或外部自定义指标:通常是一个数值,需要容器以某种方式提供,例如通过HTTP URL“/metrics”提供,或者使用外部服务提供性能指标采集URL

四、扩缩容算法

1. 设置期望值

    Autoscaler控制器从聚合API获取到Pod性能指标数据后,基本下面的算法计算出目标Pod副本数量,与当前运行Pod副本数量进行比对,决定是否需要进行扩缩容操作。

desiredReplicas = ceil[currentReplicas * (currentMetricValue/desiredMetricValue)]
# 期望Pod副本数 = 当前Pod副本数 X ( 当前指标值 / 期望指标值 ),将结果向上取整
#例如(CPU请求数量为例),如果用户设置的期望指标值为100m,当前实际使用指标值为200m,计算得到期望的Pod副本数量应该为两个(200/100 = 2)。如果当前实际使用为50m,计算结果为0.5,向上取值为1,得到
#目标Pod副本数量应该为 1

     当计算结果与1非常接近时,可以设置一个容忍度让系统不做扩容操作。容忍度通过kube-controller-manager服务启动参数,--horizontal-pod-autoscaler-tolerance进行设置,默认值为0.1(10%),表示基于上述算法得到的结果在[-10%, +10%]区间内,即[0.9, 1.1]区间,控制器不会进行扩缩容操作。

2. 设置期望值指标为平均值

    可以将期望指标值设置为指标的平均值类型,例如targetAverageValue或targetAverageUtilization,此时当前指标值(currentMetricsValue)的算法为所有Pod副本当前指标值的总和除以Pod副本数量得到的平均值。

  • Pod正在被删除(设置了删除时间戳):将不计入目标Pod副本数量
  • Pod的当前指标值无法获取:本次探测不会讲这个Pod纳入目标Pod副本数量,后续探测会重新纳入计算范围
  • 如果指标类型是CPU使用率,则对于正在启动但还没有达到Ready状态的Pod,也暂时不会纳入目标副本Pod数量范围

    使用HPA特性时,可能因为指标的动态变化造成Pod副本数量频繁变动,这也被称为“抖动”。抖动会影响业务稳定性,在Kubernetes 1.12版本增加了参数来解决这个问题,HPA扩缩容冷却时间,即从上次扩缩容执行结束之后,需要经过最少多长时间进行扩缩容操作,从而消除短时间内指标值快速波动产生的影响。对该参数调整需要根据当前生产环境的时间调整。时间过短还是会存在都用,时间过长,导致HPA失效。