Kubernetes增強型調度器Volcano算法分析【華為雲技術分享】


【摘要】 Volcano 是基於 Kubernetes 的批處理系統,源自於華為雲開源出來的。Volcano 方便 AI、大數據、基因、渲染等諸多行業通用計算框架接入,提供高性能任務調度引擎,高性能異構芯片管理,高性能任務運行管理等能力。

1 為什么K8S需要Volcano

K8S自帶的的資源調度器,有一個明顯的特點是:依次調度每個容器。但在AI訓練或者大數據,這種必須多個容器同時配合執行的情況下,容器依次調度是無法滿足需要的。因為這些計算任務包含的容器們想要的是,要么同時都成功,要么就都別執行

比如,某個大數據應用需要跑1個Driver容器+10個Executor容器(對應AI訓練的話,就是1個PS容器+10個Worker容器)。如果容器是一個一個的調度,假設在啟動最后一個executor容器(對應AI是Worker容器)時,由於資源不足而調度失敗無法啟動。那么前面的9個executor容器雖然運行着,其實也是浪費的。AI訓練也是一樣的道理,必須所有的Worker都同時運行,才能進行訓練,壞一個,其他的容器就等於白跑。而GPU被容器霸占着卻不能開始計算,成本是非常高的。

所以當你的(1)總體資源需求<集群資源的時候,普通的K8S自帶調度器可以跑,沒問題。但是當(2)總體資源需求>集群資源的時候,K8S自帶調度器會因為隨機依次調度容器,使得部分容器無法調度,從而導致業務占着資源又不能開始計算,死鎖着浪費資源。那么場景(1)和場景(2)誰說常態呢?不用說,肯定是(2)了,誰能大方到一直讓集群空着呢對吧。這個時候就必須需要增強型的K8s資源調度器Volcano了。

2 資源調度領域

當用戶向K8s申請容器所需的計算資源(如 CPU、Memory、GPU等)時,調度器負責挑選出滿足各項規格要求的節點來部署這些容器。通常,滿足各項要求的節點並非唯一,且水位(節點已有負載)各不相同,不同的分配方式最終得到的分配率存在差異,因此,調度器的一項核心任務就是以最終資源利用率最優的目標從眾多候選機器中挑出最合適的節點

除了資源維度上的要求,實際調度中還有容災和干擾隔離上的考慮:比如同一應用的容器不允許全部部署到同一台節點上,很多應用會要求每台節點上只允許有一個實例。另外,某些應用組件之間還存在互斥關系(如資源爭搶),嚴重影響應用的性能,因此也不允許它們被部署到同一台節點上。這些限制條件的引入,使得想新寫一款調度器,能替代原生K8S調度器並不容易。

3 算法分析

Volcano首先要解決的問題就是Gang Scheduling的問題,即一組容器要么都成功,要么都別調度。這個是最基本的用來解決資源死鎖的問題,可以很好的提高集群資源利用率(在高業務負載時)。除此之外,它還提供了多種調度算法,例如priority優先級,DRF(dominant resource fairness), binpack等。 我們今天就是挖一挖Volcano內部的各種調度算法實現。

3.1 Gang Scheduling

這種調度算法,首先就是有’組’的概念,調度結果成功與否,只關注整一’組’容器。

具體算法是,先遍歷各個容器組(代碼里面稱為Job),然后模擬調度這一組容器中的每個容器(代碼里面稱為Task)。最后判斷這一組容器可調度容器數是否大於最小能接受底限,可以的話就真的往節點調度(代碼里面稱為Bind節點)。

3.2 DRF(dominant resource fairness)

這種調度算法,主要是Yarn和Mesos都有,而K8S沒有,需要補齊。概括而言,DRF意為:“誰要的資源少,誰的優先級高”。因為這樣可以滿足更多的作業,不會因為一個胖業務,餓死大批小業務。注意:這個算法選的也是容器組(比如一次AI訓練,或一次大數據計算)。

3.3 binpack

這種調度算法,目標很簡單:盡量先把已有節點填滿(盡量不往空白節點投)。具體實現上,binpack就是給各個可以投遞的節點打分:“假如放在當前節點后,誰更滿,誰的分數就高”。因為這樣可以盡量將應用負載靠攏至部分節點,非常有利於K8S集群節點的自動擴縮容功能。注意:這個算法是針對單個容器的。

3.4 proportion(Queue隊列)

Queue功能是Yarn調度器有的功能,K8S需要補齊。不過我對Queue這個取名有些不太滿意。因為它實際上是用來控制集群總資源分配比例的。比如說某廠有2個團隊,共享一個計算資源池。管理員設置:A團隊最多使用總集群的60%。然后B團隊最多使用總集群的40%。那投遞的任務量,超過該團隊的可用資源怎么辦?那就排隊等唄,所以特性取名Queue。

3.5 最終權重

由於Volcano的調度算法插件實在太多,每個插件的決策又有可能互相干擾。所以為了在各個算法間做權衡,又給插件設置了權重,這樣可以控制每種調度算法插件的影響因子。比如NodeOrder算法里面,就是在優選階段(注:k8s調度,分預選階段和優選階段。預選就是排除不符合的節點。優選就是給所有符合的節點打分)給節點打分的算法。各個算法有自己的權重可以配置。

4 Volcano

Volcano項目的前身是Kube-Batch,一個帶着想解決k8s不支持Gang Scheduling問題初衷的項目。后來由於AI和大數據等業務領域也開始對K8s有述求情況下,團隊成員希望有一種噴薄而出的感覺,所以帶上具體場景實踐經驗,重新將項目命名為Volcano,火山。希望能夠推動K8S在各個場景下向火山一樣熱烈綻放。

如果有興趣共享一份力量,可以訪問 https://volcano.sh/ 參與。

作者:tsjsdbd

HDC.Cloud 華為開發者大會2020 即將於2020年2月11日-12日在深圳舉辦,是一線開發者學習實踐鯤鵬通用計算、昇騰AI計算、數據庫、區塊鏈、雲原生、5G等ICT開放能力的最佳舞台。

歡迎報名參會


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM