一、调度器scheduler
1.调度器概览
主要负责pod的绑定和调度,predicate(预选),priority(优选)
调度器的计算逻辑:将机器根据你预选的一些算法排序排除,然后优选的机器丢进数组里,给每个机器的资源可排序能力进行打分,根据打分的情况去进行排序,从上往下取节点,取那个优先级较高的节点。
调度器行为逻辑filter+score(预选优选)把机器丢进数组,然后排序,取index为0的元素实际上实现还是control loop,和控制器差不多
同一个优先级的资源调度完全公平调度平衡,不同作业资源需求不同,资源是多维度的 资源上限,超发超售实例之间和节点/应用相关数据本地化
公平调度:针对于节点,同一个node怎么调度,不同node怎么调度
高效利用:成本上、Qos这两方面看
Qos: 每个调度的pod之间是否有调度的优先级
affinity和anti-affinity:亲和性(两个pod的关联性比较强,两个pod运行在一个节点之上,那么他们运行效率可能会自动化,亲和性可以让这两个pod尽量调度在一个节点上)和反亲和性(两个pod最好不要调度到一个节点上)
2.predicates策略
调度器中的每一个功能对于调度器来说都是一个插件,调度过程中就是一个个遍历插件
每一个因素来说,对于k8s的调度器来说都是一个插件调度的过程其实就是遍历一个个的这样的插件凡是selector出现的时候,就是和label产生关联关系的时候
调度完成之后,把nodename改成你要调度的节点,hostname就是在你调度之前,检查一下哪个域名是hostname所指定的那一个,然后把nodename改成你的节点
一旦发现不可调度的污点,所有的pod在预选阶段将其排除掉,
CheckNodeMemoryPressure:当前节点有一个MemoryPressure的标签,kublet在检测中,当你内存发生积压的时候,就会打一个一个MemoryPressure标签到你的etcd中,当Node有这个标签,pod是不能调度到这个节点上的,这个插件控制你的node允不允许调度到你的pod上面
CheckNodeDiskPressure:节点硬盘存在积压时,会打一个nodeDiskPressure的标签
各个插件匹配的顺序:
3.priorities策略
预选的插件和策略
Tainttolerationpriority:可以对常规性服务打污点(就是你不想让其访问服务的服务),一般情况下在做预选的情况下,就会将这些打了污点的标签就行排除掉,但是如果检测到pod对这个节点可以容忍,这类pod可以正常调度污点,匹配到tainttolerationpriority。
4.资源需求
cpu和内存数从下面取,limits和request是从pod中取
limit和request的不同形成了一个超售的效果
【注】:如果request很大,那他可能就调度不上来了
requests是给调度器用的,limits是给cgroup使用的,根据request信息做调度,会先丢件数组中去一一匹配,然后根据cpu、内存进行匹配所有node的信息,哪个符合哪个就通过,limits>request是超授,资源节点不足时,limit和request就要进行配置,最多它们限制在一起去,不能在做超授了,超授是在资源还有剩余才可以做,通过超授可以将一些实际使用和实际限制不符的资源,进行资源差的匹配,从而让节点调度更多的资源
cgroup比调度器高一点的情况下,可以形成超授,超授情况下可以多调用一些资源,超授比例尽量不超过10%可能会发生源节点om
init container资源需求
和主容器一样,可以定义资源需求
他是顺序执行的,所以遍历的时候,会按照initcontainer和maincontainer的资源需求的最大值来决定的
5.指定node的调度
将pod调度到指定的node上,pod之间的调度
预选和优选的结果实际上是绑定到nodename上,kublet发现这个和自己域名相关,就会发生一个调度的行为,nodeselector把pod定向调度到node上,可以设置一个标签,让你的pod调度到某一列含有标签的node上
always:每次遇到镜像拉取都是从远端拉取
ifNotPresent:如果找不到镜像,才进行拉取
Nerver