HPA
HPA
全称HorizontalPodAutoscaler
,pod
水平自动扩缩。在 Kubernetes
中,HorizontalPodAutoscaler
自动更新工作负载资源 (例如 Deployment
或者 StatefulSet
), 目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的Pod
。 这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes
, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod
。
如果负载减少,并且 Pod
的数量高于配置的最小值, HorizontalPodAutoscaler
会指示工作负载资源(Deployment
、StatefulSet
或其他类似资源)缩减。
水平 Pod 自动扩缩不适用于无法扩缩的对象(例如:DaemonSet
。)
HorizontalPodAutoscaler
被实现为 Kubernetes API
资源和控制器。
在 Kubernetes
控制平面内运行的水平 Pod
自动扩缩控制器会定期调整其目标(例如:Deployment
)的所需规模,以匹配观察到的指标, 例如,平均 CPU
利用率、平均内存利用率或你指定的任何其他自定义指标。
HorizontalPodAutoscaler
从Metrics Server
中获得对应的资源指标,然后根据这些指标计算扩缩容比例。HorizontalPodAutoscaler
控制器访问支持扩缩的相应工作负载资源(例如:Deployment,StatefulSet,ReplicaSet) 这些资源每个都有一个名为 scale 的子资源,该接口允许你动态设置副本的数量。
算法细节
Pod 水平自动扩缩控制器根据当前指标和期望指标来计算扩缩比例。1
期望副本数 = ceil[当前副本数 * (当前指标 / 期望指标)]
例如,如果当前指标值为 200m,而期望值为 100m,则副本数将加倍, 因为 200.0 / 100.0 == 2.0 如果当前值为 50m,则副本数将减半, 因为 50.0 / 100.0 == 0.5。如果比率足够接近 1.0(在全局可配置的容差范围内,默认为 0.1), 则控制平面会跳过扩缩操作。
详细信息可查看文档
源码分析
1 | // pkg/controller/podautoscaler/horizontal.go |
1 | // Metric类型 |
REF:
1.horizontal-pod-autoscale/
2.编写自定义指标适配器
3.staging/src/k8s.io/api/autoscaling/v2/types.go
4.pkg/controller/podautoscaler/horizontal.go