甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩
作者:子白
AHPA 介绍
背景
Kubernetes 中应用实例数设置有固定实例数、HPA 和 CronHPA 三种策略。使用最多的是固定实例数,但是很多业务都存在波峰波谷,如果采用固定实例数的方式会造成较大的资源浪费。Kubernetes 中提供了 HPA 及 CronHPA 两种机制实现按需扩容实例数量,减少资源浪费。CronHPA 是用户设定定时规则,在固定时间进行实例数伸缩。但是设定定时规则较为复杂,如果定时间隔设置较大就会造成资源浪费。HPA 可以根据应用实时负载设置实例数量,当应用负载高时扩容,当应用负载低时则缩容实例。HPA 是基于实时负载进行扩容,只有当负载已经比较高时才会触发扩容,但此时业务已经处在高负载中因此业务部分流量出现响应慢或者超时的问题,即存在“弹性滞后”的问题。为此,我们提出了一种智能化弹性伸缩方案 AHPA,可以根据历史时序数据进行主动预测,提前扩容,避免弹性滞后。同时,会根据实时数据动态调整主动预测结果,兼容周期变动等场景。
图 1 各种弹性伸缩策略对比图
AHPA 架构
图 2 AHPA 框架图
AHPA 整体架构如图 2 所示,分为数据采集、预测及弹性伸缩三大部分。
- Data Collection
Data Collection 模块负责从数据源收集数据并将数据转为统一的格式传入给 Prediction 模块。数据源支持如 Prometheus、Metrics Serve、Log Service 以及其他自定义的监控平台。
指标包含 CPU、Memory、GPU 等资源指标,也包括 QPS、RT 等业务指标,同时也支持其他用户自定义指标。Adapter 模块负责将从多个数据源收集的各类指标转为统一的格式输入给 Prediction 模块。
- Prediction
Prediction 模块负责根据输入指标预测所需的 Pod 数量。Preprocessing 负责数据预处理,如过滤非 Running 状态的 Pod 利用率、处理缺失数据等。完成预处理后将时序数据传递给 RobustScaler [ 1] 算法模块。该模块将在第二部分详细介绍。
Revise 模块负责对 RobustScaler 模块给出的预测 Pod 数量进行修正。RobustScaler 分为 Proactive 和 Reactive 两种模式,用户也会为应用 Pod 数量设置上下限。为保证应用平稳运行,我们采取尽快扩,缓慢缩的策略,因此 Revise 模块会取 Proactive、Reactive 及用户设置的上下限中最大值作为预测的 Pod 数量。
- Scaling
Scaling 模块负责执行 Pod 扩缩容。弹性伸缩策略分为两类:auto 及 observer 模式。
-
- auto:根据 Prediction 给出的 Pod 数量自动调整
- observer:dryrun 模式,不调整 Pod 数量。用户可以通过这种方式观察 AHPA 工作是否符合预期。
AHPA 部署方式
图 3 AHPA 部署图
AHPA 在 Kubernetes 中部署图如上所示,分为 AHPA Algorithm 及 AHPA Controller 两部分。AHPA Algorithm Deployment 是负责 AHPA 中算法相关的部分,对应架构图中的 Prediction 模块。AHPA Controller 负责数据收集及弹性扩缩容的执行,对应架构图中的 Data Collection 及 Scaling 模块。
AHPA 引入 CRD(CustomResourceDefinition)资源以配置弹性伸缩策略,每个应用(Deployment)对应一个 CRD 资源。使用 CRD 的优势在于可以透出多种算法配置,具有较强的灵活性。CRD 的配置示例如下:
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: AdvancedHorizontalPodAutoscaler
metadata:
name: ahpa-demo
spec:
scaleStrategy: observer
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 40
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
maxReplicas: 100
minReplicas: 2
prediction:
quantile: 95
scaleUpForward: 180
instanceBounds:
- startTime: "2021-12-16 00:00:00"
endTime: "2022-12-16 24:00:00"
bounds:
- cron: "* 0-8 ? * MON-FRI"
maxReplicas: 15
minReplicas: 4
- cron: "* 9-15 ? * MON-FRI"
maxReplicas: 15
minReplicas: 10
- cron: "* 16-23 ? * MON-FRI"
maxReplicas: 20
minReplicas: 15
spec.scaleTargetRef 用于指定这个 CRD 资源关联的应用,spec.metrics 用于指定采集的时序指标,spec.scaleStrategy 用于设置弹性策略,包括 auto、observer 模式。spec.prediction字段用于设置算法相关指标。spec.maxReplicas 及 spec.minReplicas 设定了应用的Pod数量的上下界。有些应用存在明显的波峰浪谷,因此需要针对不同时段设置不同的上下界。因此,我们提供了 spec.instanceBounds 可以设置不同时段边界保护,也可以起到定时弹性的作用。具体参数及说明如表 1 所示。
表 1 AHPA CRD 核心参数列表及说明
- 高可用性
异常在复杂系统中不可避免,因此我们在部署时采用了高可用性架构。Algorithm 与 Controller 组件都采用 Deployment 方式部署,当 Pod 发生异常时会自动杀死异常 Pod 并创建新的 Pod,保证业务平稳运行。当接入的业务应用较多时,Algorithm 及 Controller 均可水平扩展以满足高并发需求。
为了保证 AHPA 组件升级过程中业务无感知,Algorithm 和 Controller 组件基于 Service 进行通信,Algorithm 及 Controller 可以独立升级。升级时采用滚动升级方式,即先创建新的 Pod,等待新的 Pod 可以对外提供服务后再杀死旧 Pod。
- 可观测性
我们提供了 Kubernetes Event、Prothemetheus、Dashboard 等多种方式透出 AHPA 组件运行状态,方便客户监控 AHPA 运行状态及定位问题。
如设置 observer 模式后,用户可以通过查看 Dashboard 预估 AHPA 生效结果。
- Predict CPU Oberserver:蓝色表示 HPA 实际的 CPU 使用量,绿色表示 AHPA 预测出来的 CPU 使用量。绿色曲线大于蓝色,表明预测的 CPU 容量充足。
- Predict POD Oberserver:蓝色表示使用 HPA 实际的扩缩容 Pod 数,绿色表示 AHPA 预测出来的扩缩容 Pod 数,绿色曲线小于蓝色,表明预测的 Pod 数量更少。
AHPA Algorithm-RobustScaler 算法
时序预测是 AHPA 算法的核心能力。现有的时间序列预测算法大致可以分为两大类:统计学算法如 ARIMA、 ETS、 GARCH 等;机器学习算法和深度学习算法如广义线性模型、XGBoost、LSTM、CNN、RNN 等。
Kubernetes 中 metrics 数据一般采用 Prometheus 存储,综合效率成本等因素,一般业务数据存储周期为 7 天。7 天数据量作为训练集过小,训练出的机器/深度学习模型准确性较差。AHPA 用于实时弹性扩容,对于预测时延要求较高,统计学算法配置参数少、计算复杂度低、延时低。综合考虑,我们采用了统计学算法进行时序预测。
Framework
图 4 RobustScaler Framework
RobustScaler算法框架如图 4 所示。实时指标数据(Real-time metric data)为过去Tmin分钟内的数据,用于被动预测(Proactive Planning);历史指标数据(Historical metric data)为过去Tday天数据,用于主动预测(Reactive Planning)。
- Forecasting
首先利用 RobustPeriod [2 ] 算法检测数据是否有周期,有几重周期以及每个周期分量的长度。如果数据存在周期性,则调用 RobustSTL [3 ] 算法分解出数据的趋势、周期及残差项;如果数据没有周期性,则调用 RobustTrend [4] 算法分解出趋势和残差项。
图 5 Forecasing 模块框架图
RobustPeriod 利用特殊的小波变换 MODWT 来隔绝多周期之间的相互干扰,从而检测出时序数据中的多周期。RobustSTL 针对周期性数据,首先从时序数据中分解出趋势项,然后分解出周期项,最后根据残差项修正,以上过程多次迭代直至收敛。RobustTrend 算法针对非周期性数据,从时序数据中分解出趋势及残差。
- Resource Model
ResourceModel 模块用于构建资源模型,该模型的输入为指标时序数据,输出为 Pod 数量。模型选用了统计学中的排队论 [5 ] 模型。具体的模型与输入的指标有关,单指标一般采用线性模型,多指标时往往采用非线性模型。
- Proactive planning
Forecasting 模块使用 RobustSTL 算法将时序数据分解为趋势项,周期项Si,t及残差项Tt, 下一时刻的指标值计算方式如下。
主动预测:将历史周期项直接向右平移作为未来周期项的预测,将趋势项用指数平滑等经典的时序模型预测得到未来趋势分量的预测,残差部分利用分位数回归森林得到未来残差的上界预测。
- Reactive planning
Forecasting 模块使用 RobustTrend 算法将无周期数据分解为趋势项Tt,残差项rt。当前时刻的指标可以表示为yt=Tt+rt,下一时刻的指标值由最近h分钟指标计算得出,公式如下。
其中wi表示i时刻的指标权重,该值由i时刻的指标值及与时刻与i当前时刻差共同决定。
模型训练及预测
算法使用过程如下。
- 主动预测
1. 获取最近Tday天数据2. 对数据进行分析,基于 Forecasting 模块分解出数据周期、趋势及残差。Proactive Planning 模块根据 Forecasting 模块分解出的信息进行预测。预测结果为接下来Thour小时的指标值。3. 根据最近Tday数据构建 Resource Estimation 模型。该模型的输入为第二步预测出的指标值,输出为预期 Pod 数量。 |
---|
- 被动预测
1. 获取最近Tmin分钟数据2. 对数据进行分析,基于 Forecasting 模块分解出数据趋势及残差。Reactive Planning 模块根据 Forecasting 模块分解出的趋势及残差信息预测下一时刻的指标值。3. 将第二步预测出的指标值输入主动预测构建出的 Resource Estimation 模型中,计算下一时刻 Pod 数量。 |
---|
- 应用扩缩容
最终 pod 数量取主动及被动预测的最大值,计算公式如下。
算法效果评估
- AHPA 算法可以帮助客户识别业务是否存在周期性
- 当数据存在周期性时,AHPA 对数据缺失、毛刺以及业务变更引发的数据周期变化等有很强的鲁棒性
- 当数据不存在周期性时,AHPA 因具备一定的预测能力,可以提前感知数据趋势变化;对数据丢失、噪音等有很强的鲁棒性
结论
极致弹性是云核心优势之一,在云原生时代用户对弹性的诉求也越发强烈。很多用户配置了 HPA 和 CronHPA 策略。HPA 可以根据应用负载更改实例数量,当应用负载较高时扩容更多的实例。CronHPA 是定时 HPA,在固定时间进行实例数伸缩。CronHPA 配置规则复杂,且存在资源浪费,HPA 存在弹性触发滞后的问题,会导致业务稳定性下降。
为此,我们提出了一种智能化弹性伸缩组件 AHPA,核心算法使用达摩院决策智能时序团队提供的 RobustScaler,该算法已被数据库顶会 ICDE 2022 录用。RobustScaler 可以自动识别指标数据是否具有周期性,并且在周期变更、毛刺、数据缺失等场景下都具有很强的鲁棒性。AHPA 组件可以在容器服务 ACK 的组件中心里一键安装,安装成功后即可通过 CRD 资源为应用配置弹性伸缩策略,具体请参考官方帮助文档《AHPA 弹性预测》 [ 6] 。
Reference
[1] Qian, H. , Wen, Q. , Sun, L. , Gu, J. , Niu, Q. , & Tang, Z. . (2022). Robustscaler: qos-aware autoscaling for complex workloads. The 38th IEEE International Conference on Data Engineering (ICDE 2022)
[2] Qingsong Wen, Kai He, Liang Sun, Yingying Zhang, Min Ke, and Huan Xu. 2021. RobustPeriod: Robust Time-Frequency Mining for Multiple Periodicity Detection. In Proceedings of the 2021 International Conference on Management of Data (SIGMOD '21).
[3] Qingsong Wen, Jingkun Gao, Xiaomin Song, Liang Sun, Huan Xu, Shenghuo Zhu. (2019). RobustSTL: A Robust Seasonal-Trend Decomposition Algorithm for Long Time Series. Proceedings of the AAAI Conference on Artificial Intelligence, 33(01), 5409-5416.
[4] Qingsong Wen, Jingkun Gao, Xiaomin Song, Liang Sun, Jian Tan. RobustTrend: A Huber Loss with a Combined First and Second Order Difference Regularization for Time Series Trend Filtering. IJCAI 2019
[5] 《运筹学》教材编写组. 运筹学(第三版)[M]. 清华大学出版社, 2005.
[6]《AHPA 弹性预测》