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对象,主要函数有NewSharedInformerFactoryNewPodInformer

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

最后更新于

这有帮助吗?