kubernetes调度组件kube-scheduler源码分析

kubernetes调度组件kube-scheduler源码分析
1.调度流程图
kubernetes调度组件kube-scheduler源码分析_第1张图片

2 默认调度算法介绍

kubernetes调度组件kube-scheduler源码分析_第2张图片

3 数据结构

func  main() {

    runtime.GOMAXPROCS(runtime.NumCPU())

    s:=options.NewSchedulerServer()

    s.AddFlags(pflag.CommandLine)

    util.InitFlags()

    util.InitLogs()

    defer util.FlushLogs()

    verflag.PrintAndExitIfRequested()

    app.Run(s)

}

主函数首先构建并初始化schedulerserver结构体,下面来看看主要数据结构

调度可以分成两个部分,第一部分是调度算法部分,第二部分是调度执行部分。


genericScheduler 调度执行部分的数据结构


type genericScheduler struct{

    cacheschedulercache.Cache

    predicates map[string]algorithm.FitPredicate

    prioritizers []algorithm.PriorityConfig

    extenders []algorithm.SchedulerExtender

    pods algorithm.PodLister

    random *rand.Rand

    random Locksync.Mutex

    lastNodeIndex uint64

}

FitPredicate函数用来在Node中判断POD请求的资源是否满足需要。

type PriorityConfig struct{

    Function  PriorityFunction

    Weight  int

}

PriorityConfig结构体包括Function函数和Weight整型变量,Function函数用来表示预测算法,Weight变量用来表示预测算法权重。

genericSchedulerSchedule是负责调度的函数,里面用到了findNodesThatFitPrioritizeNodes两个函数。

4 执行流程

1、新建schedulerserver结构体


2、传入参数并初始化


run


1、通过kubeconfig创建kubeclient用于访问APIserver


2、创建htttpserver用于性能分析,性能指标度量


3、创建scheduler.config对象(定期获取已经调度的pod列表,并从modeler假定队列中删除。监控可用的node,获取service列表、


创建genericScheduler对象)


4run不停执行scheduleOne(获取下一个待调度的pod,具体由genericScheduler调度)


kubernetes调度通过结构体genericScheduler最后选取出了一个Node,但是在这个node上面创建pod的工作并没有做。 


5Binding,这个结构体的作用是建立将一个对象绑定到另一个对象的关系,比如在调度过程中将POD绑定到一个Node上,在这个

结构体中就是将ObjectMetaPOD)绑定到ObjectReferenceNode)上。

type Binding struct{

    unversioned.TypeMeta`json:",inline"`

    //ObjectMetadescribestheobjectthatisbeingbound.

    ObjectMeta`json:"metadata,omitempty"`

    //Targetistheobjecttobindto.

    TargetObjectReference`json:"target"`

}

在建立好PODNode的绑定关系后,执行bindAction函数

6、把调度结果放入假定调度队列中。




你可能感兴趣的:(kubernetes)