k8s调度算法源码跟读

栏目: 编程工具 · 发布时间: 5年前

内容简介:简单来说,k8s中的调度算法就是给pod分配合适的node节点,具体分两步:预选、优选。其中预选是指k8s会默认注册一堆预选算法,只有某个节点通过所有预选算法成功运行pod,那么这个节点才能通过预选,进行下一步优选,这样经过预选之后会淘汰一大批节点。接下来的优选就是优中选优,首先让每个节点通过所有优选算法,得到一个加权分,最后取最高分,即为最优节点,也就是最终运行pod的节点。这里主要通读一下调度模块的代码逻辑。接着又注册了5个预选算法:优选:

简单来说,k8s中的调度算法就是给pod分配合适的node节点,具体分两步:预选、优选。其中预选是指k8s会默认注册一堆预选算法,只有某个节点通过所有预选算法成功运行pod,那么这个节点才能通过预选,进行下一步优选,这样经过预选之后会淘汰一大批节点。接下来的优选就是优中选优,首先让每个节点通过所有优选算法,得到一个加权分,最后取最高分,即为最优节点,也就是最终运行pod的节点。这里主要通读一下调度模块的代码逻辑。

  1. scheduler的入口函数所在文件E:\dev\golang\k8s\src\k8s.io\kubernetes\cmd\kube-scheduler\scheduler.go
    k8s调度算法源码跟读

    image.png

    这里面主要是两行代码:37行、47行,获取一个command,然后执行之。其中command是cobra的Command对象。 这里简单介绍一下,Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。许多使用最广泛的 Go 项目都是使用Cobra构建的,其中包括:kubernetes、etcd、 docker 、openshift。
  2. 执行上图中47行代码command.Execute()时,对应command中的Run方法会被执行,即下图中的85行:

    k8s调度算法源码跟读

    image.png

    进一步会执行86行的runCommand方法,该方法会跑起一个scheduler。

  3. 接下来跳进runCommand方法,比较重要的代码如下:
    k8s调度算法源码跟读

    image.png

  4. 继续往下
    k8s调度算法源码跟读

    image.png

  5. 再往下

    k8s调度算法源码跟读

    image.png

    不难发现,在调用ApplyFeatureGates方法之前,会先执行init方法,接下来就是本文的重点。

  6. init函数先是调用registerAlgorithmProvider函数,入参是defaultPredicates()和defaultPriorities(),明显是注册默认的预选、优选算法,我们先关注预选算法默认有哪14个:
NoVolumeZoneConflictPred
MaxEBSVolumeCountPred
MaxGCEPDVolumeCountPred
MaxAzureDiskVolumeCountPred
MaxCSIVolumeCountPred
MatchInterPodAffinityPred
NoDiskConflictPred
GeneralPred
CheckNodeMemoryPressurePred
CheckNodeDiskPressurePred
CheckNodePIDPressurePred
CheckNodeConditionPred
PodToleratesNodeTaintsPred
CheckVolumeBindingPred

接着又注册了5个预选算法:

factory.RegisterFitPredicate("PodFitsPorts", predicates.PodFitsHostPorts)//这个只是为了兼容旧版本,所以仍旧保留,较新的版本已经用PodFitsHostPorts这个名字取代了PodFitsPorts,也就是下面的一个预选算法
factory.RegisterFitPredicate(predicates.PodFitsHostPortsPred, predicates.PodFitsHostPorts)
factory.RegisterFitPredicate(predicates.PodFitsResourcesPred, predicates.PodFitsResources)
factory.RegisterFitPredicate(predicates.HostNamePred, predicates.PodFitsHost)
factory.RegisterFitPredicate(predicates.MatchNodeSelectorPred, predicates.PodMatchNodeSelector)

优选:

factory.RegisterPriorityConfigFactory(
        "ServiceSpreadingPriority",
        factory.PriorityConfigFactory{
            MapReduceFunction: func(args factory.PluginFactoryArgs) (algorithm.PriorityMapFunction, algorithm.PriorityReduceFunction) {
                return priorities.NewSelectorSpreadPriority(args.ServiceLister, algorithm.EmptyControllerLister{}, algorithm.EmptyReplicaSetLister{}, algorithm.EmptyStatefulSetLister{})
            },
            Weight: 1,
        },
    )
factory.RegisterPriorityFunction2("EqualPriority", core.EqualPriorityMap, nil, 1)
factory.RegisterPriorityFunction2("MostRequestedPriority", priorities.MostRequestedPriorityMap, nil, 1)
factory.RegisterPriorityFunction2(
        "RequestedToCapacityRatioPriority",
        priorities.RequestedToCapacityRatioResourceAllocationPriorityDefault().PriorityMap,
        nil,
        1)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具