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 節點上有所需要的鏡像既得分,所需鏡像越多得分越高。(根據已有鏡像體積大小之和)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM