hpa注意事项及外部指标使用
一、算法细节
- 公式:desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue ]
期望副本数 =[当前副本数 * (当前指标 /期望指标)] #结果向上取整 - 举例说明:当前指标为200m,目标设定值为100m,那么由于200.0 / 100.0 == 2.0, 副本数量将会翻倍。 如果当前指标为50m,副本数量将会减半,因为50.0 / 100.0 == 0.5
- 也可以将期望指标值(desiredMetricValue)设置为指标的平均值类型,例如 targetAverageValue 或 targetAverageUtilization,此时当前指标值(currentMetricValue)的算法为所有 Pod 副本当前指标值的总和除以 Pod 副本数量得到的平均值
- 异常pod处理:
1)Pod 正在被删除(设置了删除时间戳):将不会计入目标 Pod 副本数量
2)Pod 的当前指标值无法获得:本次探测不会将这个 Pod 纳入目标 Pod 副本数量,后续的探测会被重新纳入计算范围
3)如果指标类型是 CPU 使用率,则对于正在启动但是还未达到 Ready 状态的 Pod,也暂时不会纳入目标副本数量范围
4)即:在进行计算期望副本数时不包括以上pod - 任何 pod 的指标缺失,则会更保守地重新计算平均值, 在需要缩小时假设这些 pod 消耗了目标值的 100%, 在需要放大时假设这些 pod 消耗了0%目标值
- 任何尚未就绪的pod,在不考虑遗漏指标或尚未就绪的pods的情况下进行伸缩, 我们保守地假设尚未就绪的pods消耗了期望指标的0%
- 如果创建 HorizontalPodAutoscaler 时指定了多个指标, 那么会按照每个指标分别计算缩放副本数,取最大的进行缩放
- 如果任何一个指标无法顺利的计算出缩放副本数, 那么本次缩放会被跳过
注意:当结果计算与 1 非常接近时,可以设置一个容忍度让系统不做扩缩容操作,默认值为 0.1(即 10%),表示基于上述算法得到的结果在 [-10% + 10% ] 区间内,即 [ 0.9 - 1.1],控制器都不会进行扩缩容操作
二、相关细节设置
--horizontal-pod-autoscaler-sync-period #指定周期(默认15秒) --horizontal-pod-autoscaler-tolerance #容忍值,默认0.1,如果缩放比例接近0.1将会放弃缩放 --horizontal-pod-autoscaler-initial-readiness-delay #用于设置 pod 准备时间, 在此时间内的 pod 统统被认为未就绪(默认30s) --horizontal-pod-autoscaler-cpu-initialization-period #用于设置 pod 的初始化时间, 在此时间内的 pod,CPU 资源指标将不会被采纳(默认5分钟) --horizontal-pod-autoscaler-downscale-stabilization #设置收缩冷却/延迟时间(默认5分钟);时间设置过短容易引起抖动(频繁伸缩),过长会导致响应不及时
三、注意事项
-
在单次扩容操作中可增加的副本数受到限制:如果当前副本数大于2,Autoscale单次操作至多使副本数翻倍,如果副本数只有1或2,最多扩展到4个副本
-
两次扩容操作之间的时间间隔限制
只有当3分钟内没有任何伸缩操作时,才会触发扩容;缩容的频率是5分钟(--horizontal-pod-autoscaler-downscale-stabilization) - Horizontal Pod Autoscaler 设置副本数量时, deployment 会设置底层副本数