You need to enable JavaScript to run this app.
导航
工作负载伸缩原理
最近更新时间:2024.06.12 19:56:38首次发布时间:2022.03.04 23:10:38

工作负载伸缩主要是指通过增加应用负载副本的方式,修改负载的调度容量。本文为您介绍常见的工作负载伸缩的工作原理。

指标伸缩

HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)在 Kubernetes 集群中用于 Pod 水平自动伸缩,它基于 CPU 和内存利用率、GPU/GPU 显存使用率、网络吞吐率等,对工作负载(例如 Deployment)和 Replicaset 控制器中的 Pod 数量进行自动扩缩容。

HPA 由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为,控制器会周期性的获取 CPU 和内存利用率、GPU/GPU 显存使用率、网络吞吐率等,并与目标值相比较后,用来调整 Replication Controller 或 Deployment 中的副本数量。
alt

HPA 由一个控制循环实现,循环周期由 Controller Manager 中的--horizontal-pod-autoscaler-sync-period标志指定。

在每个周期内的流程如下:

  • Controller Manager 会查询 HPA 中用户定义的资源 期望指标
  • 同时,Controller Manager 会基于 Resource Metric API( Metrics Server 实现),获取每个 Pod 的资源 当前指标
  • HPA 根据 当前指标期望指标 来计算扩缩比例。

    说明

    计算公式为:期望副本数 = ceil [ 当前副本数 × ( 当前指标 / 期望指标 ) ]。其中,ceil 表示向上取整。

    例如:
    • 如果 CPU 当前指标为200毫核,期望指标为100毫核,那么由于200.0/100.0 = 2.0, 副本数量将会翻倍。
    • 如果 CPU 当前指标为50毫核,期望指标为100毫核,那么由于50.0/100.0 = 0.5。副本数量将会减半。
    • 如果计算出的扩缩比例接近 1.0 ,根据 Kubernetes HPA 计算方法:|扩缩比例 - 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,定时弹性伸缩)是一种预设任务,可以在指定时间执行指定伸缩规则,实现自动扩容或者缩容计算资源,满足业务需求的同时又能控制成本。

定时弹性伸缩比较适合业务和时间有明确相关性的场景。例如,互联网电商的秒杀大促场景。由于互联网电商的秒杀大促的时间开始时间较为固定。此时,就可以使用定时弹性伸缩功能,在指定的时间段内对工作负载进行自动扩容,保证整个系统的工作正常。

HPA 和 CronHPA 兼容性说明

已知 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 的定义,可以发现:

  • CronHPA 可以知晓 HPA 中的minReplicasmaxReplicasdesiredReplicas的数值。
  • CronHPA 可以知晓 HPA 中scaleTargetRef所对应的当前Relicas值。
  • CronHPA 会优先通过调整 HPA 的方式调整工作负载副本数。
  • CronHPA 通过识别要达到的副本数与当前副本数两者间的较大值,判断是否需要扩缩容及修改 HPA 的上限
  • CronHPA 通过识别 CronHPA 要达到的副本数与 HPA 的配置间的较小值,判断是否需要修改 HPA 的下限。

因此,CronHPA 兼容 HPA 的规则如下所示:

HPA(min/max)CronHPA工作负载副本扩缩结果兼容规则说明

1/10

5

5

  • HPA(min/max):1/10
  • 工作负载副本:5

当CronHPA中的目标副本数和当前副本数一致时,HPA中的最大和最小副本数,还有应用当前的副本数无需变更。

1/10

4

5

  • HPA(min/max):1/10
  • 工作负载副本:5

当CronHPA中的目标副本数低于当前副本数时,保留当前副本数。

1/10

6

5

  • HPA(min/max):6/10
  • 工作负载副本:6

当CronHPA中的目标副本数高于当前副本数时,保留CronHPA的目标副本数。CronHPA目标副本数高于HPA副本数下限(minReplicas)时,修改HPA的副本数下限。

5/10

4

5

  • HPA(min/max):4/10
  • 工作负载副本:5

当CronHPA中的目标副本数低于当前副本数时,保留当前应用副本数。CronHPA目标副本数低于HPA副本数下限(minReplicas)时,修改HPA的副本数下限。

5/10

11

5

  • HPA(min/max):11/11
  • 工作负载副本:11

当CronHPA中的目标副本数高于当前副本数时,保留CronHPA的目标副本数。CronHPA目标副本数高于HPA副本数上限(maxReplicas)时,修改HPA的副本数上限。