如果想要了解調度器中各預選、優選算法的具體實現,可看hutao的源碼解析:https://github.com/daniel-hutao/k8s-source-code-analysis
自定義調度器
修改pod的spec.schedulerName為自定義調度器名稱如my-scheduler,那么default-scheduler就會忽略這個pod,此時自己實現的調度器就可以不斷的從api-server中獲取spec.schedulerName為my-scheduler的pod,並根據具體邏輯選擇合適的節點,最終將pod的spec.nodeName設置為選擇的節點,並更新etcd
默認調度器中的調度算法分為預選和優選
預選策略
1.基礎的檢查項(GeneralPredicates)
PodFitsResources node剩余可分配資源(Allocatable-sum(request))是否足夠pod調度
PodFitsHost node的名稱是否跟pod的spec.nodeName字段一致
PodFitsHostPorts pod指定的spec.nodePort端口在待考察node上是否已被占用
PodMatchNodeSelector pod的nodeSelector或者nodeAffinity指定的節點是否與待考察節點匹配
2.Volume相關:
NoDiskConflict 待調度pod聲明使用的Volume是否與待考察node上的已有pod聲明掛載的Volume有沖突(AWS EBS類型的Volume,是不允許被兩個Pod同時使用的)
MaxPDVolumeCountPredicate node上某種類型的持久化Volume是不是已經超過了一定數目
VolumeZonePredicate pod聲明使用的Volume的Zone(高可用域)標簽是否與待考察節點的Zone標簽相匹配
VolumeBindingPredicate Pod對應的pvc所綁定的pv的nodeAffinity字段,是否跟某個節點的標簽相匹配(LPV的延遲綁定機制)
3.Node相關:
CheckNodeCondition:校驗節點是否准備好被調度,校驗node.condition的condition type :Ready為true和NetworkUnavailable為false以及Node.Spec.Unschedulable為false
PodToleratesNodeTaints pod是否能夠容忍待考察節點的污點
NodeMemoryPressurePredicate 待考察節點的內存是不是已經不夠充足
4. Pod相關:
PodAffinityPredicate 檢查待調度Pod與Node上的已有Pod之間的親密(affinity)和反親密(anti-affinity)關系(pod中配置的spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution屬性)
說明
1.當開始調度一個Pod時,Kubernetes調度器會同時啟動16個Goroutine,來並發地為集群里的所有Node計算Predicates,最后返回可以運行這個Pod的宿主機列表
2.為每個Node執行Predicates時,調度器會按照固定的順序來進行檢查。這個順序,是按照Predicates本身的含義來確定的。比如,宿主機相關的Predicates會被放在相對靠前的位置進行檢查。要不然的話,在一台資源已經嚴重不足的宿主機上,上來就開始計算PodAffinityPredicate,是沒有實際意義的。
優選策略
LeastRequestedPriority 選擇cpu剩余量和memory剩余量的和最多的宿主機,即把 Pod 分到資源空閑率最高的節點上,而非空閑資源最大的節點(相反的是MostRequestedPriority)
score = (cpu((capacity-sum(requested))10/capacity) + memory((capacity-sum(requested))10/capacity))/2
BalancedResourceAllocation 各種資源分配最均衡的那個節點(避免一個節點上CPU被大量分配、而 Memory 大量剩余)
選擇資源Fraction差距最小的節點
Fraction = Pod請求的資源 / 節點上的可用資源
variance = 每兩種資源 Fraction 之間的距離
score = 10 - variance(cpuFraction,memoryFraction,volumeFraction)*10
ServiceSpreadingPriority 同一個service管控下的pod盡量分散在不同的節點
參考文檔
https://kubernetes.io/docs/concepts/scheduling/scheduler-perf-tuning/
http://dockone.io/article/2885
https://www.cnblogs.com/buyicoding/p/12186315.html
騰訊關於動態調度的討論:https://www.infoq.cn/article/wyjT7HApETsiEAMoiL7Z