引言
Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
检测周期设置
horizontal-pod-autoscaler-sync-period 默认15s
核心算法
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
容忍值
上面公式(当前指标 / 期望指标)值在一定范围内不做扩缩容。可通过以下配置调整,如配置为0.1,说明值在[0.9 ~ 1.1]之间不做扩缩。
horizontal-pod-autoscaler-tolerance 默认0.1
kubectl 对 Horizontal Pod Autoscaler 的支持
如下语句将会为名为foo的ReplicationSet创建一个HPA对象,目标CPU使用率为80%,副本数量配置为2到5之间
kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80
滚动升级时扩缩
HPA支持绑定到Deployment,无法绑定到ReplicationSet,原因是HPA无法绑定到滚动更新时所新创建的副本控制器
如何防止抖动
horizontal-pod-autoscaler-downscale-stabilization: kube-controller-manager 的这个参数表示缩容冷却时间。 即自从上次缩容执行结束后,多久可以再次执行缩容,默认时间是 5 分钟(5m0s)。
多指标作为扩缩依据
Kubernetes 1.6 开始支持基于多个度量值进行扩缩。 你可以使用 autoscaling/v2beta2
API 来为 Horizontal Pod Autoscaler 指定多个指标。 Horizontal Pod Autoscaler 会根据每个指标计算,并生成一个扩缩建议。
幅度最大的扩缩建议会被采纳
自定义指标支持以及开启条件
- 启动APIServer Aggregated
- 自定义指标提供方完成相应API的注册
- 对于资源指标,将使用
metrics.k8s.io API
,一般由 metrics-server 提供。 它可以做为集群插件启动。 - 自定义指标,将使用
custom.metrics.k8s.io
API,可由Prometheus-Adapter提供 - 外部指标,将使用
external.metrics.k8s.io
API
- 对于资源指标,将使用
horizontal-pod-autoscaler-use-rest-clients
参数设置为 true 或者不设置。 如果设置为 false,则会切换到基于 Heapster 的自动扩缩,这个特性已经被弃用了。