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相对占比最多的宿主机,CPU或者Memory在节点可分配资源中占比越小,说明调度后空闲资源越多。
LeastRequestedPriority
score = (cpu((1-sum(requested)/allocatable)*10) + memory((1-sum(requested)/allocatable)*10))/2
选择调度后各种资源相对占比分配最均衡的节点(计算方差,避免节点上CPU大量分配而Memory大量剩余,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得分高。
参考资料