甩掉容量規(guī)劃炸彈:用 AHPA 實(shí)現(xiàn) Kubernetes 智能彈性伸縮
一、AHPA 介紹
1.背景
Kubernetes 中應(yīng)用實(shí)例數(shù)設(shè)置有固定實(shí)例數(shù)、HPA 和 CronHPA 三種策略。使用最多的是固定實(shí)例數(shù),但是很多業(yè)務(wù)都存在波峰浪谷,如果采用固定實(shí)例數(shù)的方式會(huì)造成較大的資源浪費(fèi)。Kubernetes 中提供了 HPA 及 CronHPA 兩種機(jī)制實(shí)現(xiàn)按需擴(kuò)容實(shí)例數(shù)量,減少資源浪費(fèi)。CronHPA 是用戶設(shè)定定時(shí)規(guī)則,在固定時(shí)間進(jìn)行實(shí)例數(shù)伸縮。但是設(shè)定定時(shí)規(guī)則較為復(fù)雜,如果定時(shí)間隔設(shè)置較大就會(huì)造成資源浪費(fèi)。HPA 可以根據(jù)應(yīng)用實(shí)時(shí)負(fù)載設(shè)置實(shí)例數(shù)量,當(dāng)應(yīng)用負(fù)載高時(shí)擴(kuò)容,當(dāng)應(yīng)用負(fù)載低時(shí)則縮容實(shí)例。HPA 是基于實(shí)時(shí)負(fù)載進(jìn)行擴(kuò)容,只有當(dāng)負(fù)載已經(jīng)比較高時(shí)才會(huì)觸發(fā)擴(kuò)容,但此時(shí)業(yè)務(wù)已經(jīng)處在高負(fù)載中因此業(yè)務(wù)部分流量出現(xiàn)響應(yīng)慢或者超時(shí)的問(wèn)題,即存在“彈性滯后”的問(wèn)題。為此,我們提出了一種智能化彈性伸縮方案 AHPA,可以根據(jù)歷史時(shí)序數(shù)據(jù)進(jìn)行主動(dòng)預(yù)測(cè),提前擴(kuò)容,避免彈性滯后。同時(shí),會(huì)根據(jù)實(shí)時(shí)數(shù)據(jù)動(dòng)態(tài)調(diào)整主動(dòng)預(yù)測(cè)結(jié)果,兼容周期變動(dòng)等場(chǎng)景。

圖 1 各種彈性伸縮策略對(duì)比圖
2.AHPA 架構(gòu)

圖 2 AHPA 框架圖
AHPA 整體架構(gòu)如圖 2 所示,分為數(shù)據(jù)采集、預(yù)測(cè)及彈性伸縮三大部分。
- Data Collection
Data Collection 模塊負(fù)責(zé)從數(shù)據(jù)源收集數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)為統(tǒng)一的格式傳入給 Prediction 模塊。數(shù)據(jù)源支持如 Prometheus、Metrics Serve、Log Service 以及其他自定義的監(jiān)控平臺(tái)。
指標(biāo)包含 CPU、Memory、GPU 等資源指標(biāo),也包括 QPS、RT 等業(yè)務(wù)指標(biāo),同時(shí)也支持其他用戶自定義指標(biāo)。Adapter 模塊負(fù)責(zé)將從多個(gè)數(shù)據(jù)源收集的各類指標(biāo)轉(zhuǎn)為統(tǒng)一的格式輸入給 Prediction 模塊。
- Prediction
Prediction 模塊負(fù)責(zé)根據(jù)輸入指標(biāo)預(yù)測(cè)所需的 Pod 數(shù)量。Preprocessing 負(fù)責(zé)數(shù)據(jù)預(yù)處理,如過(guò)濾非 Running 狀態(tài)的 Pod 利用率、處理缺失數(shù)據(jù)等。完成預(yù)處理后將時(shí)序數(shù)據(jù)傳遞給 RobustScaler[1]算法模塊。該模塊將在第二部分詳細(xì)介紹。
Revise 模塊負(fù)責(zé)對(duì) RobustScaler 模塊給出的預(yù)測(cè) Pod 數(shù)量進(jìn)行修正。RobustScaler 分為 Proactive 和 Reactive 兩種模式,用戶也會(huì)為應(yīng)用 Pod 數(shù)量設(shè)置上下限。為保證應(yīng)用平穩(wěn)運(yùn)行,我們采取盡快擴(kuò),緩慢縮的策略,因此 Revise 模塊會(huì)取 Proactive、Reactive 及用戶設(shè)置的上下限中最大值作為預(yù)測(cè)的 Pod 數(shù)量。
- Scaling
Scaling 模塊負(fù)責(zé)執(zhí)行 Pod 擴(kuò)縮容。彈性伸縮策略分為兩類:auto 及 observer 模式。
- auto:根據(jù) Prediction 給出的 Pod 數(shù)量自動(dòng)調(diào)整
- observer:dryrun 模式,不調(diào)整 Pod 數(shù)量。用戶可以通過(guò)這種方式觀察 AHPA 工作是否符合預(yù)期。
3.AHPA 部署方式

