NewSchedulerCommand
kube-scheduler源码分析(一)之 NewSchedulerCommand
以下代码分析基于
kubernetes v1.12.0版本。
scheduler的cmd代码目录结构如下:
kube-scheduler
├── BUILD
├── OWNERS
├── app # app的目录下主要为运行scheduler相关的对象
│ ├── BUILD
│ ├── config
│ │ ├── BUILD
│ │ └── config.go # Scheduler的配置对象config
│ ├── options # options主要记录 Scheduler 使用到的参数
│ │ ├── BUILD
│ │ ├── configfile.go
│ │ ├── deprecated.go
│ │ ├── deprecated_test.go
│ │ ├── insecure_serving.go
│ │ ├── insecure_serving_test.go
│ │ ├── options.go # 主要包括Options、NewOptions、AddFlags、Config等函数
│ │ └── options_test.go
│ └── server.go # 主要包括 NewSchedulerCommand、NewSchedulerConfig、Run等函数
└── scheduler.go # main入口函数1. Main函数
此部分的代码为/cmd/kube-scheduler/scheduler.go
kube-scheduler的入口函数Main函数,仍然是采用统一的代码风格,使用Cobra命令行框架。
核心代码:
此部分的代码为/cmd/kube-scheduler/app/server.go
NewSchedulerCommand主要用来构造和初始化SchedulerCommand结构体,
核心代码:
2.1. NewOptions
NewOptions主要用来构造SchedulerServer使用的参数和上下文,其中核心参数是KubeSchedulerConfiguration。
NewOptions:
2.2. Options.Config
Config初始化调度器的配置对象。
Config函数主要执行以下操作:
构建scheduler client、leaderElectionClient、eventClient。
创建event recorder
设置leader选举
创建informer对象,主要函数有
NewSharedInformerFactory和NewPodInformer。
Config具体代码如下:
2.3. AddFlags
AddFlags为SchedulerServer添加指定的参数。
AddFlags函数的具体代码如下:
3. Run
此部分的代码为/cmd/kube-scheduler/app/server.go
Run运行一个不退出的常驻进程,来执行scheduler的相关操作。
Run函数的主要内容如下:
通过scheduler config来创建scheduler的结构体。
运行event broadcaster、healthz server、metrics server。
运行所有的informer并在调度前等待cache的同步(重点)。
执行
sched.Run()来运行scheduler的调度逻辑。如果多个scheduler并开启了
LeaderElect,则执行leader选举。
以下对重点代码分开分析:
3.1. NewSchedulerConfig
NewSchedulerConfig初始化SchedulerConfig(此部分具体逻辑待后续专门分析),最后初始化生成scheduler结构体。
3.2. InformerFactory.Start
运行PodInformer,并运行InformerFactory。此部分的逻辑为client-go的informer机制,在Informer机制中有详细分析。
3.3. WaitForCacheSync
在调度前等待cache同步。
3.3.1. InformerFactory.WaitForCacheSync
InformerFactory.WaitForCacheSync等待所有启动的informer的cache进行同步,保持本地的store信息与etcd的信息是最新一致的。
接着调用 cache.WaitForCacheSync。
3.3.2. controller.WaitForCacheSync
controller.WaitForCacheSync是对cache.WaitForCacheSync的一层封装,通过不同的controller的名字来记录不同controller等待cache同步。
controller.WaitForCacheSync具体代码如下:
3.4. LeaderElection
如果有多个scheduler,并开启leader选举,则运行LeaderElector直到选举结束或退出。
3.5. Scheduler.Run
Scheduler.Run先等待cache同步,然后开启调度逻辑的goroutine。
Scheduler.Run的具体代码如下:
以上是对/cmd/kube-scheduler/scheduler.go部分代码的分析,Scheduler.Run后续的具体代码位于pkg/scheduler/scheduler.go待后续文章分析。
参考:
https://github.com/kubernetes/kubernetes/tree/v1.12.0/cmd/kube-scheduler
https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-scheduler/scheduler.go
https://github.com/kubernetes/kubernetes/blob/v1.12.0/cmd/kube-scheduler/app/server.go
最后更新于
这有帮助吗?