甩掉容量規(guī)劃炸彈:用 AHPA 實現(xiàn) Kubernetes 智能彈性伸縮
一、AHPA 介紹
1.背景
Kubernetes 中應(yīng)用實例數(shù)設(shè)置有固定實例數(shù)、HPA 和 CronHPA 三種策略。使用最多的是固定實例數(shù),但是很多業(yè)務(wù)都存在波峰浪谷,如果采用固定實例數(shù)的方式會造成較大的資源浪費。Kubernetes 中提供了 HPA 及 CronHPA 兩種機(jī)制實現(xiàn)按需擴(kuò)容實例數(shù)量,減少資源浪費。CronHPA 是用戶設(shè)定定時規(guī)則,在固定時間進(jìn)行實例數(shù)伸縮。但是設(shè)定定時規(guī)則較為復(fù)雜,如果定時間隔設(shè)置較大就會造成資源浪費。HPA 可以根據(jù)應(yīng)用實時負(fù)載設(shè)置實例數(shù)量,當(dāng)應(yīng)用負(fù)載高時擴(kuò)容,當(dāng)應(yīng)用負(fù)載低時則縮容實例。HPA 是基于實時負(fù)載進(jìn)行擴(kuò)容,只有當(dāng)負(fù)載已經(jīng)比較高時才會觸發(fā)擴(kuò)容,但此時業(yè)務(wù)已經(jīng)處在高負(fù)載中因此業(yè)務(wù)部分流量出現(xiàn)響應(yīng)慢或者超時的問題,即存在“彈性滯后”的問題。為此,我們提出了一種智能化彈性伸縮方案 AHPA,可以根據(jù)歷史時序數(shù)據(jù)進(jìn)行主動預(yù)測,提前擴(kuò)容,避免彈性滯后。同時,會根據(jù)實時數(shù)據(jù)動態(tài)調(diào)整主動預(yù)測結(jié)果,兼容周期變動等場景。
圖 1 各種彈性伸縮策略對比圖
2.AHPA 架構(gòu)
圖 2 AHPA 框架圖
AHPA 整體架構(gòu)如圖 2 所示,分為數(shù)據(jù)采集、預(yù)測及彈性伸縮三大部分。
- 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)控平臺。
指標(biāo)包含 CPU、Memory、GPU 等資源指標(biāo),也包括 QPS、RT 等業(yè)務(wù)指標(biāo),同時也支持其他用戶自定義指標(biāo)。Adapter 模塊負(fù)責(zé)將從多個數(shù)據(jù)源收集的各類指標(biāo)轉(zhuǎn)為統(tǒng)一的格式輸入給 Prediction 模塊。
- Prediction
Prediction 模塊負(fù)責(zé)根據(jù)輸入指標(biāo)預(yù)測所需的 Pod 數(shù)量。Preprocessing 負(fù)責(zé)數(shù)據(jù)預(yù)處理,如過濾非 Running 狀態(tài)的 Pod 利用率、處理缺失數(shù)據(jù)等。完成預(yù)處理后將時序數(shù)據(jù)傳遞給 RobustScaler[1]算法模塊。該模塊將在第二部分詳細(xì)介紹。
Revise 模塊負(fù)責(zé)對 RobustScaler 模塊給出的預(yù)測 Pod 數(shù)量進(jìn)行修正。RobustScaler 分為 Proactive 和 Reactive 兩種模式,用戶也會為應(yīng)用 Pod 數(shù)量設(shè)置上下限。為保證應(yīng)用平穩(wěn)運行,我們采取盡快擴(kuò),緩慢縮的策略,因此 Revise 模塊會取 Proactive、Reactive 及用戶設(shè)置的上下限中最大值作為預(yù)測的 Pod 數(shù)量。
- Scaling
Scaling 模塊負(fù)責(zé)執(zhí)行 Pod 擴(kuò)縮容。彈性伸縮策略分為兩類:auto 及 observer 模式。
- auto:根據(jù) Prediction 給出的 Pod 數(shù)量自動調(diào)整
- observer:dryrun 模式,不調(diào)整 Pod 數(shù)量。用戶可以通過這種方式觀察 AHPA 工作是否符合預(yù)期。
3.AHPA 部署方式
圖 3 AHPA 部署圖
AHPA 在 Kubernetes 中部署圖如上所示,分為 AHPA Algorithm 及 AHPA Controller 兩部分。AHPA Algorithm Deployment 是負(fù)責(zé) AHPA 中算法相關(guān)的部分,對應(yīng)架構(gòu)圖中的 Prediction 模塊。AHPA Controller 負(fù)責(zé)數(shù)據(jù)收集及彈性擴(kuò)縮容的執(zhí)行,對應(yīng)架構(gòu)圖中的 Data Collection 及 Scaling 模塊。
AHPA 引入 CRD(CustomResourceDefinition)資源以配置彈性伸縮策略,每個應(yīng)用(Deployment)對應(yīng)一個 CRD 資源。使用 CRD 的優(yōu)勢在于可以透出多種算法配置,具有較強(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 用于指定這個 CRD 資源關(guān)聯(lián)的應(yīng)用,spec.metrics 用于指定采集的時序指標(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)用存在明顯的波峰浪谷,因此需要針對不同時段設(shè)置不同的上下界。因此,我們提供了 spec.instanceBounds 可以設(shè)置不同時段邊界保護(hù),也可以起到定時彈性的作用。具體參數(shù)及說明如表 1 所示。
表 1 AHPA CRD 核心參數(shù)列表及說明
- 高可用性
異常在復(fù)雜系統(tǒng)中不可避免,因此我們在部署時采用了高可用性架構(gòu)。Algorithm 與 Controller 組件都采用 Deployment 方式部署,當(dāng) Pod 發(fā)生異常時會自動殺死異常 Pod 并創(chuàng)建新的 Pod,保證業(yè)務(wù)平穩(wěn)運行。當(dāng)接入的業(yè)務(wù)應(yīng)用較多時,Algorithm 及 Controller 均可水平擴(kuò)展以滿足高并發(fā)需求。
為了保證 AHPA 組件升級過中業(yè)務(wù)無感知,Algorithm 和 Controller 組件基于 Service 進(jìn)行通信,Algorithm 及 Controller 可以獨立升級。升級時采用滾動升級方式,即先創(chuàng)建新的 Pod,等待新的 Pod 可以對外提供服務(wù)后再殺死舊 Pod。
- 可觀測性
我們提供了 Kubernetes Event、Prothemetheus、Dashboard 等多種方式透出 AHPA 組件運行狀態(tài),方便客戶監(jiān)控 AHPA 運行狀態(tài)及定位問題。
如設(shè)置 observer 模式后,用戶可以通過查看 Dashboard 預(yù)估 AHPA 生效結(jié)果。
Predict CPU Oberserver:藍(lán)色表示 HPA 實際的 CPU 使用量,綠色表示 AHPA 預(yù)測出來的 CPU 使用量。綠色曲線大于藍(lán)色,表明預(yù)測的 CPU 容量充足。
Predict POD Oberserver:藍(lán)色表示使用 HPA 實際的擴(kuò)縮容 Pod 數(shù),綠色表示 AHPA 預(yù)測出來的擴(kuò)縮容 Pod 數(shù),綠色曲線小于藍(lán)色,表明預(yù)測的 Pod 數(shù)量更少。
二、AHPA Algorithm-RobustScaler 算法
時序預(yù)測是 AHPA 算法的核心能力?,F(xiàn)有的時間序列預(yù)測算法大致可以分為兩大類:統(tǒng)計學(xué)算法如 ARIMA、 ETS、 GARCH 等;機(jī)器學(xué)習(xí)算法和深度學(xué)習(xí)算法如廣義線性模型、XGBoost、LSTM、CNN、RNN 等。
Kubernetes 中 metrics 數(shù)據(jù)一般采用 Prometheus 存儲,綜合效率成本等因素,一般業(yè)務(wù)數(shù)據(jù)存儲周期為 7 天。7 天數(shù)據(jù)量作為訓(xùn)練集過小,訓(xùn)練出的機(jī)器/深度學(xué)習(xí)模型準(zhǔn)確性較差。AHPA 用于實時彈性擴(kuò)容,對于預(yù)測時延要求較高,統(tǒng)計學(xué)算法配置參數(shù)少、計算復(fù)雜度低、延時低。綜合考慮,我們采用了統(tǒng)計學(xué)算法進(jìn)行時序預(yù)測。
1.Framework
圖 4 RobustScaler Framework
RobustScaler算法框架如圖 4 所示。實時指標(biāo)數(shù)據(jù)(Real-time metric data)為過去分鐘內(nèi)的數(shù)據(jù),用于被動預(yù)測(Proactive Planning);歷史指標(biāo)數(shù)據(jù)(Historical metric data)為過去
天數(shù)據(jù),用于主動預(yù)測(Reactive Planning)。
- Forecasting
首先利用 RobustPeriod[2]算法檢測數(shù)據(jù)是否有周期,有幾重周期以及每個周期分量的長度。如果數(shù)據(jù)存在周期性,則調(diào)用 RobustSTL[3]算法分解出數(shù)據(jù)的趨勢、周期及殘差項;如果數(shù)據(jù)沒有周期性,則調(diào)用 RobustTrend[4]算法分解出趨勢和殘差項。
圖 5 Forecasing 模塊框架圖
RobustPeriod 利用特殊的小波變換 MODWT 來隔絕多周期之間的相互干擾,從而檢測出時序數(shù)據(jù)中的多周期。RobustSTL 針對周期性數(shù)據(jù),首先從時序數(shù)據(jù)中分解出趨勢項,然后分解出周期項,最后根據(jù)殘差項修正,以上過程多次迭代直至收斂。RobustTrend 算法針對非周期性數(shù)據(jù),從時序數(shù)據(jù)中分解出趨勢及殘差。
- Resource Model
ResourceModel 模塊用于構(gòu)建資源模型,該模型的輸入為指標(biāo)時序數(shù)據(jù),輸出為 Pod 數(shù)量。模型選用了統(tǒng)計學(xué)中的排隊論[5]模型。具體的模型與輸入的指標(biāo)有關(guān),單指標(biāo)一般采用線性模型,多指標(biāo)時往往采用非線性模型。
- Proactive planning
Forecasting 模塊使用 RobustSTL 算法將時序數(shù)據(jù)分解為趨勢項,周期項
及殘差項
, 下一時刻的指標(biāo)值計算方式如下。
主動預(yù)測:將歷史周期項直接向右平移作為未來周期項的預(yù)測,將趨勢項用指數(shù)平滑等經(jīng)典的時序模型預(yù)測得到未來趨勢分量的預(yù)測,殘差部分利用分位數(shù)回歸森林得到未來殘差的上界預(yù)測。
- Reactive planning
Forecasting 模塊使用 RobustTrend 算法將無周期數(shù)據(jù)分解為趨勢項,殘差項
。當(dāng)前時刻的指標(biāo)可以表示為
,下一時刻的指標(biāo)值由最近
分鐘指標(biāo)計算得出,公式如下。
其中表示
時刻的指標(biāo)權(quán)重,該值由
時刻的指標(biāo)值及與
時刻與當(dāng)前時刻差共同決定。
2.模型訓(xùn)練及預(yù)測
算法使用過程如下。
- 主動預(yù)測
獲取最近天數(shù)據(jù)
對數(shù)據(jù)進(jìn)行分析,基于 Forecasting 模塊分解出數(shù)據(jù)周期、趨勢及殘差。Proactive Planning 模塊根據(jù) Forecasting 模塊分解出的信息進(jìn)行預(yù)測。預(yù)測結(jié)果為接下來小時的指標(biāo)值。
根據(jù)最近數(shù)據(jù)構(gòu)建 Resource Estimation 模型。該模型的輸入為第二步預(yù)測出的指標(biāo)值,輸出為預(yù)期 Pod 數(shù)量。
- 被動預(yù)測
獲取最近分鐘數(shù)據(jù)
對數(shù)據(jù)進(jìn)行分析,基于 Forecasting 模塊分解出數(shù)據(jù)趨勢及殘差。Reactive Planning 模塊根據(jù) Forecasting 模塊分解出的趨勢及殘差信息預(yù)測下一時刻的指標(biāo)值。
將第二步預(yù)測出的指標(biāo)值輸入主動預(yù)測構(gòu)建出的 Resource Estimation 模型中,計算下一時刻 Pod 數(shù)量。
- 應(yīng)用擴(kuò)縮容
最終 pod 數(shù)量取主動及被動預(yù)測的最大值,計算公式如下。
3.算法效果評估
- AHPA 算法可以幫助客戶識別業(yè)務(wù)是否存在周期性
- 當(dāng)數(shù)據(jù)存在周期性時,AHPA 對數(shù)據(jù)缺失、毛刺以及業(yè)務(wù)變更引發(fā)的數(shù)據(jù)周期變化等有很強(qiáng)的魯棒性
當(dāng)數(shù)據(jù)不存在周期性時,AHPA 因具備一定的預(yù)測能力,可以提前感知數(shù)據(jù)趨勢變化;對數(shù)據(jù)丟失、噪音等有很強(qiáng)的魯棒性
三、結(jié)論
極致彈性是云核心優(yōu)勢之一,在云原生時代用戶對彈性的訴求也越發(fā)強(qiáng)烈。很多用戶配置了 HPA 和 CronHPA 策略。HPA 可以根據(jù)應(yīng)用負(fù)載更改實例數(shù)量,當(dāng)應(yīng)用負(fù)載較高時擴(kuò)容更多的實例。CronHPA 是定時 HPA,在固定時間進(jìn)行實例數(shù)伸縮。CronHPA 配置規(guī)則復(fù)雜,且存在資源浪費,HPA 存在彈性觸發(fā)滯后的問題,會導(dǎo)致業(yè)務(wù)穩(wěn)定性下降。
為此,我們提出了一種智能化彈性伸縮組件 AHPA,核心算法使用達(dá)摩院決策智能時序團(tuán)隊提供的 RobustScaler,該算法已被數(shù)據(jù)庫頂會 ICDE 2022 錄用。RobustScaler 可以自動識別指標(biāo)數(shù)據(jù)是否具有周期性,并且在周期變更、毛刺、數(shù)據(jù)缺失等場景下都具有很強(qiáng)的魯棒性。AHPA 組件可以在容器服務(wù) ACK 的組件中心里一鍵安裝,安裝成功后即可通過 CRD 資源為應(yīng)用配置彈性伸縮策略,具體請參考官方幫助文檔《AHPA 彈性預(yù)測》[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] 《運籌學(xué)》教材編寫組. 運籌學(xué)(第三版)[M]. 清華大學(xué)出版社, 2005.
[6]《AHPA 彈性預(yù)測》