Kubernetes 核心元件之 Scheduler 分析
scheduler 的作用
將待排程的 POD (API 新建立的 POD,Controller manager 為補足副本而建立的 POD 等) 按照特定的排程演演算法和排程策略繫結(Binding) 到叢集中某個合適的NODE,上並將資訊寫入etcd 中,在排程過程中涉及三個物件,待排程 POD 列表,可用 Node 列表 以及 排程演演算法和策略。
Scheduler 流程
預設排程流程如下:
- 預選排程:遍歷所有目標 Node, 篩選出符合要求的節點。
- 優選排程:確定最優節點,在第一步的基礎上,採用優選策略(xxx Priority)計算出每個候選節點的積分, 積分最好的生出。
Scheduler 排程流程通過外掛方式載入的排程演演算法提供者(AlgorithmProvider)具體實現。一個AlgorithmProvider 包含一組預選排程策略與一組優選策略
預算策略說明
NoDiskConflict
判斷備選 pod 的GcePersistentDisk 或 AwsElasticBlockStore 和備選的節點中已存在的pod 是否存在衝突。
- 首選讀取備選pod的所有volume值(pod.spec.volumes), 對每個Volume執行以下衝突檢測
- 如果Volume 是GcePersistentDisk, 則將Volume 和備選節點上的所有 Pod 的每個Volume 進行比較, 如果發現相同的GcePersistentDisk, 則返回false, 如果該Volume 是 AwsElasticBlockStore , 則將Volume 和備選節點所有 pod 的每個Volume 進行比較, 如果發現相同的的 AwsElasticBlockStore , 返回false。
- 如果均未發現衝突,返回true。
PodFitsResources
判斷備選節點資源是否滿足 Pod 需求
- 計算備選 Pod 和節點中已存在的 Pod 的所有容器的資源需求(cpu 記憶體)的總和
- 獲得備選幾點的狀態資訊,其中包含節點資源資訊。
- 如果資源不滿足則返回false, 如果滿足返回true
PodSelectorMatches
判斷備選節點是否包含備選 Pod 的標籤選擇器指定的標籤。
-
如果pod 沒有指定 spec.nodeSelector ,則返回true
-
如果pod 有指定 spec.nodeSelector, 則判斷節點是否包含 pod 指定的標籤, 如果有就返回true 否則返回 false
PodFirstHost
判斷備選 Pod 的 spec.nodeName 所指定的節點名稱和備選節點的名稱是否一致,一致返回true 否則返回 false
CheckNodeLabelPresence
如果使用者在配置檔案中指定了該策略, Scheduler 會通過 RegisterCustomFitPredicate 方法註冊該策略。 該策略用於判斷策略列出的標籤在備選節點中存在時,是否選擇該節點。
- 讀取備選節點中的標籤列表
- 如果策略配置的標籤列表在備選節點的標籤列表中,且策略配置的Presence為false,則返回false ,否則返回true; 如果策略配置的標籤列表在備選節點的標籤列表中不存在,Presence 的值為true, 則返回false, 否則返回true
CheckServiceAffinity
如果使用者在配置檔案中指定了該策略, Scheduler 會通過 RegisterCustomFitPredicate 方法註冊該策。該策略用於判斷備選節點是否包含策略配置的標籤, 或包含和備選 Pod 在相同 service, Namespace 下的 Pod 所在節點的標籤列表。 如果存在,則返回true,否則返回false
PodFitsPorts
判斷備選 Pod 所用的埠,在備選節點中是否被佔用。如果佔用返回false ,否則返回true
優選策略說明
leastRequestedPriority
從備選節點中選出資源消耗最小的節點
- 計算出所有備選節點上執行的 pod 和備選 pod的 cpu 佔用量 totalMilliCPU
- 計算出所有備選節點上執行的 pod 和備選 pod的記憶體用量 totalMemory
- 計算每個節點的得分,公式為
score=int(((nodeCpuCapcity-totalMilliCpu)*10)/nodeCpuCapacity+()(nodeMemoryCapacity-totalMemory)*10)/ NodeCpuMemory/2)
CalculateNodeLabelPriority
用於判斷策略列出的標籤在備選節點中存在時,是否選擇該節點,如果備選節點上標籤在優選策略標籤列表中存在,且Presence 為true, 或者備選節點上標籤不再優選策略標籤列表中且Presence為false, 則備選節點score=10 否則 score=0
BalanceResourceAllocation
選出資源使用率最均勻的節點
- 計算備選節點上pod+待分配pod 所佔資源(CPU,MEMORY)的總量
- 計算得分,公式為
score=int(10-math.Abs(totalMilliCPU/nodeCpuCapacity-totalMemory/nodeMemoryCapacity)*10)