Kubernetes資源排程3-資源動態排程
基於Kubernetes的容器雲平臺資源排程策略
該篇論文質量較高,認真學習一下。
排程思想大致分為兩種 擴散以及貪心。
擴散:儘量將服務排程到不同的叢集節點上以此來保證資源的均衡利用率,避免單機故障的風險
貪心:儘量將所有服務排程到同一節點上,提高資源的利用率
叢集資源排程系統分類
集中式排程系統
Swarm Borg 叢集使用同一的排程演算法進行排程,排程任務不可以並行執行,排程資訊需要儲存在儲存器,任務較重延時較高。Scheduler 支援 Random、Spread 和 Binpack 三種排程策略,其中 Random 策略隨機選擇目標節點進行 Docker 排程;Spread 和
Binpack 則根據節點可用的 CPU、存資源量和節點上當前執行的 Docker 數量做出排程決策,Spread 將 Docker 分散排程到各個節點上,以提高系統的整體負載均衡;Binpack 與 Spread 相反,將 Docker排程到負載最高的節點上,提高叢集中節點承載容器的密度。
兩層式排程系統
Memos YARN 資源管理系統負責資源的統一分配和利用,任務排程系統可以執行不同的排程策略來並行排程任務
Mesos Master實現資源的統一分配和管理,排程框架可以並行排程任務。其使用DRF演算法來實現對不同型別作業的不同資源需求公平分配。該演算法的核心思想是在資源型別多樣的環境下,一個作業的資源分配量由作業的主導份額資源決定,主導份額資源是作業請求的各型別資源中佔據資源量最大的一種資源。
共享式排程系統
Kubernetes 支援使用不同的排程框架執行不同型別的任務,它的核心是共享狀態。為了提高排程系統的併發性和可擴充套件性,共享式排程系統使用樂觀鎖進行併發控制,叢集的相關資訊都增加了版本號,在提交的時候與當前資料的版本號進行對照,若提交的狀態資訊版本號比當前資訊的版本號高,則允許此次提交,否則決絕提交請求,這樣雖然會增加資源請求的衝突機率,但是實際應用證明,系統的整體效能並不會因為這些衝突而整體下降。
k8s的Scheduler排程思想:
通過排程策略(演算法)依次為待排程 Pod 佇列的每一個 Pod 從可用 Node 佇列中選擇一個最合適的作為宿主機。目標節點上的 Kublet 程序通過 API Server 監聽到 Kubernetes 排程器發出的 Pod 繫結事件,然後從 etcd 中獲取對應的 Pod 資源描述檔案,下載 Image 映象,啟動容器,掛載持久化儲存系統。
物理節點的效能指標:
CPU,記憶體,映象下載速度,資料傳輸速度
宿主機需要到 Pod 資源描述檔案指定的網路地址下載 Pod 中所有容器的映象檔案,宿主機與映象儲存系統之間的網路傳輸速度直接關係到 Pod 的啟動速度的快慢;這個問題可以通過搭建私有映象倉庫來解決,但是叢集規模過大還是會存在的。
Pod 中資料是臨時的,當 Pod 銷燬時,其中的資料會丟失,所以 Pod 需要通過資料卷的方式將資料持久化。因此 Pod 在啟動執行後,Pod 還需要掛載持久化儲存系統進行資料的存取,宿主機與持久化儲存之間的資料傳輸速度會直接影響 Pod中執行的應用的 IO 速度。
使用者繫結策略:現在版本應該已經支援很好
搶佔式排程策略:
現在版本通過PriorityClass來實現同一個Node節點內部的Pod物件搶佔。根據 Pod 中執行的作業型別判定各個 Pod 的優先順序,對於高優先順序的 Pod 可以搶佔低優先順序 Pod 的資源。
按照Pod的重啟策略來定義pod優先順序,Always>OnFailure>Never
利用容器資源請求量使用優先順序佇列來進行排序 OnFailure佇列 Never佇列
Always可以搶佔Never OnFailure資源,依次回收低優先順序的Pod物件資源直到宿主機資源滿足Always的資源請求
OnFailure可以搶佔Never資源
動態負載均衡策略
優選策略的設計
物理節點:
各物理節點的資源規格:
ci, mi為cpu以及記憶體的資源配額
各節點的規格係數向量:
分別為cpu以及記憶體的規格係數
第i個節點的資源規格表示為:
叢集的資源規格係數
綜合考慮 CPU、記憶體、映象網路下載速度、持久化儲存網路傳輸速度四方面因素來決定 Pod 的排程目的地。
cpu負載均值:
為第i個節點的cpu規格係數
記憶體負載均值:
叢集映象網路的傳輸均值:
叢集資料網路的傳輸均值:
第i個物理節點的得分:
利用均值與節點值的比值作為節點的衡量分數,當該比值越大時表示該節點越低於平均效能,即節點的效能越優。節點相對於叢集整體的相對負載情況。
權值因子:
節點的綜合得分:
負載佇列的實現
建立高負載佇列以及低負載佇列,得分大於 0 的表示綜合負載相對於叢集較空閒,儲存在低負載佇列,小於 0 表示綜合負載相對於叢集較重,儲存在高負載佇列。通過週期檢測叢集的負載情況,將負載較高的節點的一些 Pod 遷移到負載較低的節點上,以保證叢集的負載均衡。利用二叉堆來實現,也可以通過紅黑樹來實現。
動態控制流程
總體排程演算法的設計:
動態排程的具體實現:
演算法的負載均衡度的衡量:
總結一下:
同一個Node節點內部實行搶佔式排程 根據pod重啟策略來定製優先順序 優先順序高可以搶佔優先順序低的資源
不同Node節點執行動態排程,衡量每個Node節點分數,建立高負載佇列以及低負載佇列,然後將高負載佇列的pod物件遷移到低負載佇列以此來實現資源的均衡利用。
參考論文:
[1]唐瑞. 基於Kubernetes的容器雲平臺資源排程策略研究[D].電子科技大學,2017. |