沐 磊 李洪赭 李賽飛
(西南交通大學(xué)信息科學(xué)與技術(shù)學(xué)院 成都 611756)
隨著虛擬化技術(shù)和云計算技術(shù)的快速發(fā)展,基于Hypervisor 傳統(tǒng)虛擬化的云計算技術(shù)因為其較低的資源利用率等一系列問題,已經(jīng)逐漸被以Docker[1]為代表的基于容器虛擬化的容器技術(shù)所代替[2]。相比于傳統(tǒng)虛擬化技術(shù),Docker 容器技術(shù)通過復(fù)用本地操作系統(tǒng)來提高啟動速度,減少開銷。同時因為Docker容器技術(shù)簡化了應(yīng)用的部署工作,受到廣大開發(fā)者的歡迎[3]。然而在面對大規(guī)模集群的容器組時,對這些容器進(jìn)行管理會顯得非常困難。Kubernetes[4]是Google 的Borg[5]開源版本,Docker 容器集群編排調(diào)度系統(tǒng),使用Master-Slave模型[6]為容器化應(yīng)用提供資源調(diào)度、自動化部署、服務(wù)發(fā)現(xiàn)、彈性伸縮、資源監(jiān)控等服務(wù)[7]。其中彈性伸縮是通過監(jiān)測用戶指定的評價指標(biāo),使用閾值的方式對應(yīng)用進(jìn)行水平擴(kuò)容和縮容,以保障應(yīng)用的服務(wù)質(zhì)量和最大化地節(jié)省資源。
針對Kubernetes 的彈性伸縮技術(shù)的研究大致可以分為兩類,第一類采用方法或者預(yù)測模型對未來資源的利用率進(jìn)行估計或預(yù)測。文獻(xiàn)[8]針對擴(kuò)容和縮容時的不同特點,分別提出了快速擴(kuò)容算法和逐步收縮算法,通過在工作負(fù)載增加時快速創(chuàng)建多個pod 和在工作負(fù)載降低時逐步縮容的方式保障應(yīng)用的服務(wù)質(zhì)量。文獻(xiàn)[9]使用了基于動態(tài)參數(shù)的指數(shù)平滑法對資源利用率進(jìn)行預(yù)測,通過預(yù)測式擴(kuò)容和響應(yīng)式擴(kuò)容相結(jié)合的辦法解決Kubernetes擴(kuò)容時的響應(yīng)延遲問題。這些處理方法雖然簡單,但是在提高資源利用率和預(yù)測精度上仍有不足。第二類是針對Kubernetes 內(nèi)置的彈性伸縮策略進(jìn)行改進(jìn)和優(yōu)化。文獻(xiàn)[10]提出了一種基于負(fù)載特征的彈性伸縮策略,該策略根據(jù)負(fù)載特征對應(yīng)用進(jìn)行分類,求出應(yīng)用的整體負(fù)載并使用ARIMA 模型對負(fù)載進(jìn)行預(yù)測,使用預(yù)測值和負(fù)載值共同作為判斷伸縮的條件,以減少擴(kuò)縮容時的伸縮抖動現(xiàn)象。該策略提出的根據(jù)負(fù)載特征衡量復(fù)合型應(yīng)用負(fù)載的方法未考慮各種資源的重要性差異和資源極度不均衡情況下的服務(wù)質(zhì)量問題。
綜上所述,雖然目前針對Kubernetes 彈性伸縮策略中存在的問題的研究已經(jīng)比較全面,但是仍有改善的空間。本文通過對Kubernetes 內(nèi)置的伸縮策略進(jìn)行分析,針對單一衡量指標(biāo)和預(yù)測問題提出了一種改進(jìn)的彈性伸縮策略。該策略給出綜合負(fù)載率CLR(Comprehensive Load Rate)的計算方法,使用CLR 作為彈性伸縮的指標(biāo)。同時使用ARIMA-Kalman 預(yù)測模型對資源進(jìn)行預(yù)測,提高預(yù)測精度。
Pod 是Kubernetes 資源控制的基本單位。Kubernetes 通過HPA(Horizontal Pod Autoscaler)實現(xiàn)Pod的自動伸縮[11]。HPA 控制Kubernetes伸縮原理圖如圖1所示。
圖1 Kubernetes擴(kuò)縮容原理圖
在部署應(yīng)用時會設(shè)置某項資源監(jiān)測指標(biāo)和該資源的目標(biāo)平均使用率閾值TAU。則該指標(biāo)的伸縮閾值計算公式為
其中tolarence系統(tǒng)默認(rèn)值為0.1,設(shè)置該參數(shù)是為了防止應(yīng)用出現(xiàn)頻繁地擴(kuò)容和縮容。up和down分別是伸縮的上下限閾值。假設(shè)當(dāng)前共有k個該應(yīng)用的pod,HPA 通過輪詢的方式獲取當(dāng)前該pod集合中所有的該資源使用量Ui,求得當(dāng)前資源利用率和CAU為
其中request代表該pod 中資源的分配量。如果k*down≤CAU≤k*up,則不需要擴(kuò)縮容,否則需要進(jìn)行擴(kuò)縮容操作,計算公式為
以上是Kubernetes 實現(xiàn)伸縮功能的流程概述。從上面的分析可以看出。雖然Kubernetes 內(nèi)置的水平伸縮的算法比較簡單,但是存在兩個比較明顯的問題:單一衡量指標(biāo)和響應(yīng)延時。在面對復(fù)雜應(yīng)用系統(tǒng)時,應(yīng)用涉及多種資源類型的消耗可能會隨著時間和業(yè)務(wù)的變化而發(fā)生變化,單一衡量指標(biāo)無法準(zhǔn)確地衡量應(yīng)用整體負(fù)載的情況。當(dāng)應(yīng)用面對突發(fā)的負(fù)載變化時,在pod 擴(kuò)展之前的應(yīng)用服務(wù)質(zhì)量無法保障,甚至可能會發(fā)生應(yīng)用因為負(fù)載太高而崩潰的現(xiàn)象。
針對上文所說的單一衡量指標(biāo)和響應(yīng)延時問題,本文提出了一種改進(jìn)的彈性伸縮策略。該策略通過監(jiān)測記錄pod 各個指標(biāo),計算出當(dāng)前pod 的綜合負(fù)載率CLR(Comprehensive load rate),將CLR 作為pod伸縮的衡量指標(biāo)。同時使用ARIMA-Kalman模型對CLR進(jìn)行預(yù)測,提前進(jìn)行伸縮以保障服務(wù)質(zhì)量。
影響應(yīng)用服務(wù)質(zhì)量的因素有許多,包括CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤I/O 等多個基礎(chǔ)指標(biāo)。假設(shè)當(dāng)前pod 節(jié)點涉及的資源種類為n,Ci表示節(jié)點上第i種資源的使用率Ci為
其中Ri表示節(jié)點上資源i的分配量,Ui表示pod 對資源i 使用量。記Cmax為各種資源利用率的最大值,為了減少計算的復(fù)雜度,當(dāng)某項資源利用率低于下限閾值時,認(rèn)為該資源的利用率對應(yīng)用負(fù)載幾乎沒有影響,則該資源的利用率將不作為計算綜合負(fù)載CLR 的參數(shù)。如果Cmax低于下限閾值,則令CLR=Cmax。如果Cmax高于上限閾值,則資源可以被認(rèn)為是應(yīng)用的性能瓶頸,為了保證服務(wù)質(zhì)量,防止出現(xiàn)只有一種資源消耗非常高,其他資源利用率相對較低導(dǎo)致綜合負(fù)載率沒有達(dá)到擴(kuò)容閾值的情況,同樣令CLR=Cmax。由經(jīng)驗,設(shè)定下限閾值dl=0.4,上限閾值ul=0.95。
假設(shè)當(dāng)前應(yīng)用涉及的n種資源利用率中有k(k>0)個資源利用率滿足dl<Ci<ul且Cmax<ul,則CLR為
根據(jù)以上公式,最終計算出當(dāng)前pod 的CLR,該CLR 指標(biāo)在簡化計算復(fù)雜度和保證應(yīng)用服務(wù)質(zhì)量的前提下,全面反映出當(dāng)前pod 節(jié)點整體負(fù)載水平。
3.2.1 ARIMA預(yù)測模型
差分自回歸平穩(wěn)滑動平均模型(ARIMA)是時間序列預(yù)測方法,是博克斯和詹金斯提出的一種基于時間序列預(yù)測方法。該模型將非平穩(wěn)時間序列轉(zhuǎn)化為平穩(wěn)時間序列,讓因變量對其滯后值及隨機(jī)誤差項的現(xiàn)值和滯后值進(jìn)行回歸[12]。ARIMA(p,d,q)模型的數(shù)學(xué)表達(dá)式如下:
其中p為自回歸階數(shù),d為差分次數(shù),q為移動平均階數(shù)。B為后移差分算子,xt為原序列,αt為均值為0,方差為δ2的正態(tài)白噪聲序列。?(B)和θ(B)計算方法如下:
?(B)為p階AR 多項式,?i(i=1,2,…,p)為該多項式的待估系數(shù);θ(B)為q階MA 多項式。θj(j=1,2,…,q)為該多項式的待估系數(shù)。
ARIMA 模型的優(yōu)點在于只需要有限的樣本序列,就可以建立精度較高的預(yù)測模型。但是該模型存在低階模型預(yù)測精度低,高階模型參數(shù)估計難度大的缺點[13]。
3.2.2 Kalman濾波算法
Kalman 濾波是一種獲取變量的最佳估計,將過去的測量估計誤差合并到新的測量誤差中來估計將來的誤差,來對系統(tǒng)狀態(tài)進(jìn)行最優(yōu)估計的算法[14]。其線性離散的Kalman濾波方程如下:
其中x?k|k-1為從tk-1時刻對tk時刻的預(yù)測值;Kk為tk時刻的卡爾曼增益矩陣;Pk是tk時刻xk的狀態(tài)估計協(xié)方差矩陣。
卡爾曼濾波算法采用遞歸的形式,不需要全部的數(shù)據(jù),只需要根據(jù)tk時刻的測量值修正tk-1時刻的估計值,具有動態(tài)加權(quán)修正的特性[16],具有較好的預(yù)測精確度。但是Kalman 濾波算法需要狀態(tài)方程和測量方程才能保證有很好的預(yù)測精度。
針對以上對ARIMA 預(yù)測模型和Kalman 濾波模型的描述,可以看出這兩種預(yù)測模型都存在不足。本文通過使用ARIMA-Kalman算法,將兩種預(yù)測模型結(jié)合。利用ARIMA 模型建立低階預(yù)測模型,將該低階模型處理后計算Kalman 濾波模型的狀態(tài)方程和測量方程,使用Kalman 迭代方程進(jìn)行預(yù)測。
對于CLR 序列集合X(t) ,令x1(t)=x(t) ,x2(t)=x(t-1) ,… ,xp(t)=x(t-p+1);α1(t)=α(t) ,α2(t)=α1(t-1) ,…,αq(t)=αq-1(t-1) 。則ARIMA預(yù)測模型如下:
該組合算法的具體步驟如下所示。
1)數(shù)據(jù)采集
利用工具對各個指標(biāo)進(jìn)行采集并處理,按照上文中綜合指標(biāo)CLR計算方法對數(shù)據(jù)進(jìn)行計算,得出時間序列X(t)。
2)平穩(wěn)化處理
為了保證數(shù)據(jù)的平穩(wěn)化,對采集到的數(shù)據(jù)信息利用平穩(wěn)性檢驗方法ADF 檢驗進(jìn)行判斷。如果是非平穩(wěn)數(shù)據(jù),通過差分進(jìn)行平穩(wěn)化處理至ADF 檢驗滿足要求。
3)ARIMA模型參數(shù)確定
ARIMA(p,d,q)預(yù)測模型中,d代表在數(shù)據(jù)平穩(wěn)化的處理過程中差分的次數(shù)。p和q確定的方法有多種,本文中使用固定步長,遍歷求出最小AIC 信息準(zhǔn)則時p和q的值,從而確定ARIMA 模型的參數(shù)。
4)Kalman濾波模型預(yù)測
根據(jù)ARIMA 建模求得AR 模型和MA 模型的待估系數(shù),確定Kalman 系統(tǒng)的狀態(tài)方程和測量方程。利用式(12)~(16)遞推求出系統(tǒng)最新估計值。
為了驗證本文提出的改進(jìn)的彈性伸縮策略,搭建了兩個相同的Kubernetes 集群環(huán)境,Kubernetes的版本都是1.16.2,每個集群包含一個Master 節(jié)點和兩個Slave節(jié)點。其中一個集群使用內(nèi)置的彈性伸縮方法,另一個集群使用本文提出的彈性伸縮策略。集群的詳細(xì)配置如表1所示。
表1 實驗環(huán)境配置
本文的實驗數(shù)據(jù)使用2018 年阿里巴巴公開的生產(chǎn)環(huán)境采集的部分容器資源使用率信息。該數(shù)據(jù)包括CPU 利用率、內(nèi)存使用率,網(wǎng)絡(luò)以及磁盤IO等多個維度的資源使用情況。由于該數(shù)據(jù)集數(shù)據(jù)量龐大,本文選取出同時使用兩種及兩種以上維度的資源維度的容器數(shù)據(jù)作為算法計算的基礎(chǔ)數(shù)據(jù)。由于該公開的數(shù)據(jù)采樣的時間間隔不相等,去除時間間隔較近的點并對個別時間間隔較長的數(shù)據(jù)中間使用均值補差進(jìn)行補充,使時間間隔大致相等。
本文提出的改進(jìn)的Kubernetes 的伸縮策略需要從功能性和準(zhǔn)確性兩個方面進(jìn)行實驗驗證。所以實驗應(yīng)該包含兩個部分:1)使用JMeter 工具對Kubernetes 的pod 進(jìn)行壓力測試,分別記錄兩個集群的pod 的數(shù)量變化情況并進(jìn)行對比。驗證本文的伸縮策略在應(yīng)對負(fù)載變化時的預(yù)測伸縮效果。2)使用公開容器負(fù)載信息,計算出CLR序列。分別使用指數(shù)平滑法,ARIMA 預(yù)測模型和ARIMA-Kalman 預(yù)測模型進(jìn)行預(yù)測并對這三種預(yù)測模型的預(yù)測精度進(jìn)行評估。
首先在兩個實驗環(huán)境中分別部署一個相同的Web 應(yīng)用,伸縮閾值設(shè)置為60%,容忍度設(shè)置為默認(rèn)的0.1。利用JMeter 工具進(jìn)行模擬并發(fā)訪問請求,每隔1min增加并發(fā)請求數(shù)量并檢查當(dāng)前pod的數(shù)量。其中使用本文伸縮策略的實驗環(huán)境使用Prometheus獲取pod的資源信息并計算CLR進(jìn)行預(yù)測。具體數(shù)量變化情況如圖2所示。
從圖2 中可以看出,相比內(nèi)置的伸縮策略方法,本文使用的方法可以提前針對負(fù)載的變化趨勢進(jìn)行預(yù)測式的彈性伸縮,從而解決Kubernetes 內(nèi)置的伸縮策略的響應(yīng)延遲問題,保障了服務(wù)的質(zhì)量。
圖2 pod數(shù)量變化圖
為了比較本文使用的ARIMA-Kalman 預(yù)測模型和其他模型的精度,使用阿里巴巴的生產(chǎn)環(huán)境容器公開數(shù)據(jù)集的負(fù)載信息數(shù)據(jù)作為基礎(chǔ)數(shù)據(jù)。簡單處理后計算出CLR,將CLR 作為模型預(yù)測的輸入。分別使用絕對誤差(MAE)、平均絕對誤差(MSE)、平均絕對均方誤差(MSRE)這三種最常見的衡量指標(biāo)對文獻(xiàn)[5]中使用的指數(shù)平滑法以及文獻(xiàn)[6]使用的ARIMA 預(yù)測模型和本文使用的ARIMA-Kalman預(yù)測模型進(jìn)行評估。
每個容器的處理后的采樣數(shù)據(jù)約為650~800個,統(tǒng)一選取前550 個信息節(jié)點作為訓(xùn)練數(shù)據(jù),后100 個數(shù)據(jù)作為預(yù)測。指數(shù)平滑法,ARIMA 預(yù)測模型和ARIMA-Kalman 的預(yù)測誤差圖已經(jīng)分別如圖3所示。
圖3 模型預(yù)測誤差比較圖
由圖3 可以直觀看出,ARIMA-Kalman 的誤差相對其他兩種方法更小。由于ARIMA 模型的參數(shù)確定過程計算量較大,不適合對數(shù)據(jù)模型進(jìn)行動態(tài)更新,只適合做短期預(yù)測,本文一次性預(yù)測100 個數(shù)據(jù)點,所以整體誤差較大。指數(shù)平滑法由于使用了所有歷史節(jié)點的信息,在使用中會消耗更多的內(nèi)存資源,而且沒有考慮到數(shù)據(jù)變化的規(guī)律性。ARIMA-Kalman模型通過建立低階的ARIMA模型確定狀態(tài)轉(zhuǎn)移方程,使用Kalman 模型進(jìn)行更新迭代預(yù)估,其精確度相比ARIMA 和指數(shù)平滑法較大的提升。表2是對這三種模型的評估。
表2 各模型評價指標(biāo)對比
可以看出,相比于指數(shù)平滑法、ARIMA 模型,本文所使用的ARIMA-Kalman 預(yù)測模型的預(yù)測精度更優(yōu)。在面對負(fù)載變化的情況,能夠準(zhǔn)確地進(jìn)行預(yù)測。
本文針對Kubernetes 內(nèi)置的彈性伸縮機(jī)制的單一衡量指標(biāo)和響應(yīng)延遲的問題,提出了一種改進(jìn)的彈性伸縮策略。該策略通過定義統(tǒng)一負(fù)載評價指標(biāo)CLR,有效衡量出復(fù)雜應(yīng)用的整體負(fù)載水平。同時通過上下限閾值的設(shè)置,簡化了計算的復(fù)雜度并且保證了服務(wù)的質(zhì)量。使用ARIMA-Kalman 預(yù)測模型對應(yīng)用當(dāng)前CLR進(jìn)行預(yù)測,提前伸縮以保證服務(wù)質(zhì)量。實驗證明,該預(yù)測模型相比于指數(shù)平滑法和ARIMA預(yù)測模型具有更高的精度。