一 Scheduler原理
1.1 原理決議
Kubernetes Scheduler是負責Pod調度的重要功能模塊,Kubernetes Scheduler在整個系統中承擔了“承上啟下”的重要功能,“承上”是指它負責接收Controller Manager創建的新Pod,為其調度至目標Node;“啟下”是指調度完成后,目標Node上的kubelet服務行程接管后繼作業,負責Pod接下來生命周期, Kubernetes Scheduler的作用是將待調度的Pod(API新創建的Pod、Controller Manager為補足副本而創建的Pod等)按照特定的調度演算法和調度策略系結(Binding)到集群中某個合適的Node上,并將系結資訊寫入etcd中, 在整個調度程序中涉及三個物件,分別是待調度Pod串列、可用Node串列,以及調度演算法和策略, 概述而言,就是通過調度演算法調度為待調度Pod串列中的每個Pod從Node串列中選擇一個最適合的Node,隨后,目標節點上的kubelet通過API Server監聽到Kubernetes Scheduler產生的Pod系結事件,然后獲取對應的Pod清單,下載Image鏡像并啟動容器, 完整的流程如下圖示:
Kubernetes Scheduler當前提供的默認調度流程分為以下兩步: 預選調度程序,即遍歷所有目標Node,篩選出符合要求的候選節點,為此,Kubernetes內置了多種預選策略(xxx Predicates)供用戶選擇, 確定最優節點,在第1步的基礎上,采用優選策略(xxx Priority)計算出每個候選節點的積分,積分最高者勝出,Kubernetes Scheduler的調度流程是通過插件方式加載的“調度演算法提供者”(AlgorithmProvider)具體實作的,
二 Scheduler策略
2.1 策略種類
一個AlgorithmProvider其實就是包括了一組預選策略與一組優先選擇策略的結構體, Scheduler中可用的預選策略包含:NoDiskConflict、PodFitsResources、PodSelectorMatches、PodFitsHost、CheckNodeLabelPresence、CheckServiceAffinity和PodFitsPorts策略等, 其默認的AlgorithmProvider加載的預選策略Predicates包括:PodFitsPorts(PodFitsPorts)、PodFitsResources(PodFitsResources)、NoDiskConflict(NoDiskConflict)、MatchNodeSelector(PodSelectorMatches)和HostName(PodFitsHost),即每個節點只有通過前面提及的5個默認預選策略后,才能初步被選中,進入下一個流程,- NoDiskConflict
- 首先,讀取備選Pod的所有Volume的資訊(即pod.Spec.Volumes),對每個Volume執行以下步驟進行沖突檢測,
- 如果該Volume是gcePersistentDisk,則將Volume和備選節點上的所有Pod的每個Volume都進行比較,如果發現相同的gcePersistentDisk,則回傳false,表明存在磁盤沖突,檢查結束,反饋給調度器該備選節點不適合作為備選Pod;
- 如果該Volume是AWSElasticBlockStore,則將Volume和備選節點上的所有Pod的每個Volume都進行比較,如果發現相同的AWSElasticBlockStore,則回傳false,表明存在磁盤沖突,檢查結束,反饋給調度器該備選節點不適合備選Pod,
- 如果檢查完備選Pod的所有Volume均未發現沖突,則回傳true,表明不存在磁盤沖突,反饋給調度器該備選節點適合備選Pod,
- PodFitsResources
- 計算備選Pod和節點中已存在Pod的所有容器的需求資源(記憶體和CPU)的總和,
- 獲得備選節點的狀態資訊,其中包含節點的資源資訊,
- 如果在備選Pod和節點中已存在Pod的所有容器的需求資源(記憶體和CPU)的總和,超出了備選節點擁有的資源,則回傳false,表明備選節點不適合備選Pod,否則回傳true,表明備選節點適合備選Pod,
- PodSelectorMatches
- 如果Pod沒有指定spec.nodeSelector標簽選擇器,則回傳true,
- 否則,獲得備選節點的標簽資訊,判斷節點是否包含備選Pod的標簽選擇器(spec.nodeSelector)所指定的標簽,如果包含,則回傳true,否則回傳false,
- PodFitsHost
- CheckNodeLabelPresence
- 讀取備選節點的標簽串列資訊,
- 如果策略配置的標簽串列存在于備選節點的標簽串列中,且策略配置的presence值為false,則回傳false,否則回傳true;
- 如果策略配置的標簽串列不存在于備選節點的標簽串列中,且策略配置的presence值為true,則回傳false,否則回傳true,
- CheckServiceAffinity
- PodFitsPorts
- LeastRequestedPriority
- 計算出在所有備選節點上運行的Pod和備選Pod的CPU占用量totalMilliCPU,
- 計算出在所有備選節點上運行的Pod和備選Pod的記憶體占用量totalMemory,
- 計算每個節點的得分,計算規則大致如下,其中,NodeCpuCapacity為節點CPU計算能力,NodeMemoryCapacity為節點記憶體大小,
- CalculateNodeLabelPriority
- BalancedResourceAllocation
- 計算出在所有備選節點上運行的Pod和備選Pod的CPU占用量totalMilliCPU,
- 計算出在所有備選節點上運行的Pod和備選Pod的記憶體占用量totalMemory,
- 計算每個節點的得分,計算規則大致如下,其中,NodeCpuCapacity為節點的CPU計算能力,NodeMemoryCapacity為節點的記憶體大小,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/125315.html
標籤:Linux
