1. 程式人生 > >K8S 排程器,預選策略,優選函式

K8S 排程器,預選策略,優選函式

Kubernetes Scheduler 提供的排程流程分三步:

  1. 預選策略(predicate) 遍歷nodelist,選擇出符合要求的候選節點,Kubernetes內建了多種預選規則供使用者選擇。
  2. 優選策略(priority) 在選擇出符合要求的候選節點中,採用優選規則計算出每個節點的積分,最後選擇得分最高的。
  3. 選定(select) 如果最高得分有好幾個節點,select就會從中隨機選擇一個節點。

常用的預選策略(程式碼裡的策略不一定都會被使用)

  • CheckNodeConditionPred 檢查節點是否正常
  • GeneralPred HostName(如果pod定義hostname屬性,會檢查節點是否匹配。pod.spec.hostname)、PodFitsHostPorts(檢查pod要暴露的hostpors是否被佔用。pod.spec.containers.ports.hostPort)
  • MatchNodeSelector pod.spec.nodeSelector 看節點標籤能否適配pod定義的nodeSelector
  • PodFitsResources 判斷節點的資源能夠滿足Pod的定義(如果一個pod定義最少需要2C4G node上的低於此資源的將不被排程。用kubectl describe node NODE名稱 可以檢視資源使用情況)
  • NoDiskConflict 判斷pod定義的儲存是否在node節點上使用。(預設沒有啟用)
  • PodToleratesNodeTaints 檢查pod上Tolerates的能否容忍汙點(pod.spec.tolerations)
  • CheckNodeLabelPresence 檢查節點上的標誌是否存在 (預設沒有啟動)
  • CheckServiceAffinity 根據pod所屬的service。將相同service上的pod儘量放到同一個節點(預設沒有啟動)
  • CheckVolumeBinding 檢查是否可以繫結(預設沒有啟動)
  • NoVolumeZoneConflict 檢查是否在一起區域(預設沒有啟動)
  • CheckNodeMemoryPressure 檢查記憶體是否存在壓力
  • CheckNodeDiskPressure 檢查磁碟IO壓力是否過大
  • CheckNodePIDPressure 檢查pid資源是否過大
    原始碼參考:
    https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go

優選策略

  • least_requested 選擇消耗最小的節點(根據空閒比率評估 cpu(總容量-sum(已使用)*10/總容量) )
  • balanced_resource_allocation 從節點列表中選出各項資源使用率最均衡的節點(CPU和記憶體)
  • node_prefer_avoid_pods 節點傾向
  • taint_toleration 將pod物件的spec.toleration與節點的taints列表項進行匹配度檢查,匹配的條目越多,得分越低。
  • selector_spreading 與services上其他pod儘量不在同一個節點上,節點上通一個service的pod越少得分越高。
  • interpod_affinity 遍歷node上的親和性條目,匹配項越多的得分越高
  • most_requested 選擇消耗最大的節點上(儘量將一個節點上的資源用完)
  • node_label 根據節點標籤得分,存在標籤既得分,沒有標籤沒得分。標籤越多 得分越高。
  • image_locality 節點上有所需要的映象既得分,所需映象越多得分越高。(根據已有映象體積大小之和)