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

本文涉及的产品
应用实时监控服务-应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
函数计算FC,每月15万CU 3个月
简介: 我们提出了一种智能化弹性伸缩方案 AHPA,可以根据历史时序数据进行主动预测,提前扩容,避免弹性滞后。同时,会根据实时数据动态调整主动预测结果,兼容周期变动等场景。

作者:子白


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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
弹性计算 人工智能 Serverless
阿里云ACK One:注册集群云上节点池(CPU/GPU)自动弹性伸缩,助力企业业务高效扩展
在当今数字化时代,企业业务的快速增长对IT基础设施提出了更高要求。然而,传统IDC数据中心却在业务存在扩容慢、缩容难等问题。为此,阿里云推出ACK One注册集群架构,通过云上节点池(CPU/GPU)自动弹性伸缩等特性,为企业带来全新突破。
|
Kubernetes Linux Docker
百度搜索:蓝易云【CentOS7系统规划搭建 kubernetes 集群详细教程。】
现在,你已经成功规划和搭建了一个基于CentOS 7的Kubernetes集群。你可以使用kubectl命令管理和部署应用程序到集群中。根据需求,你还可以配置和调优集群的各项参数和插件,以满足特定的应用需求。
198 0
|
存储 Kubernetes 监控
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
|
4月前
|
弹性计算 Kubernetes 算法
AHPA:Kubernetes弹性伸缩的预言家,揭秘未来资源使用的神秘面纱!
【8月更文挑战第8天】在云原生应用中,Kubernetes已成为部署标准。面对不断扩大的集群与应用规模,有效资源管理和弹性伸缩成为关键。AHPA(自适应历史感知预测算法)作为先进的预测技术,通过分析历史数据预测资源需求并自动调整Kubernetes资源分配。以一个在线零售平台为例,通过AHPA识别流量周期性变化,在节假日高峰期前自动增加Pod数量,保证服务稳定;而在平峰期减少Pod数量,节省资源。AHPA为Kubernetes提供了智能化的弹性伸缩方案,提高了应用稳定性和资源利用率。
85 7
|
7月前
|
Kubernetes Linux Docker
Kubernetes学习笔记-Part.04 资源规划
Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退
134 1
|
机器学习/深度学习 Kubernetes API
「容器架构」 K8s 集群如何规划工作节点的大小?
「容器架构」 K8s 集群如何规划工作节点的大小?
|
机器学习/深度学习 数据采集 弹性计算
甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩
我们提出了一种智能化弹性伸缩方案 AHPA,可以根据历史时序数据进行主动预测,提前扩容,避免弹性滞后。同时,会根据实时数据动态调整主动预测结果,兼容周期变动等场景。
302 4
甩掉容量规划炸弹:用 AHPA 实现 Kubernetes 智能弹性伸缩
|
弹性计算 Kubernetes 安全
基于 Armory 进行 Kubernetes 集群的弹性伸缩
想象一下,假设亚马逊每年只有一天不可用。按照这个数值估算,他们的业务将会约有 99.7% 的可用性,从表面上看这是相当合理的。然而,在过去的 2020 年,亚马逊的收入接近 4000 亿美元。基于 99.7% 而不是 100% 的可用性将花费亚马逊超过 10 亿美元。哪怕停机时间只是那么一点点,也会让公司的业务损失惨重。
131 0
|
弹性计算 Kubernetes Cloud Native
云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩
云原生之容器编排实践-SpringBoot应用以Deployment方式部署到minikube以及弹性伸缩
248 0
|
存储 运维 Kubernetes
不懂 Kubernetes 实现云原生是什么体验?
要明白什么是云原生,就要先弄明白云计算是什么有什么问题,云计算将计算资源、网络、存储等基础设施统一管理,通过资源规模化和自动化管理,实现降低资源的成本和提高资源的管理效率,云计算本质上解决的是资源的自动化管理问题,但数字化和信息化的关键在应用,云计算没有解决应用的管理问题,应用的管理和运维是难题,对人依赖度很高。

相关产品

  • 容器服务Kubernetes版