HorizontalPodAutoscaler要点回顾

2020-09-01

引言

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 的自动扩缩,这个特性已经被弃用了。