圖 3 AHPA 部署圖
AHPA 在 Kubernetes 中部署圖如上所示,分為 AHPA Algorithm 及 AHPA Controller 兩部分。AHPA Algorithm Deployment 是負(fù)責(zé) AHPA 中算法相關(guān)的部分,對(duì)應(yīng)架構(gòu)圖中的 Prediction 模塊。AHPA Controller 負(fù)責(zé)數(shù)據(jù)收集及彈性擴(kuò)縮容的執(zhí)行,對(duì)應(yīng)架構(gòu)圖中的 Data Collection 及 Scaling 模塊。
AHPA 引入 CRD(CustomResourceDefinition)資源以配置彈性伸縮策略,每個(gè)應(yīng)用(Deployment)對(duì)應(yīng)一個(gè) CRD 資源。使用 CRD 的優(yōu)勢(shì)在于可以透出多種算法配置,具有較強(qiáng)的靈活性。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 用于指定這個(gè) CRD 資源關(guān)聯(lián)的應(yīng)用,spec.metrics 用于指定采集的時(shí)序指標(biāo),spec.scaleStrategy 用于設(shè)置彈性策略,包括 auto、observer 模式。spec.prediction字段用于設(shè)置算法相關(guān)指標(biāo)。spec.maxReplicas 及 spec.minReplicas 設(shè)定了應(yīng)用的Pod數(shù)量的上下界。有些應(yīng)用存在明顯的波峰浪谷,因此需要針對(duì)不同時(shí)段設(shè)置不同的上下界。因此,我們提供了 spec.instanceBounds 可以設(shè)置不同時(shí)段邊界保護(hù),也可以起到定時(shí)彈性的作用。具體參數(shù)及說(shuō)明如表 1 所示。

表 1 AHPA CRD 核心參數(shù)列表及說(shuō)明
- 高可用性
異常在復(fù)雜系統(tǒng)中不可避免,因此我們?cè)诓渴饡r(shí)采用了高可用性架構(gòu)。Algorithm 與 Controller 組件都采用 Deployment 方式部署,當(dāng) Pod 發(fā)生異常時(shí)會(huì)自動(dòng)殺死異常 Pod 并創(chuàng)建新的 Pod,保證業(yè)務(wù)平穩(wěn)運(yùn)行。當(dāng)接入的業(yè)務(wù)應(yīng)用較多時(shí),Algorithm 及 Controller 均可水平擴(kuò)展以滿足高并發(fā)需求。
為了保證 AHPA 組件升級(jí)過(guò)中業(yè)務(wù)無(wú)感知,Algorithm 和 Controller 組件基于 Service 進(jìn)行通信,Algorithm 及 Controller 可以獨(dú)立升級(jí)。升級(jí)時(shí)采用滾動(dòng)升級(jí)方式,即先創(chuàng)建新的 Pod,等待新的 Pod 可以對(duì)外提供服務(wù)后再殺死舊 Pod。
- 可觀測(cè)性
我們提供了 Kubernetes Event、Prothemetheus、Dashboard 等多種方式透出 AHPA 組件運(yùn)行狀態(tài),方便客戶監(jiān)控 AHPA 運(yùn)行狀態(tài)及定位問(wèn)題。
如設(shè)置 observer 模式后,用戶可以通過(guò)查看 Dashboard 預(yù)估 AHPA 生效結(jié)果。
Predict CPU Oberserver:藍(lán)色表示 HPA 實(shí)際的 CPU 使用量,綠色表示 AHPA 預(yù)測(cè)出來(lái)的 CPU 使用量。綠色曲線大于藍(lán)色,表明預(yù)測(cè)的 CPU 容量充足。

Predict POD Oberserver:藍(lán)色表示使用 HPA 實(shí)際的擴(kuò)縮容 Pod 數(shù),綠色表示 AHPA 預(yù)測(cè)出來(lái)的擴(kuò)縮容 Pod 數(shù),綠色曲線小于藍(lán)色,表明預(yù)測(cè)的 Pod 數(shù)量更少。

