2 默认调度算法介绍
3 数据结构
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变量用来表示预测算法权重。
genericScheduler中Schedule是负责调度的函数,里面用到了findNodesThatFit和PrioritizeNodes两个函数。
4 执行流程
1、新建schedulerserver结构体
2、传入参数并初始化
run
1、通过kubeconfig创建kubeclient用于访问APIserver
2、创建htttpserver用于性能分析,性能指标度量
3、创建scheduler.config对象(定期获取已经调度的pod列表,并从modeler假定队列中删除。监控可用的node,获取service列表、
创建genericScheduler对象)
4、run不停执行scheduleOne(获取下一个待调度的pod,具体由genericScheduler调度)
kubernetes调度通过结构体genericScheduler最后选取出了一个Node,但是在这个node上面创建pod的工作并没有做。
5、Binding,这个结构体的作用是建立将一个对象绑定到另一个对象的关系,比如在调度过程中将POD绑定到一个Node上,在这个
结构体中就是将ObjectMeta(POD)绑定到ObjectReference(Node)上。
type Binding struct{
unversioned.TypeMeta`json:",inline"`
//ObjectMetadescribestheobjectthatisbeingbound.
ObjectMeta`json:"metadata,omitempty"`
//Targetistheobjecttobindto.
TargetObjectReference`json:"target"`
}
在建立好POD同Node的绑定关系后,执行bindAction函数
6、把调度结果放入假定调度队列中。