kube-scheduler预选和优选流程

发布时间 2023-06-10 17:12:55作者: 王景迁

k8s 1.15.0

预选

GeneralPredicates

计算请求量方式

max(sum_cpu_memory(Containers), max_cpu_memory(InitContainers))
// Pod:
//   InitContainers
//     IC1:
//       CPU: 2
//       Memory: 1G
//     IC2:
//       CPU: 2
//       Memory: 3G
//   Containers
//     C1:
//       CPU: 2
//       Memory: 1G
//     C2:
//       CPU: 1
//       Memory: 1G
//
// Result: CPU: 3, Memory: 3G

PodFitsResources:cpu和memory以及gpu等是否匹配
PodMatchNodeSelector:nodeSelector和nodeAffinity是否匹配

Volume过滤

NoDiskConflict:不同Pod使用的PV是否有冲突
MaxPDVolumeCountPredicate:节点上PV卷数量是否达到上限
VolumeBindingPredicate:PV nodeAffinity是否匹配

宿主机过滤

PodToleratesNodeTaints:Pod是否容忍节点污点
NodeMemoryPressurePredicate:节点内存是否不足

Pod过滤

PodAffinityPredicate:待调度Pod与Node上已有Pod亲和与反亲和

优选

给预选出来的节点打0-10分,得分最高者作为调度节点。

选择空闲CPU和Memory最多的宿主机
LeastRequestedPriority

score = (cpu((allocatable-sum(requested))*10/allocatable) + memory((allocatable-sum(requested))*10/allocatable))/2

选择调度后各种资源分配最均衡的节点(避免节点上CPU大量分配而Memory大量剩余)
BalancedResourceAllocation

fraction=request/allocatable
mean := (cpuFraction + memoryFraction + volumeFraction) / float64(3)
variance := float64((((cpuFraction - mean)^2) + ((memoryFraction - mean)^2) + ((volumeFraction - mean)^2)) / float64(3))
score = 10 - variance(cpuFraction,memoryFraction,volumeFraction)*10

还有 NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority,与 PodMatchNodeSelector、PodToleratesNodeTaints 和 PodAffinityPredicate 类似。Node满足规则数目越多,得分越高。
ImageLocalityPriority:Pod使用镜像大并已存在于Node上,这些Node得分高。

参考资料

42 | Kubernetes默认调度器调度策略解析