二、AHPA Algorithm-RobustScaler 算法
時(shí)序預(yù)測(cè)是 AHPA 算法的核心能力?,F(xiàn)有的時(shí)間序列預(yù)測(cè)算法大致可以分為兩大類:統(tǒng)計(jì)學(xué)算法如 ARIMA、 ETS、 GARCH 等;機(jī)器學(xué)習(xí)算法和深度學(xué)習(xí)算法如廣義線性模型、XGBoost、LSTM、CNN、RNN 等。
Kubernetes 中 metrics 數(shù)據(jù)一般采用 Prometheus 存儲(chǔ),綜合效率成本等因素,一般業(yè)務(wù)數(shù)據(jù)存儲(chǔ)周期為 7 天。7 天數(shù)據(jù)量作為訓(xùn)練集過(guò)小,訓(xùn)練出的機(jī)器/深度學(xué)習(xí)模型準(zhǔn)確性較差。AHPA 用于實(shí)時(shí)彈性擴(kuò)容,對(duì)于預(yù)測(cè)時(shí)延要求較高,統(tǒng)計(jì)學(xué)算法配置參數(shù)少、計(jì)算復(fù)雜度低、延時(shí)低。綜合考慮,我們采用了統(tǒng)計(jì)學(xué)算法進(jìn)行時(shí)序預(yù)測(cè)。
1.Framework

圖 4 RobustScaler Framework
RobustScaler算法框架如圖 4 所示。實(shí)時(shí)指標(biāo)數(shù)據(jù)(Real-time metric data)為過(guò)去
分鐘內(nèi)的數(shù)據(jù),用于被動(dòng)預(yù)測(cè)(Proactive Planning);歷史指標(biāo)數(shù)據(jù)(Historical metric data)為過(guò)去
天數(shù)據(jù),用于主動(dòng)預(yù)測(cè)(Reactive Planning)。
- Forecasting
首先利用 RobustPeriod[2]算法檢測(cè)數(shù)據(jù)是否有周期,有幾重周期以及每個(gè)周期分量的長(zhǎng)度。如果數(shù)據(jù)存在周期性,則調(diào)用 RobustSTL[3]算法分解出數(shù)據(jù)的趨勢(shì)、周期及殘差項(xiàng);如果數(shù)據(jù)沒(méi)有周期性,則調(diào)用 RobustTrend[4]算法分解出趨勢(shì)和殘差項(xiàng)。

圖 5 Forecasing 模塊框架圖
RobustPeriod 利用特殊的小波變換 MODWT 來(lái)隔絕多周期之間的相互干擾,從而檢測(cè)出時(shí)序數(shù)據(jù)中的多周期。RobustSTL 針對(duì)周期性數(shù)據(jù),首先從時(shí)序數(shù)據(jù)中分解出趨勢(shì)項(xiàng),然后分解出周期項(xiàng),最后根據(jù)殘差項(xiàng)修正,以上過(guò)程多次迭代直至收斂。RobustTrend 算法針對(duì)非周期性數(shù)據(jù),從時(shí)序數(shù)據(jù)中分解出趨勢(shì)及殘差。
- Resource Model
ResourceModel 模塊用于構(gòu)建資源模型,該模型的輸入為指標(biāo)時(shí)序數(shù)據(jù),輸出為 Pod 數(shù)量。模型選用了統(tǒng)計(jì)學(xué)中的排隊(duì)論[5]模型。具體的模型與輸入的指標(biāo)有關(guān),單指標(biāo)一般采用線性模型,多指標(biāo)時(shí)往往采用非線性模型。
- Proactive planning
Forecasting 模塊使用 RobustSTL 算法將時(shí)序數(shù)據(jù)分解為趨勢(shì)項(xiàng)
,周期項(xiàng)
及殘差項(xiàng)
, 下一時(shí)刻的指標(biāo)值計(jì)算方式如下。

主動(dòng)預(yù)測(cè):將歷史周期項(xiàng)直接向右平移作為未來(lái)周期項(xiàng)的預(yù)測(cè),將趨勢(shì)項(xiàng)用指數(shù)平滑等經(jīng)典的時(shí)序模型預(yù)測(cè)得到未來(lái)趨勢(shì)分量的預(yù)測(cè),殘差部分利用分位數(shù)回歸森林得到未來(lái)殘差的上界預(yù)測(cè)。
- Reactive planning
Forecasting 模塊使用 RobustTrend 算法將無(wú)周期數(shù)據(jù)分解為趨勢(shì)項(xiàng)
,殘差項(xiàng)
。當(dāng)前時(shí)刻的指標(biāo)可以表示為
,下一時(shí)刻的指標(biāo)值由最近
分鐘指標(biāo)計(jì)算得出,公式如下。

