首页 > 其他分享 >甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩

甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩

时间:2022-11-14 18:00:13浏览次数:76  
标签:AHPA Kubernetes 甩掉 算法 模块 Pod 数据 预测

作者:子白


AHPA 介绍


背景


Kubernetes 中应用实例数设置有固定实例数、HPA 和 CronHPA 三种策略。使用最多的是固定实例数,但是很多业务都存在波峰波谷,如果采用固定实例数的方式会造成较大的资源浪费。Kubernetes 中提供了 HPA 及 CronHPA 两种机制实现按需扩容实例数量,减少资源浪费。CronHPA 是用户设定定时规则,在固定时间进行实例数伸缩。但是设定定时规则较为复杂,如果定时间隔设置较大就会造成资源浪费。HPA 可以根据应用实时负载设置实例数量,当应用负载高时扩容,当应用负载低时则缩容实例。HPA 是基于实时负载进行扩容,只有当负载已经比较高时才会触发扩容,但此时业务已经处在高负载中因此业务部分流量出现响应慢或者超时的问题,即存在“弹性滞后”的问题。为此,我们提出了一种智能化弹性伸缩方案 AHPA,可以根据历史时序数据进行主动预测,提前扩容,避免弹性滞后。同时,会根据实时数据动态调整主动预测结果,兼容周期变动等场景。

甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_Kubernetes


图 1 各种弹性伸缩策略对比图


AHPA 架构


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据_02

图 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 部署方式


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_模块分解_03

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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据_04

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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据_05


  • Predict POD Oberserver:蓝色表示使用 HPA 实际的扩缩容 Pod 数,绿色表示 AHPA 预测出来的扩缩容 Pod 数,绿色曲线小于蓝色,表明预测的 Pod 数量更少。


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据源_06


AHPA Algorithm-RobustScaler 算法


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


Kubernetes 中 metrics 数据一般采用 Prometheus 存储,综合效率成本等因素,一般业务数据存储周期为 7 天。7 天数据量作为训练集过小,训练出的机器/深度学习模型准确性较差。AHPA 用于实时弹性扩容,对于预测时延要求较高,统计学算法配置参数少、计算复杂度低、延时低。综合考虑,我们采用了统计学算法进行时序预测。


Framework

甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据源_07

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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_模块分解_08

图 5 Forecasing 模块框架图


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


  • Resource Model

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


  • Proactive planning

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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_模块分解_09


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


  • Reactive planning

Forecasting 模块使用 RobustTrend 算法将无周期数据分解为趋势项Tt,残差项rt。当前时刻的指标可以表示为yt=Tt+rt,下一时刻的指标值由最近h分钟指标计算得出,公式如下。


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据_10


其中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 实现 Kubernetes 智能弹性伸缩_Kubernetes_11


算法效果评估


  • AHPA 算法可以帮助客户识别业务是否存在周期性


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_数据_12


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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_模块分解_13


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


甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩_模块分解_14


结论


极致弹性是云核心优势之一,在云原生时代用户对弹性的诉求也越发强烈。很多用户配置了 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

标签:AHPA,Kubernetes,甩掉,算法,模块,Pod,数据,预测
From: https://blog.51cto.com/u_13778063/5849745

相关文章

  • 甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩
    作者:子白AHPA介绍背景Kubernetes中应用实例数设置有固定实例数、HPA和CronHPA三种策略。使用最多的是固定实例数,但是很多业务都存在波峰波谷,如果采用固定实例数的......
  • k8s工作原理(chrono《kubernetes入门实战课》笔记整理)
     【架构理解】k8s可以编排容器,也可以对服务器进行监管。在k8s,不会区分dev(开发人员)和ops(运维人员),而是devops(提倡开发时就要考虑运维,运维也要尽早开始考虑如何对应用进行运......
  • kubernetes-002
    6、添加NFS存储卷[root@k8s-master01~]#vimmydb-nfs.yamlapiVersion:v1kind:Podmetadata:labels:app:mydbname:mydbspec:containers:-image:mysql:8.0......
  • 部署Kubernetes 1.25.4初始ipvs模式
    1、环境准备主机名IP地址系统版本k8s-master01k8s-master01.wang.org​kubeapi.wang.orgkubeapi192.168.100.201Ubuntu2004k8s-master02k8s-master02.wang.org192.168.1......
  • 云原生之旅 - 11)基于 Kubernetes 动态伸缩 Jenkins Build Agents
    前言上一篇文章 云原生之旅-10)手把手教你安装JenkinsonKubernetes 我们介绍了在Kubernetes上安装Jenkins,本文介绍下如何设置k8spod作为Jenkins构建job的agen......
  • kubernetes-001
    1、介绍kubernetes(简称K8S)是一个以“应用”为中心,管理容器生命周期,容器之间关系,集群资源调度的容器编排工具,是一个面向平台的平台。为什么要简称K8S呢? 1、字母k和字母s中间......
  • Kubernetes-1.25 Container Image Download
    一、Kubernetes-1.25ContainerImageDownload1kube-apiserver#sourceregistry.k8s.io/kube-apiserver:v1.25.2#tagdockerpullswr.cn-north-1.myhuaweicloud.co......
  • 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
    前言谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在Kubernetes上安装Jenkins,后续文章会带你深入了解如何使用k8spod作为Jenkins的buildagents。 ......
  • 198 - Docker+Kubernetes(k8s)微服务容器化实践
                生成md5代码  生成token代码 ......
  • Kubernetes应用1
    1、传递环境变量创建mysql[root@master-101~]#kubectlcreateserviceclusteripmydb--tcp=3306:3306--dry-run=client-oyamlapiVersion:v1kind:Servicemetadata:......