1. 程式人生 > 程式設計 >Kubernetes 核心元件之 Scheduler 分析

Kubernetes 核心元件之 Scheduler 分析

scheduler 的作用

將待排程的 POD (API 新建立的 POD,Controller manager 為補足副本而建立的 POD 等) 按照特定的排程演演算法和排程策略繫結(Binding) 到叢集中某個合適的NODE,上並將資訊寫入etcd 中,在排程過程中涉及三個物件,待排程 POD 列表,可用 Node 列表 以及 排程演演算法和策略。

Scheduler 流程

image.png

預設排程流程如下:

  1. 預選排程:遍歷所有目標 Node, 篩選出符合要求的節點。
  2. 優選排程:確定最優節點,在第一步的基礎上,採用優選策略(xxx Priority)計算出每個候選節點的積分, 積分最好的生出。

Scheduler 排程流程通過外掛方式載入的排程演演算法提供者(AlgorithmProvider)具體實現。一個AlgorithmProvider 包含一組預選排程策略與一組優選策略

預算策略說明

NoDiskConflict

判斷備選 pod 的GcePersistentDisk 或 AwsElasticBlockStore 和備選的節點中已存在的pod 是否存在衝突。

  1. 首選讀取備選pod的所有volume值(pod.spec.volumes), 對每個Volume執行以下衝突檢測
    1. 如果Volume 是GcePersistentDisk, 則將Volume 和備選節點上的所有 Pod 的每個Volume 進行比較, 如果發現相同的GcePersistentDisk, 則返回false, 如果該Volume 是 AwsElasticBlockStore , 則將Volume 和備選節點所有 pod 的每個Volume 進行比較, 如果發現相同的的 AwsElasticBlockStore , 返回false。
    2. 如果均未發現衝突,返回true。

PodFitsResources

判斷備選節點資源是否滿足 Pod 需求

  1. 計算備選 Pod 和節點中已存在的 Pod 的所有容器的資源需求(cpu 記憶體)的總和
  2. 獲得備選幾點的狀態資訊,其中包含節點資源資訊。
  3. 如果資源不滿足則返回false, 如果滿足返回true

PodSelectorMatches

判斷備選節點是否包含備選 Pod 的標籤選擇器指定的標籤。

  1. 如果pod 沒有指定 spec.nodeSelector ,則返回true

  2. 如果pod 有指定 spec.nodeSelector, 則判斷節點是否包含 pod 指定的標籤, 如果有就返回true 否則返回 false

PodFirstHost

判斷備選 Pod 的 spec.nodeName 所指定的節點名稱和備選節點的名稱是否一致,一致返回true 否則返回 false

CheckNodeLabelPresence

如果使用者在配置檔案中指定了該策略, Scheduler 會通過 RegisterCustomFitPredicate 方法註冊該策略。 該策略用於判斷策略列出的標籤在備選節點中存在時,是否選擇該節點。

  1. 讀取備選節點中的標籤列表
  2. 如果策略配置的標籤列表在備選節點的標籤列表中,且策略配置的Presence為false,則返回false ,否則返回true; 如果策略配置的標籤列表在備選節點的標籤列表中不存在,Presence 的值為true, 則返回false, 否則返回true

CheckServiceAffinity

如果使用者在配置檔案中指定了該策略, Scheduler 會通過 RegisterCustomFitPredicate 方法註冊該策。該策略用於判斷備選節點是否包含策略配置的標籤, 或包含和備選 Pod 在相同 service, Namespace 下的 Pod 所在節點的標籤列表。 如果存在,則返回true,否則返回false

PodFitsPorts

判斷備選 Pod 所用的埠,在備選節點中是否被佔用。如果佔用返回false ,否則返回true

優選策略說明

leastRequestedPriority

從備選節點中選出資源消耗最小的節點

  1. 計算出所有備選節點上執行的 pod 和備選 pod的 cpu 佔用量 totalMilliCPU
  2. 計算出所有備選節點上執行的 pod 和備選 pod的記憶體用量 totalMemory
  3. 計算每個節點的得分,公式為 score=int(((nodeCpuCapcity-totalMilliCpu)*10)/nodeCpuCapacity+()(nodeMemoryCapacity-totalMemory)*10)/ NodeCpuMemory/2)

CalculateNodeLabelPriority

用於判斷策略列出的標籤在備選節點中存在時,是否選擇該節點,如果備選節點上標籤在優選策略標籤列表中存在,且Presence 為true, 或者備選節點上標籤不再優選策略標籤列表中且Presence為false, 則備選節點score=10 否則 score=0

BalanceResourceAllocation

選出資源使用率最均勻的節點

  1. 計算備選節點上pod+待分配pod 所佔資源(CPU,MEMORY)的總量
  2. 計算得分,公式為score=int(10-math.Abs(totalMilliCPU/nodeCpuCapacity-totalMemory/nodeMemoryCapacity)*10)