其中
表示
時(shí)刻的指標(biāo)權(quán)重,該值由
時(shí)刻的指標(biāo)值及與
時(shí)刻與當(dāng)前時(shí)刻差共同決定。
2.模型訓(xùn)練及預(yù)測(cè)
算法使用過(guò)程如下。
- 主動(dòng)預(yù)測(cè)
獲取最近
天數(shù)據(jù)
對(duì)數(shù)據(jù)進(jìn)行分析,基于 Forecasting 模塊分解出數(shù)據(jù)周期、趨勢(shì)及殘差。Proactive Planning 模塊根據(jù) Forecasting 模塊分解出的信息進(jìn)行預(yù)測(cè)。預(yù)測(cè)結(jié)果為接下來(lái)
小時(shí)的指標(biāo)值。
根據(jù)最近
數(shù)據(jù)構(gòu)建 Resource Estimation 模型。該模型的輸入為第二步預(yù)測(cè)出的指標(biāo)值,輸出為預(yù)期 Pod 數(shù)量。
- 被動(dòng)預(yù)測(cè)
獲取最近
分鐘數(shù)據(jù)
對(duì)數(shù)據(jù)進(jìn)行分析,基于 Forecasting 模塊分解出數(shù)據(jù)趨勢(shì)及殘差。Reactive Planning 模塊根據(jù) Forecasting 模塊分解出的趨勢(shì)及殘差信息預(yù)測(cè)下一時(shí)刻的指標(biāo)值。
將第二步預(yù)測(cè)出的指標(biāo)值輸入主動(dòng)預(yù)測(cè)構(gòu)建出的 Resource Estimation 模型中,計(jì)算下一時(shí)刻 Pod 數(shù)量。
- 應(yīng)用擴(kuò)縮容
最終 pod 數(shù)量取主動(dòng)及被動(dòng)預(yù)測(cè)的最大值,計(jì)算公式如下。

3.算法效果評(píng)估
- AHPA 算法可以幫助客戶識(shí)別業(yè)務(wù)是否存在周期性

- 當(dāng)數(shù)據(jù)存在周期性時(shí),AHPA 對(duì)數(shù)據(jù)缺失、毛刺以及業(yè)務(wù)變更引發(fā)的數(shù)據(jù)周期變化等有很強(qiáng)的魯棒性

當(dāng)數(shù)據(jù)不存在周期性時(shí),AHPA 因具備一定的預(yù)測(cè)能力,可以提前感知數(shù)據(jù)趨勢(shì)變化;對(duì)數(shù)據(jù)丟失、噪音等有很強(qiáng)的魯棒性

三、結(jié)論
極致彈性是云核心優(yōu)勢(shì)之一,在云原生時(shí)代用戶對(duì)彈性的訴求也越發(fā)強(qiáng)烈。很多用戶配置了 HPA 和 CronHPA 策略。HPA 可以根據(jù)應(yīng)用負(fù)載更改實(shí)例數(shù)量,當(dāng)應(yīng)用負(fù)載較高時(shí)擴(kuò)容更多的實(shí)例。CronHPA 是定時(shí) HPA,在固定時(shí)間進(jìn)行實(shí)例數(shù)伸縮。CronHPA 配置規(guī)則復(fù)雜,且存在資源浪費(fèi),HPA 存在彈性觸發(fā)滯后的問(wèn)題,會(huì)導(dǎo)致業(yè)務(wù)穩(wěn)定性下降。
為此,我們提出了一種智能化彈性伸縮組件 AHPA,核心算法使用達(dá)摩院決策智能時(shí)序團(tuán)隊(duì)提供的 RobustScaler,該算法已被數(shù)據(jù)庫(kù)頂會(huì) ICDE 2022 錄用。RobustScaler 可以自動(dòng)識(shí)別指標(biāo)數(shù)據(jù)是否具有周期性,并且在周期變更、毛刺、數(shù)據(jù)缺失等場(chǎng)景下都具有很強(qiáng)的魯棒性。AHPA 組件可以在容器服務(wù) ACK 的組件中心里一鍵安裝,安裝成功后即可通過(guò) CRD 資源為應(yīng)用配置彈性伸縮策略,具體請(qǐng)參考官方幫助文檔《AHPA 彈性預(yù)測(cè)》[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] 《運(yùn)籌學(xué)》教材編寫(xiě)組. 運(yùn)籌學(xué)(第三版)[M]. 清華大學(xué)出版社, 2005.
[6]《AHPA 彈性預(yù)測(cè)》

























