二十、调度器、预选策略以及优选函数

1.调度过程简介

在这里插入图片描述

Scheduler的调度算法是可以自定义的,默认是default Scheduler
当用户请求向api-server创建pod的时候,检查权限等等都没有任何问题的情况下,接下来他会把请求交给Scheduler,由Scheduler从众多节点当中选择一个适用、匹配的节点,来作为接下来运行此Pod的节点,选择结果并不是直接反应在节点之上,而是会告诉api-server,并把结果记录在etcd中,这个结果会在一段时间内成为一个持久的状态,如果节点不发生故障,Pod不会因为资源紧缺而被omkill或者驱逐的话,这个Pod资源将一直在这个节点上运行,哪怕重启也在此节点,这也是存储在etcd中持久存储的目的。由api-server指挥着被选中节点的kubelet,或者说kubelet一直wach着api-server中与当前
节点相关联的事件变动,如果scheduler调度的结果已经被api-server输出出来,那么这个节点的kubelet一定可以wach到跟这个节点相关联的资源变动状态。因此,这个节点就要尝试着获取到api-server中定义这个Pod的配置清单也就是规范和模板,根据配置清单来创建这个Pod,而Pod是运行容器的,要根据镜像拉取策略,要根据仓库位置,获取到本地以后根据镜像创建容器,这些是kubelet完成的任务。

Service并不是真实存在的,他只是对应节点上对应iptables和ipvs的规则,创建service对象的时候一样要提交给api-server,检查和认证要授权等机制,创建完成以后也要存储在etcd中,能够跟etcd打交道的只有api-server,kube-proxy会监控着跟servier相关联的变动,来创建相对应的iptables和ipvs规则

无论是kubelet和kube-proxy都要连接至api-server获取某些资源定义,而api-server不是所有人都可以访问,要做认证授权、准入控制的检查,所以kubelet和kube-proxy可以说是api-server的客户端,中间在传输的时候也要做内部数据序列化,序列化方案是json。

2.预选策略(Predicate)

在这里插入图片描述

Predicate(预选)三种状态:当前占用、资源需求、资源限额
预选过程定义:从所有的节点当中,去排除那些完全不能符合对应pod的基本运行要求的节点
https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/algorithm/predicates/predicates.go
预选策略: 
CheckNodeCondition:  检查节点是否正常
GeneralPredicates 
HostName:      检查Pod对象是否定义了pod.spec.hostname, 
PodFitsHostPorts:pods.spec.containers.ports.hostPort 表示绑定在节点的x个端口上,如果节点端口被占用,那么就不满足
MatchNodeSelector:pods.spec.nodeSelector 
PodFitsResources:检查Pod的资源需求是否能被节点所满足; 
NoDiskConflict:检查Pod依赖的存储卷是否能满足需求;(例如有pod要挂载nfs,但是部分节点不满足nfs需求)默认不启用 
PodToleratesNodeTaints:检查Pod上的spec.tolerations可容忍的污点是否完全包含节点上的污点; 
PodToleratesNodeNoExecuteTaints: 是检查pod的容忍污点是否能接纳NoExecute的污点,举个例子就是说一开始pod容忍污点然后调度到某节点,然后即使节点修改污点,pod也不会离开,但是加NoExecute污点,pod如果无法容忍会被驱离
CheckNodeLabelPresence: 根据标签是否存在是否接受调度此节点(默认关闭)
CheckServiceAffinity:      将相同service的pod尽可能地放在一起(默认关闭)
MaxEBSVolumeCount 
MaxGCEPDVolumeCount 
MaxAzureDiskVolumeCount 
CheckVolumeBinding: 
NoVolumeZoneConflict:     给定的区域限之中检查存储卷冲突
CheckNodeMemoryPressur 检查内存节点是否存在压力(内存压力过大就不符合要求)
CheckNodePIDPressure    检查节点pid数量资源压力过大
CheckNodeDiskPressure    检查节点磁盘IO是否过高
MatchInterPodAffinity      检查节点是否满足POD是否满足亲和或者反亲和(需要自己定义)

注意:预选是一票否决的方式,满足所有的才可以通过

3优选(Priority)

含义:计算基于一系列的算法函数,把每一个节点的数据输入进去计算优先级,计算完以后,在排序,取得分最高的,就是我们最佳匹配的节点
https://github.com/kubernetes/kubernetes/tree/master/pkg/scheduler/algorithm/priorities


优先函数: 
LeastRequested: 由节点的空闲资源与节点的总容量来比较一个比值 根据空闲比例来评估
(cpu((capacity-sum(requested))*10/capacity)+memory((capacity-sum(requested))*10/capacity))/2 
BalancedResourceAllocation:CPU和内存资源被占用率相近的胜出
NodePreferAvoidPods:  优先级较高,根据节点是否由注解信息来判定
节点注解信息“scheduler.alpha.kubernetes.io/preferAvoidPods” 
TaintToleration:将Pod对象的spec.tolerations列表项与节点的taints列表项进行匹配度检查,匹配条目越多,得分越低; 
SeletorSpreading: 把同一个标签选择器的pod散开至多个节点
InterPodAffinity:  匹配项越多得分越高   
NodeAffinity:    节点亲和型
MostRequested: 跟LeastRequested相反,空闲越小的分越高,尽可能把一个节点资源用完(默认关闭)
NodeLabel: 根据节点是否有标签(默认关闭)
ImageLocality:根据满足当前Pod对象需求的已有镜像的体积大小之和 (默认关闭)

注意:所有开启的函数做评分,评分相加,最高者为胜,如果评分相同那么就随机选择

4.选定(Select)

将从优选步骤选出的节点绑定,如果由多个节点,那么就随机取一个即可

猜你喜欢

转载自blog.csdn.net/qq_26489043/article/details/112506502