更新时间:2024-02-01 GMT+08:00

FederatedHPA工作原理

通过配置FederatedHPA策略,您可以基于工作负载的系统指标(CPU利用率、内存利用率)或自定义指标,对部署在多个集群中的无状态工作负载进行自动扩缩容。

您可以配合使用FederatedHPA策略与调度策略来实现各种功能,例如在FederatedHPA策略扩展工作负载Pod数量后,配置调度策略将扩展出的Pod调度到具有更多资源的集群,以解决单个集群的资源限制,提高故障发生时的恢复能力。

FederatedHPA工作原理

FederatedHPA的工作原理如图1,实现流程如下:

  1. HPA Controller通过API定期查询工作负载的指标数据。
  2. karmada-apiserver收到查询请求,会路由到之前通过API服务注册的karmada-metrics-adapter。
  3. karmada-metrics-adapter收到查询请求,会查询并收集集群中工作负载的指标数据。
  4. karmada-metrics-adapter将计算的指标数据返回至HPA Controller。
  5. HPA Controller基于返回的指标数据计算所需的Pod扩缩数量,并保持负载伸缩的稳定性
图1 FederatedHPA工作原理

如何计算指标数据?

指标数据分为系统指标与自定义指标,计算方法如下:

  • 系统指标
    主要包括CPU利用率和内存利用率两个指标,系统指标的查询与监控依赖Metrics API。例如,您希望控制工作负载对CPU资源的利用率在合理水平,可基于CPU利用率指标为其创建FederatedHPA策略。

    利用率 = 工作负载Pod的实际资源使用量 / 资源申请量

  • 自定义指标

    主要提供Kubernetes Object相关的自定义监控指标,自定义指标的查询与监控依赖Custom Metrics API。例如,您可以基于每秒请求量、每秒写入次数等其他适合工作负载的自定义指标为其创建FederatedHPA策略。

若您在创建策略时设置了多个指标期望值,HPA Controller会比较每种指标变动计算出的Pod扩缩数量,选取Pod变动最大的计算结果进行扩缩。

如何计算Pod扩缩数量?

HPA Controller基于当前指标值和期望指标值来计算扩缩比例,再依据当前Pod数与扩缩比例计算出期望Pod数。当前Pod数与期望Pod数的计算方法如下:

  • 当前Pod数 = 所有集群中状态为Ready的Pod数量

在计算期望Pod数时,HPA Controller会选择最近5分钟内计算所得的Pod数的最大值,以避免之前的自动扩缩操作还未完成,就直接执行新的扩缩的情况。

  • 期望Pod数 = 当前Pod数 * ( 当前指标值 / 期望指标值 )

例如,当以CPU利用率为扩缩容参考指标时,若当前指标值为100%,期望指标值为50%,那么按照公式计算出的期望Pod数即为当前Pod数的两倍。

如何保证负载伸缩的稳定性?

为了保证负载伸缩的稳定性,HPA controller设置了以下功能:

  • 稳定窗口

    在监控到指标数据达到期待值(即满足伸缩标准)时,HPA controller会在所设定的稳定窗口期内持续检测,如果检测结果显示该时间段内的指标数据持续达到期待值,才会进行伸缩。默认扩容稳定窗口时长为0秒,缩容稳定窗口时长为300秒,支持修改。在实际配置过程中,为避免服务抖动,稳定窗口的配置的原则是快速扩容,低速缩容。

  • 容忍度

    容忍度 = abs ( 当前指标值 / 期望指标值 -1 )

    其中abs为绝对值。当指标值的变动在设定的容忍度范围之内时,不会触发工作负载的弹性伸缩。UCS负载伸缩策略默认伸缩容忍度为0.1,不支持修改。

例如,若您在创建策略时选择默认设置,则缩容会在指标数据达到期待值的1.1倍以上,且持续时间超过300秒时触发;扩容会在指标数据达到期待值的0.9倍以下,且持续时间超过0秒时触发。