pod调度分为3个步骤
- 预选过程(Predicate): 排除不符合pod要求的节点
- 优选过程(Priority): 根据 优先级找出最佳匹配的节点
- 选择(Select)
预选阶段策略Predicate
主要是分为三类
###GeneralPredicates类型
GeneralPredicates
- HostName : 检查pod对象是否定义了
pod.spec.hostname
- PodFitsHostPorts:
pod.spec.containers.ports.hostPort
- MatchNodeSelector:
pod.spec.nodeSelector
- PodFitsResources: 检查pod资源能否被节点所满足 查看节点的资源可以用
kubectl describe nodes NODE_NAME
- HostName : 检查pod对象是否定义了
###与Volume相关的过滤规则
- NoDiskConflict: 检查pod依赖的存储卷是否满足需求
- PodToleratesNodeTaints: 检查pod上
sepc.tolerations
可容忍的污点是否完全包含节点上的污点 - PodToleratesNodeNoExecuteTaints: 此策略默认不启用 , 比如pod早调度完之后 , node的污点改了, 变成了pod不能接受的污点 , 这个时候要不要继续在这个node上 , 此策略是 如果出现了不能容忍的污点就调度出去 , 默认的情况是不调度, 即pod调度完成之后 node的污点改成了自己不能接受的 , 也不会再调度出去了
- MaxEBSVolumeCount
- MaxGCEPDVolumeCount
- MaxAzureDiskVolumeCount
- MaxCSIVolumeCountPred
- NoVolumeZoneConflict
###与宿主机相关的过滤规则
- CheckNodeMemoryPressure
- CheckNodeDiskPressure
- CheckNodeLabelPresence: 默认不启用
- CheckNodePIDPressure
- CheckNodeCondition
- MatchInterPodAffinity
- CheckServiceAffinity
优选阶段策略Priority
具体地址: https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler/algorithm/priorities
Priority阶段主要是为过滤后的node节点打分
下述1-7 是默认启用的
least_requested
(cpu((capacity-sum(requested))10/capacity) + memory((capacity-sum(requested))10/capacity))/2
balanced_resource_allocation
cpu和内存资源被占用率相近的胜出
node_prefer_avoid_pods
根据节点注释信息
scheduler.alpha.kubernetes.io/preferAvoidPods
评估优先级 , 如果没有这个注解信息 , 则得分为10 , 权重为10000 , 没有这个注解适合运行, 有这个注解的话 , 则不能运行在这个节点上taint_toleration
讲pod对象的
spec.tolerations
列表项和node的taints列表项匹配 , 匹配越多 , 得分越低selector_spreading
node上的pod越多 得分越低 (是同pod 同一个标签的pod , 这个策略顾名思义)
interpod_affinity
匹配到的匹配项越多 得分越高
node_affinity
越亲和 得分越高
most_requested
空闲资源越低的 得分越高 同least_requested相反 目的是尽可能把一个节点上的资源先用完
node_label
有标签就得分
image_locality
node上有满足pod需求的镜像就得分 , 根据镜像体积大小之和来算 得分高胜出 , 而不是根据镜像的数量