一 Scheduler原理 1.1 原理解析 Kubernetes Scheduler是負責Pod調度的重要功能模塊,Kubernetes Scheduler在整個系統中承擔了“承上啟下”的重要功能,“承上”是指它負責接收Controller Manager創建的新Pod,為其調度至目標Node;“ ...
一 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為節點的記憶體大小。