◆謝文舟 孫艷霞
?
基于Kubernetes負載特征的資源預測模型研究
◆謝文舟1孫艷霞2
(1.四川大學計算機學院 四川 610065;2.海康威視數字技術股份有限公司 浙江 310051)
Kubernetes是當前最流行的容器云管理平臺。它是將計算機集群資源包括CPU、內存、網絡帶寬等整合之后按需供應給租戶使用,在資源管理方面能滿足租戶動態的資源需求,因此減少了租戶在基礎設施以及系統維護上的成本。但是Kubernetes在管理租戶資源動態需求時,是根據節點當前資源使用量來調整資源配額,這種方法是基于已經出現資源告警情況下進行調整,存在著應用程序由于資源超出限額暫時退出的問題。本文提出了一種基于過去一段時間的資源負載特征序列預測未來資源負載特征模型,該預測模型經過實驗驗證對未來資源負載情況有一定的預測作用,減少了租戶應用程序出現暫時退出的情況,并且提高了資源利用率。
云計算;Kubernetes;預測
Kubernetes是由Google公司開發并開源的用于管理跨宿主機容器集群的云計算管理工具,是目前PaaS(平臺即服務)中最受關注的容器云平臺。它構建在Docker之上,租戶可以在其上創建和管理Docker容器集群,并為容器化的應用集群提供資源調度、自動化部署、服務發現、彈性伸縮、資源監控等一整套功能。
Kubernetes是一個容器集群管理平臺。Kubernetes需要統計平臺的資源使用情況,合理地將資源分配給容器使用,并且保證容器生命周期內有足夠的資源可用。Kubernetes通過創建Namespace來隔離不同類型的應用程序,應用程序則通過Pod來供Kubernetes Scheduler調度和運行。Scheduler在調度Pod時會根據Pod的配置文件yaml中資源需求來選擇合適的節點啟動Pod。
在默認的情況下,運行中的Pod可以無限制的使用節點上的CPU和Memory資源,這意味著任意一個Pod都可以無限制地使用宿主節點上的計算資源,Pod可能導致Node上的CPU/Memory資源耗盡。Kubernetes1.2版本中發布了一新功能Resource Quota和Limit Range,即資源上限和資源配額。Resource Quota為每個Namespace申請資源配額,代表了Namespace擁有的計算資源總量;Limit Range則給每個待調度的Pods設置了一個資源使用上限,這個上限不能超過Namespace的資源配額。
Pod的資源請求能夠保證有足夠的資源供程序運行,資源的Limit Range防止Pod無限制地使用節點資源,導致其他Pod崩潰退出;Resource Quota則約束了同一個Namespace下Pod的Limit Range的最大值、Pod的總數等。Kubernetes提供API對象Resource Quota來實現資源配額。創建Pod的時候,可以在yaml配置文件中指定計算資源(目前支持的資源類型有CPU和內存),即指定每個容器的資源請求(Request)和資源限制(Limit),資源請求是容器所需的最小資源需求,資源限制則是容器不能超過的資源上限。它們的大小關系是(Quota表示Namespace的資源配額):
0<=Request<=Limit<= Quota.
無論Limit Range還是Resource Quota的配置,都是在Pod啟動之前靜態配置好的。Limit Range是調度Pod時靜態寫在yaml配置文件中,Resource Quota是在創建一個Namespace時寫在配置yaml文件中的。那么,當Pod啟動運行期間,同一個Namespace內的Pod資源消耗總量大于Resource Quota時會出現什么情況呢?即:
limitpoa0+ limitpoa1+…+limitpoai>Quota
其中i?N,N為自然數。
Namespace中Pod內的容器若資源配額不夠,DockerDamon則會將低優先級的容器暫時殺死。盡管Kubernetes在后續版本中集成了cAdvisor監控系統,它可以監視并輸出處于運行狀態的容器的資源使用信息,并通過直觀的用戶界面提供可視化的展示。但是,這種方法還是得依靠人工的方式來判斷節點的負載和容器應用的資源使用趨勢,然后調整應用容器的資源配額,這種方式不僅需要人工繁瑣的計算,還可能對未來節點或者應用容器的資源使用趨勢做出錯誤的判斷,從而給租戶帶來不可挽回的損失。
針對Kubernetes在動態的資源需求方面存在的問題,本文提出了一種資源預測方法,該方法基于資源使用量的歷史序列預測未來資源負載情況。在資源分配調整上,可以幫助Kubernetes根據預測值提前獲知Pod的資源限額。



