Kubernetes Scheduler 提供的調度流程分三步:
- 預選策略(predicate) 遍歷nodelist,選擇出符合要求的候選節點,Kubernetes內置了多種預選規則供用戶選擇。
- 優選策略(priority) 在選擇出符合要求的候選節點中,采用優選規則計算出每個節點的積分,最后選擇得分最高的。
- 選定(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 節點上有所需要的鏡像既得分,所需鏡像越多得分越高。(根據已有鏡像體積大小之和)