甩掉容量規劃炸彈:用 AHPA 實現 Kubernetes 智能彈性伸縮
一、AHPA 介紹
1.背景
Kubernetes 中應用實例數設置有固定實例數、HPA 和 CronHPA 三種策略。使用最多的是固定實例數,但是很多業務都存在波峰浪谷,如果采用固定實例數的方式會造成較大的資源浪費。Kubernetes 中提供了 HPA 及 CronHPA 兩種機制實現按需擴容實例數量,減少資源浪費。CronHPA 是用戶設定定時規則,在固定時間進行實例數伸縮。但是設定定時規則較為復雜,如果定時間隔設置較大就會造成資源浪費。HPA 可以根據應用實時負載設置實例數量,當應用負載高時擴容,當應用負載低時則縮容實例。HPA 是基于實時負載進行擴容,只有當負載已經比較高時才會觸發擴容,但此時業務已經處在高負載中因此業務部分流量出現響應慢或者超時的問題,即存在“彈性滯后”的問題。為此,我們提出了一種智能化彈性伸縮方案 AHPA,可以根據歷史時序數據進行主動預測,提前擴容,避免彈性滯后。同時,會根據實時數據動態調整主動預測結果,兼容周期變動等場景。
圖 1 各種彈性伸縮策略對比圖
2.AHPA 架構
圖 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 工作是否符合預期。
3.AHPA 部署方式
圖 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 所示。
表 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 容量充足。
Predict POD Oberserver:藍色表示使用 HPA 實際的擴縮容 Pod 數,綠色表示 AHPA 預測出來的擴縮容 Pod 數,綠色曲線小于藍色,表明預測的 Pod 數量更少。
二、AHPA Algorithm-RobustScaler 算法
時序預測是 AHPA 算法的核心能力。現有的時間序列預測算法大致可以分為兩大類:統計學算法如 ARIMA、 ETS、 GARCH 等;機器學習算法和深度學習算法如廣義線性模型、XGBoost、LSTM、CNN、RNN 等。
Kubernetes 中 metrics 數據一般采用 Prometheus 存儲,綜合效率成本等因素,一般業務數據存儲周期為 7 天。7 天數據量作為訓練集過小,訓練出的機器/深度學習模型準確性較差。AHPA 用于實時彈性擴容,對于預測時延要求較高,統計學算法配置參數少、計算復雜度低、延時低。綜合考慮,我們采用了統計學算法進行時序預測。
1.Framework
圖 4 RobustScaler Framework
RobustScaler算法框架如圖 4 所示。實時指標數據(Real-time metric data)為過去分鐘內的數據,用于被動預測(Proactive Planning);歷史指標數據(Historical metric data)為過去
天數據,用于主動預測(Reactive Planning)。
- Forecasting
首先利用 RobustPeriod[2]算法檢測數據是否有周期,有幾重周期以及每個周期分量的長度。如果數據存在周期性,則調用 RobustSTL[3]算法分解出數據的趨勢、周期及殘差項;如果數據沒有周期性,則調用 RobustTrend[4]算法分解出趨勢和殘差項。
圖 5 Forecasing 模塊框架圖
RobustPeriod 利用特殊的小波變換 MODWT 來隔絕多周期之間的相互干擾,從而檢測出時序數據中的多周期。RobustSTL 針對周期性數據,首先從時序數據中分解出趨勢項,然后分解出周期項,最后根據殘差項修正,以上過程多次迭代直至收斂。RobustTrend 算法針對非周期性數據,從時序數據中分解出趨勢及殘差。
- Resource Model
ResourceModel 模塊用于構建資源模型,該模型的輸入為指標時序數據,輸出為 Pod 數量。模型選用了統計學中的排隊論[5]模型。具體的模型與輸入的指標有關,單指標一般采用線性模型,多指標時往往采用非線性模型。
- Proactive planning
Forecasting 模塊使用 RobustSTL 算法將時序數據分解為趨勢項,周期項
及殘差項
, 下一時刻的指標值計算方式如下。
主動預測:將歷史周期項直接向右平移作為未來周期項的預測,將趨勢項用指數平滑等經典的時序模型預測得到未來趨勢分量的預測,殘差部分利用分位數回歸森林得到未來殘差的上界預測。
- Reactive planning
Forecasting 模塊使用 RobustTrend 算法將無周期數據分解為趨勢項,殘差項
。當前時刻的指標可以表示為
,下一時刻的指標值由最近
分鐘指標計算得出,公式如下。
其中表示
時刻的指標權重,該值由
時刻的指標值及與
時刻與當前時刻差共同決定。
2.模型訓練及預測
算法使用過程如下。
- 主動預測
獲取最近天數據
對數據進行分析,基于 Forecasting 模塊分解出數據周期、趨勢及殘差。Proactive Planning 模塊根據 Forecasting 模塊分解出的信息進行預測。預測結果為接下來小時的指標值。
根據最近數據構建 Resource Estimation 模型。該模型的輸入為第二步預測出的指標值,輸出為預期 Pod 數量。
- 被動預測
獲取最近分鐘數據
對數據進行分析,基于 Forecasting 模塊分解出數據趨勢及殘差。Reactive Planning 模塊根據 Forecasting 模塊分解出的趨勢及殘差信息預測下一時刻的指標值。
將第二步預測出的指標值輸入主動預測構建出的 Resource Estimation 模型中,計算下一時刻 Pod 數量。
- 應用擴縮容
最終 pod 數量取主動及被動預測的最大值,計算公式如下。
3.算法效果評估
- AHPA 算法可以幫助客戶識別業務是否存在周期性
- 當數據存在周期性時,AHPA 對數據缺失、毛刺以及業務變更引發的數據周期變化等有很強的魯棒性
當數據不存在周期性時,AHPA 因具備一定的預測能力,可以提前感知數據趨勢變化;對數據丟失、噪音等有很強的魯棒性
三、結論
極致彈性是云核心優勢之一,在云原生時代用戶對彈性的訴求也越發強烈。很多用戶配置了 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 彈性預測》