scheduler.New() 定义在kubernetes/pkg/scheduler/scheduler.go
返回一个Scheduler
type Scheduler struct {
config *factory.Config
}
首先先用New传过来的参数替换schedulerOptions默认配置
type schedulerOptions struct {
// 调度器的名字,pod创建的时候可以根据这个名字选择使用哪个调度器,默认值"default-scheduler"
schedulerName string
//
hardPodAffinitySymmetricWeight int32
disablePreemption bool
percentageOfNodesToScore int32
bindTimeoutSeconds int64
}
然后调用factory.NewConfigFactory创建一个factory.Configurator,需要传入一个factory.ConfigFactoryArgs
还有个configFactory,这几个差不都都是参数传进来的几个值,具体还不知道干什么的。先看几个参数吧。
cc.InformerFactory.Core().V1().Nodes() 对应类型 nodeInformer coreinformers.NodeInformer
其中cc.InformerFactory在kubernetes/cmd/kube-scheduler/app/options/options.go中初始化:
c.InformerFactory = informers.NewSharedInformerFactory(client, 0), 创建一个新的factory, 结构体主要为cc.client和informers map[reflect.Type]cache.SharedIndexInformer.
Core()是New了一个新的group, 感觉还是啥没有,还是factory那几个值。
V1()是New了一个v1,返回一个version,还是哪几个值.
Nodes() 传的还是那几个值,返回一个nodeInformer. 最重要的就是保留了factory,然后能够调用nodeInformer接口下的几个方法。后边用的吧。
nodeLister: args.NodeInformer.Lister(),
在NewConfigFactory()里创建configFactory的时候,调用了.Lister()方法。
func (f *nodeInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
return NewFilteredNodeInformer(client, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
}
func (f *nodeInformer) Informer() cache.SharedIndexInformer {
return f.factory.InformerFor(&corev1.Node{}, f.defaultInformer)
}
func (f *nodeInformer) Lister() v1.NodeLister {
return v1.NewNodeLister(f.Informer().GetIndexer())
}
调用太多,看代码最烦的就是调来调去,然后还有各种新数据定义,翻来翻去然后回不来了。。。
corev1.Node 这个里边应该都是返回的数据格式类型定义, 没细看。
看InformerFor里边defaultInformer是个真正调用的函数, InformerFor就是用来包装了一下
v1.NewNodeLister 看起来就是定义的restful api的请求。
看的有点细,其实这部分都是client-go里的,是封装的api请求,应该是分不同资源请求不同的interface
cc.PodInformer 看这个应该比较重要
c.PodInformer = factory.NewPodInformer(client, 0) 用来返回non-terminal状态的pod
configFactory其他初始化参数不看了,后边用到再看。
Read more...
Archive for kubernetes
kubernetes scheduler源码阅读-- kube-scheduler整个流程
代码读的master上最新的 1641ff411.
命令入口文件在kubernetes/cmd/kube-scheduler/scheduler.go
主要就两句,设置启动参数。其他的设置命令行参数和日志打印。具体不看了
command := app.NewSchedulerCommand()
command.Execute();
NewSchedulerCommand 在文件kubernetes/cmd/kube-scheduler/app/server.go
很多代码都是设置scheduler命令参数的,也是用的cobra这个库,跟docker是一样的。
opts, err := options.NewOptions() 读取默认配置
runCommand()执行命令
runCommand 比较有用的几行:
c, err := opts.Config()
这里边东西比较多,比如初始化kube-client与api交互,eventclient,选举相关的配置。没仔细看,代码在kubernetes/cmd/kube-scheduler/app/options/options.go
cc := c.Complete()
stopCh := make(chan struct{}) 这个channel传入了Run函数,Run只会在报异常或者这个channel关闭的时候返回
是用来配合context提示go协程退出的
函数最后调用return Run(cc, stopCh)
Run()
生成一个新的scheduler, sched, err := scheduler.New()
后边启动了事件传输,监控选举的,还有监控和指标收集的,这个先不看了。
再后边就是stopChannel配合context管理协程,还有一个leader选举的功能,是通过cc.LeaderElection参数来控制的.
leader选举功能开启是为了高可用的时候使用
无论是否leader选举,最后都进入sched.Run()
Read more...