kube-scheduler预选和优选流程

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 = (1 - variance(cpuFraction,memoryFraction,volumeFraction))*10

这里volumeFraction是Pod使用的需要attach卷数量/节点上可以attach的卷总量,该特性开关默认是false,k8s 1.22版本废弃

https://v1-22.docs.kubernetes.io/zh/docs/reference/command-line-tools-reference/feature-gates/

pkg/features/kube_features.go
defaultKubernetesFeatureGates map定义

在BalanceAttachedNodeVolumes特性默认没有开启情况下,计算cpu和内存占比差值取绝对值,类似于方差

pkg/scheduler/algorithm/priorities/balanced_resource_allocation.go
balancedResourceScorer函数

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

参考资料

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

 

posted on 2023-06-10 17:07  王景迁  阅读(39)  评论(0编辑  收藏  举报

导航