k8s-scheduler原理分析

scheduler在整个系统中承担了承上启下的重要功能,承上是指它负责接收controller manager创建新的Pod,为其安排一个落脚的目标Node,启下是指安置工作完成后,目标Node上的kubelet服务进程接管后继工作。

也就是说scheduler的作用是通过调度算法为待调度Pod列表上的每一个Pod从Node列表中选择一个最合适的Node。

k8s scheduler当前提供的默认调度流程分为两步

1.预选调度过程,即遍历所有目标Node,筛选出符合要求的候选节点,为了,k8是内置了多种预选策略供用户选择。

2.确定最优节点,在第一步的基础上,采用优选策略(xxx priority)计算出每个候选节点的积分,积分最高者胜出。

调度流程的具体实现是通过插件方式加载的调度算法提供者(algorithmProvider),一个algorithmProvider其实就包含了一组预算策略与一组优先选择策略的结构体,注册algorithmProvider的函数如下:

func RegisterAlgorithmProvider(name string, predicateKeys, priorityKeys)

包含三个参数,第一个参数是算法名,第二个参数为算法用到的预选策略集合,第三个为优选策略集合。

可用的预选策略包含:NoDiskConflict、PodFitsResources,PodSelectorMatches,PodFItsHost等。

其默认的algorithmProvider加载的预选策略Predicate包括:PodFItsHost,PodFitsResources,NoDiskConflict,MatchNodeSelector和Hostname。

也就是说只有每个节点通过这五个默认预选策略后,才能初步选中,进入下一个流程,也就是优选流程。

下面列出所有预选策略的详细说明:

1.NoDiskConflict

判断备选Pod的GCEPresidentDisk(谷歌云)或AWSElasticBlockStore(亚马逊云)和备选节点中已存在的Pod是否存在冲突。如果检查完备选Pod的所有volume与备选节点上的pod的每个volume均为发现冲突,则返回true,表明不存在冲突。反馈给调度器该备选节点适合备选的Pod。


2.PodFitsResource

判断备选节点的资源是否满足备选Pod的需求。

若备选pod和节点中已存在Pod的所有容器的需求资源的总和超过了备选节点拥有的资源,则返回flase,否则true。


3.PodsSelectorMatches

判断备选节点是否包含备选Pod的标签选择器指定的标签。

如果pod没有指定spec.nodeSelector标签选择器,则返回true。

否则,获得备选节点的标签信息,判断节点是否包含备选Pod的标签选择器所指定的标签。若包含则返回true,否则false。


4.PodFitsHost

判断备选Pod的spec.nodename所指定的节点名称与备选节点名称是否一致,若一致,则返回true,否则false。


5.checkNodeLabelPresence

如果用户在配置文件汇总指定了该策略,则scheduler会通过RegisterCustomFitPredicate方法注册该策略,该策略用于判断策略列出的标签在备选节点中存在时,是否选择该备份节点。

首先读取备份节点的标签列表信息

如果策略配置的标签列表存在于备选节点的标签列表中,且策略配置的presence值为false,则返回false,否则返回true;如果策略配置的标签列表不存在于备份节点的标签列表中,且策略配置的presence值为true,则返回false,否则返回true。


6.PodFitsPorts

判断备选pod所用的端口列表中的端口是否在备选节点中已被占用,如果被占用,则返回false,否则返回true。


以上是scheduler的预选策略,那么优选策略包含:LeastRequestdPriority,CalculateNodeLabelPriority和BalancedResourceAllocation等。每个节点通过优选策略时都会计算出一个得分,计算各项得分,最终选出分值最大的节点作为结果。

下面是对所有优选策略的详细说明

1.LeastRequestdPriority

该优选策略用于从备选节点列表中选出资源消耗最小的节点。

首先计算出所有备选节点上运行的Pod和备选Pod的CPU占用量totalmilliCPU

然后计算出所有备选节点上运行的Pod和备选Pod的内存占用量totalMemory

然后计算出每个节点的得分即可。规则大致如下

NodeCpuCapacity为节点CPU计算能力,NodeMemoryCapacity为节点内存大小。

score=int(((nodeCpuCapacity-totalmilliCPU)*10)/ NodeCpuCapacity+ ((NodeMemoryCapacity-

totalMemory)*10)/NodeMemoryCapacity)/2)


2.CalculateNodeLabelPriority

如果用户在配置文件中指定了该策略,则scheduler会通过RegisterCustomPriorityFunction方法注册该策略,该策略用于判断策略列出的标签在备选节点中存在时,是否选择该备选节点。

若备选节点的标签在优选策略的标签列表中且优选策略的presence值为true,或者备选节点的标签不在优选策略的标签列表中且优选策略的presence值为false,则备选节点score=10,否则为0。


3.BalancedResourceAllocation

该优选策略用于从备选节点列表中选出各项资源使用率最为均衡的节点。

首先计算出所有备选节点上运行的Pod和备选Pod的CPU占用量totalmilliCPU

计算出计算出所有备选节点上运行的Pod和备选Pod的内存占用量totalMemory

计算得分,规则如下:

NodeCpuCapacity为节点CPU计算能力,NodeMemoryCapacity为节点内存大小。

score=int(10-math.abs(totalmilliCPU/NodeCpuCapacity - totalMemory/NodeMemoryCapacity)*10)



转载于:https://www.cnblogs.com/sichenzhao/p/9320110.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值