工作负载伸缩主要是指通过增加应用负载副本的方式,修改负载的调度容量。本文为您介绍常见的工作负载伸缩的工作原理。
HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)在 Kubernetes 集群中用于 Pod 水平自动伸缩,它基于 CPU 和内存利用率、GPU/GPU 显存使用率、网络吞吐率等,对工作负载(例如 Deployment)和 Replicaset 控制器中的 Pod 数量进行自动扩缩容。
HPA 由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为,控制器会周期性的获取 CPU 和内存利用率、GPU/GPU 显存使用率、网络吞吐率等,并与目标值相比较后,用来调整 Replication Controller 或 Deployment 中的副本数量。
HPA 由一个控制循环实现,循环周期由 Controller Manager 中的--horizontal-pod-autoscaler-sync-period
标志指定。
在每个周期内的流程如下:
说明
计算公式为:期望副本数 = ceil [ 当前副本数 × ( 当前指标 / 期望指标 ) ]。其中,ceil 表示向上取整。
200
毫核,期望指标为100
毫核,那么由于200.0/100.0 = 2.0
, 副本数量将会翻倍。50
毫核,期望指标为100
毫核,那么由于50.0/100.0 = 0.5
。副本数量将会减半。|扩缩比例 - 1.0| <= 容忍值
,将会放弃本次扩缩容。社区版本中默认的容忍值为 0.1(即--horizontal-pod-autoscaler-tolerance
参数全局配置的容忍值)。HPA 可以配置单个或多个期望指标,配置单个期望指标时,只需要对 Pod 当前指标求和,除以期望目标值,然后向上取整,就能得到期望的副本数。例如有一个 Deployment 控制有 3 个 Pod,每个 Pod 的 CPU 使用率是 70%、50%、90%,而 HPA 中配置的 CPU 期望使用率为 50%,计算期望副本数=(70 + 50 + 90)/50 = 4.2,向上取整得到 5,即期望副本数就是 5。
如果是配置多个期望指标,则会分别计算单个期望指标的期望副本数量,然后取其中最大值,就是最终的期望副本数量。
说明
HPA 不适用于无法缩放的对象,比如 DaemonSets。
CronHPA(Cron Horizontal Pod Autoscaler,定时弹性伸缩)是一种预设任务,可以在指定时间执行指定伸缩规则,实现自动扩容或者缩容计算资源,满足业务需求的同时又能控制成本。
定时弹性伸缩比较适合业务和时间有明确相关性的场景。例如,互联网电商的秒杀大促场景。由于互联网电商的秒杀大促的时间开始时间较为固定。此时,就可以使用定时弹性伸缩功能,在指定的时间段内对工作负载进行自动扩容,保证整个系统的工作正常。
已知 CronHPA 的 YAML 定义如下:
apiVersion: vke.volcengine.com/v1alpha1 kind: CronHPA metadata: name: nginx-cronhpa namespace: default spec: crons: - schedule: CRON_TZ=Asia/Shanghai 1 1 * * * target: 1 scaleTargetRef: kind: HorizontalPodAutoscaler name: nginx-hpa scaleWorkloadRef: apiVersion: apps/v1 kind: Deployment name: nginx status: {}
通过上述 CronHPA 的定义,可以发现:
minReplicas
、maxReplicas
、desiredReplicas
的数值。scaleTargetRef
所对应的当前Relicas
值。因此,CronHPA 兼容 HPA 的规则如下所示:
HPA(min/max) | CronHPA | 工作负载副本 | 扩缩结果 | 兼容规则说明 |
---|---|---|---|---|
1/10 | 5 | 5 |
| 当 CronHPA 中的目标副本数和当前副本数一致时,HPA 中的最大和最小副本数,还有应用当前的副本数无需变更。 |
1/10 | 4 | 5 |
| 当 CronHPA 中的目标副本数低于当前副本数时,保留当前副本数。 |
1/10 | 6 | 5 |
| 当 CronHPA 中的目标副本数高于当前副本数时,保留 CronHPA 的目标副本数。CronHPA 目标副本数高于 HPA 副本数下限(minReplicas)时,修改 HPA 的副本数下限。 |
5/10 | 4 | 5 |
| 当 CronHPA 中的目标副本数低于当前副本数时,保留当前应用副本数。CronHPA 目标副本数低于 HPA 副本数下限(minReplicas)时,修改 HPA 的副本数下限。 |
5/10 | 11 | 5 |
| 当 CronHPA 中的目标副本数高于当前副本数时,保留 CronHPA 的目标副本数。CronHPA 目标副本数高于 HPA 副本数上限(maxReplicas)时,修改 HPA 的副本数上限。 |