Kubernetes Horizontal Pod Autoscaler
Horizontal Pod Autoscaler
Pod 水平自动伸缩(Horizontal Pod Autoscaler) 简称 HPA
HPA
可以基于CPU利用率自动伸缩 replication controller、deployment和 replica set 中的 pod 数量,(除了 CPU 利用率)也可以 基于其他应程序提供的度量指标custom metrics
。Pod
水平自动伸缩特性由Kubernetes API
资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的获取平均CPU
利用率,并与目标值相比较后来调整replication controller
或deployment
中的副本数量。
HPA 原理
Pod 水平自动伸缩的实现是一个控制循环, 由
controller manager
的--horizontal-pod-autoscaler-sync-period
参数 指定周期(默认值为15秒)。 每个周期内,controller manager
根据每个HorizontalPodAutoscaler
定义中指定的指标查询资源利用率。controller manager
可以从resource metrics API
(每个pod 资源指标)和custom metrics API
(其他指标)获取指标。对于每个 pod 的资源指标(如 CPU),控制器从资源指标 API 中获取每一个
HorizontalPodAutoscaler
指定 的 pod 的指标,然后,如果设置了目标使用率,控制器获取每个 pod 中的容器资源使用情况,并计算资源使用率。 如果使用原始值,将直接使用原始数据(不再计算百分比)。 然后,控制器根据平均的资源使用率或原始值计算出缩放的比例,进而计算出目标副本数。- 注: 如果 pod 某些容器不支持资源采集,那么控制器将不会使用该 pod 的 CPU 使用率。
如果 pod 使用自定义指示,控制器机制与资源指标类似,区别在于自定义指标只使用原始值,而不是使用率。
如果 pod 使用对象指标和外部指标(每个指标描述一个对象信息)。 这个指标将直接跟据目标设定值相比较,并生成一个上面提到的缩放比例。在 autoscaling/v2beta2 版本API中, 这个指标也可以根据 pod 数量平分后再计算。
通常情况下,控制器将从一系列的聚合 API
(metrics.k8s.io、custom.metrics.k8s.io和external.metrics.k8s.io)
中获取指标数据。metrics.k8s.io API
通常由metrics-server
(需要额外启动)提供。- 注: 自
Kubernetes 1.11
起, 从Heapster
获取指标特性已废弃。
- 注: 自
HPA 算法细节
从最基本的角度来看,pod 水平自动缩放控制器跟据当前指标和期望指标来计算缩放比例。
期望副本数
=ceil[当前副本数 * ( 当前指标 / 期望指标 )]
- 如: 当前指标为200m, 目标设定值为100m, 那么由于
200.0 / 100.0 == 2.0
, 副本数量将会翻倍。 - 如: 当前指标为50m, 副本数量将会减半,因为
50.0 / 100.0 == 0.5
。 - 如: 计算出的缩放比例接近1.0(跟据
--horizontal-pod-autoscaler-tolerance
参数全局配置的容忍值,默认为0.1), 将会放弃本次缩放。
- 如: 当前指标为200m, 目标设定值为100m, 那么由于
创建 HPA
如下使用 deployment 进行 HPA 的测试
- HPA API
v1
版本只支持CPU
,v2beta2
版本支持多metrics(CPU,memory)
以及自定义metrics
。
- HPA API
|
|
创建 hpa
- 通过命令
kubectl autoscale deployment nginx --min=1 --max=5 --cpu-percent=50
默认使用api v1
。
- 通过命令
|
|
- 查看 hpa 服务
|
|
- 测试一下
|
|
|
|