運行在集群中的應用容器消耗的計算機資源包括CPU、內存等,將節點上資源歷史使用情況采集起來組成資源歷史使用時間序列,然后利用這些歷史數據通過時間序列預測模型來預測應用容器在未來時段資源使用量。ARIMA資源預測模型對資源的預測步驟可以描述為表1:

表1 ARIMA
當前Kubernetes版本只支持CPU及內存資源配額的動態調整,故本實驗主要考慮CPU和內存兩類資源。實驗環境搭建兩個Kubernetes集群,一個是基于1.8.0版本,一個是在1.8.0版本上引入本文資源負載特征的預測模型模塊之后的改進版本。兩個集群都有一個Master節點、三個Node節點,配置下表所示。

表2 虛擬機配置
準備測試應用,啟動Pod運行在Kubernetes集群中,初始Pod實例個數都為1,Pod內的容器副本數為3。然后使用壓力測試工具ab來模擬用戶請求,讓這些測試應用表現出不同的特征,其中一個測試讓應用表現出CPU高負載,另一個測試讓應用表現內存高負載,且兩個測試其他資源無壓力。資源利用率數據通過Kubernetes平臺下的cAdvisor監測工具獲得并進行統計,最后比較Node節點的資源利用率曲線。
本次實驗中,利用Kubernetes監控模塊進行樣本數據采集,采集的時間間隔為5s,總共采集120個數據作為樣本序列,通過CPU樣本序列值采用最小二乘法估計模型參數。然后再將序列值作為輸入,計算出CPU的未來需求量值。內存高負載實驗同樣每隔5秒采集一次數據,120個數據作為樣本序列,用同樣的方法估計模型參數并計算出內存預測值。
根據CPU值計算出其利用率,如圖1描繪的是CPU實際使用率與通過資源預測模型計算出的預測值計算出的利用率的關系,圖2描繪的是內存實際使用率與通過資源預測模型計算出的預測值計算出的利用率的關系。從曲線變化圖可以看出,資源預測模型計算出的值和資源實際使用量基本一致。內存高負載實驗中內存使用的變化曲線圖如圖3所示,可以觀察到,引入ARIMA預測模型之后,內存在增加負載后預測模型能及時預測并調整資源閾值,Pod上的容器應用不至于資源不足而退出,預測值也和目標資源實際需求值呈現一致性,而沒有資源預測的容器應用由于OOM異常致使容器被強制退出,內存利用率下降明顯。

圖1 CPU資源使用率變化圖

圖2 內存資源使用率變化圖

圖3內存資源使用變化圖
本文通過歷史資源負載特征,引入了一種基于歷史資源負載特征的預測模型,該模型給Kubernetes在當前資源分配提供了重要的參考。結果表明,引入基于資源負載特征的預測模型之后,節點上的應用因為資源使用量超出閾值而被強制退出的次數減少且資源利用率提高。當然,該模型只考慮了CPU和內存,沒有充分考慮節點的其他類型的資源,后續我們還可以將這類資源考慮進來以此提高模型的預測準確性。
[1]杜軍.基于Kubernetes的云端資源調度器的改進[D].浙江大學,2016.
[2]何思玫.面向容器云平臺的集群資源調度管理器的設計與實現[D].浙江大學,2017.
[3]熊少峰, 王可東.自回歸滑動平均建模中觀測噪聲方差估計的新方法[J].控制理論與應用,2013.
[4]徐慧娟.自回歸AR模型的整體最小二乘分析研究[D].東華理工大學,2012.
[5]XinLi,ZhuzongQian,SangluLu,JieWu.Energy efficient virtual machine placement algorithm with balanced and improved resource utilization in a data center[J].Mathematical and Computer Modeling,2013.
國家重點研發計劃(2016yfb0800604,2016yfb0800605),國家自然科學基金項目(61572334)。