Pod 水平自动扩缩(Horizontal Pod Autoscaler) 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标 来执行自动扩缩。 Pod 自动扩缩不适用于无法扩缩的对象,比如 DaemonSet。
工作机制如下:

Pod 水平自动扩缩器的实现是一个控制回路,有控制管理器的 --horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)。
在每个周期内,控制器管理器根据每个HorizontalPodAutoscaler定义中指定的指标查询资源利用率。控制器管理器可以从资源度量指标API(按Pod统计的资源用量)和自定义度量指标API(其他指标)获取度量值。
- 对于按pod统计的资源指标(如CPU),控制器从资源指标API中获取每个 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果设置了目标使用率,控制器获取每个Pod中的容器资源使用情况,并计算资源使用率。如果设置了target值,将直接使用原始数据(不用计算百分比)。接下来,控制器根据平均资源的使用率或者原始值计算出扩缩的比例,进而计算出目标副本数。
- 如果pod 使用的自定指标,控制器机制与资源指标类似,区别在与自定义指标只使用原始值,而不是使用率。
- 如果pod使用对象指标和外部指标(每一个指标描述一个对象信息)。这个指标会根据目标设定值相比较,并生成一个上面提到的扩缩比例。在autoscaling/v2beta2 版本API中,这个指标也可以根据Pod数量平分后再计算。
通过 metrics-server 获取Pod相关的指标,进行自动伸缩。
计算公式
从最基本的角度来看,Pod 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
关于API对象
在当前稳定版本(autoscaling/v1)中只支持基于 CPU 指标的扩缩。
使用kubectl创建Horizontal Pod Autoscaler
kubectl 以标准方式支持 HPA。 我们可以通过 kubectl create 命令创建一个 HPA 对象, 通过 kubectl get hpa 命令来获取所有 HPA 对象, 通过 kubectl describe hpa 命令来查看 HPA 对象的详细信息。 最后,可以使用 kubectl delete hpa 命令删除对象。
此外,还有个简便的命令 kubectl autoscale 来创建 HPA 对象。 例如,命令 kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80 将会为名 为 foo 的 ReplicationSet 创建一个 HPA 对象, 目标 CPU 使用率为 80%,副本数量配置为 2 到 5 之间。
