作者:子白

AHPA 介绍

布景

Kubernetes 中运用实例数设置有固定实例数、HPA 和 CronHPA 三种战略。运用最多的是固定实例数,但是许多事务都存在波峰波谷,假如选用固定实例数的方法会形成较大的资源糟蹋。Kubernetes 中提供了 HPA 及 CronHPA 两种机制完成按需扩容实例数量,减少资源糟蹋。CronHPA 是用户设定守时规矩,在固守时刻进行实例数伸缩。但是设定守时规矩较为杂乱,假如守时刻隔设置较大就会形成资源糟蹋。HPA 能够依据运用实时负载设置实例数量,当运用负载高时扩容,当运用负载低时则缩容实例。HPA 是依据实时负载进行扩容,只有当负载现已比较高时才会触发扩容,但此刻事务现已处在高负载中因而事务部分流量呈现呼应慢或许超时的问题,即存在“弹性滞后”的问题。为此,咱们提出了一种智能化弹性伸缩计划 AHPA,能够依据前史时序数据进行自动猜测,提早扩容,避免弹性滞后。同时,会依据实时数据动态调整自动猜测结果,兼容周期变化等场景。

1.png

图 1 各种弹性伸缩战略比照图

AHPA 架构

2.png

图 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.png

图 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 所示。

4.png

表 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 容量足够。

5.png

  • Predict POD Oberserver:蓝色标明运用 HPA 实践的扩缩容 Pod 数,绿色标明 AHPA 猜测出来的扩缩容 Pod 数,绿色曲线小于蓝色,标明猜测的 Pod 数量更少。

6.png

AHPA Algorithm-RobustScaler 算法

时序猜测是 AHPA 算法的中心能力。现有的时刻序列猜测算法大致能够分为两大类:统计学算法如 ARIMA、 ETS、 GARCH 等;机器学习算法和深度学习算法如广义线性模型、XGBoost、LSTM、CNN、RNN 等。

Kubernetes 中 metrics 数据一般选用 Prometheus 存储,归纳功率成本等因素,一般事务数据存储周期为 7 天。7 天数据量作为练习集过小,练习出的机器/深度学习模型准确性较差。AHPA 用于实时弹性扩容,关于猜测时延要求较高,统计学算法装备参数少、核算杂乱度低、延时低。归纳考虑,咱们选用了统计学算法进行时序猜测。

Framework

7.png

图 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] 算法分解出趋势和残差项。

8.png

图 5 Forecasing 模块结构图

RobustPeriod 运用特殊的小波变换 MODWT 来隔绝多周期之间的相互搅扰,然后检测出时序数据中的多周期。RobustSTL 针对周期性数据,首先从时序数据平分解出趋势项,然后分解出周期项,最终依据残差项批改,以上进程多次迭代直至收敛。RobustTrend 算法针对非周期性数据,从时序数据平分解出趋势及残差。

  • Resource Model

ResourceModel 模块用于构建资源模型,该模型的输入为目标时序数据,输出为 Pod 数量。模型选用了统计学中的排队论 [5 ] 模型。详细的模型与输入的目标有关,单目标一般选用线性模型,多目标时往往选用非线性模型。

  • Proactive planning

Forecasting 模块运用 RobustSTL 算法将时序数据分解为趋势项,周期项Si,t及残差项Tt, 下一时刻的目标值核算方法如下。

9.png

自动猜测:将前史周期项直接向右平移作为未来周期项的猜测,将趋势项用指数滑润等经典的时序模型猜测得到未来趋势重量的猜测,残差部分运用分位数回归森林得到未来残差的上界猜测。

  • Reactive planning

Forecasting 模块运用 RobustTrend 算法将无周期数据分解为趋势项Tt,残差项rt。当前时刻的目标能够标明为yt=Tt+rt,下一时刻的目标值由最近h分钟目标核算得出,公式如下。

10.png

其中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 数量取自动及被迫猜测的最大值,核算公式如下。

11.png

算法效果评价

  • AHPA 算法能够协助客户辨认事务是否存在周期性

12.png

  • 当数据存在周期性时,AHPA 对数据缺失、毛刺以及事务改变引发的数据周期变化等有很强的鲁棒性

13.png

  • 当数据不存在周期性时,AHPA 因具有必定的猜测能力,能够提早感知数据趋势变化;对数据丢失、噪音等有很强的鲁棒性

14.png

结论

极致弹性是云中心优势之一,在云原生时代用户对弹性的诉求也越发激烈。许多用户装备了 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 弹性猜测》

https://help.aliyun.com/document_detail/416041.html