
# FederatedHPA工作原理
通过配置FederatedHPA策略，您可以基于工作负载的系统指标（CPU利用率、内存利用率）或自定义指标，对部署在多个集群中的无状态工作负载进行自动扩缩容。
您可以配合使用FederatedHPA策略与[调度策略](https://support.huaweicloud.com/usermanual-ucs/ucs_01_0265.html)来实现各种功能，例如在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扩缩数量]，并保持[负载伸缩的稳定性]。
图1FederatedHPA工作原理   
![](https://support.huaweicloud.com/usermanual-ucs/zh-cn_image_0000001770983106.png "点击放大")
 #### 如何计算指标数据？
指标数据分为系统指标与自定义指标，计算方法如下：
- 系统指标
  主要包括CPU利用率和内存利用率两个指标，系统指标的查询与监控依赖Metrics API。例如，您希望控制工作负载对CPU资源的利用率在合理水平，可基于CPU利用率指标为其创建FederatedHPA策略。
  ![](https://support.huaweicloud.com/usermanual-ucs/public_sys-resources/note_3.0-zh-cn.png)
  利用率 = 工作负载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秒时触发。
