任务:找到scheduler的入口
k8s 代码目录结构
cmd:所有的二进制可执行文件入口代码,也就是各种命令的接口代码。
pkg:项目diamante主目录,cmd只是接口,这里是具体实现。cmd类似业务代码,pkg类似核心
寻找k8s入口函数
1
2
3
4
5
6
|
cmd/kube-scheduler/scheduler.go:34 main函数 ->
cmd/kube-scheduler/app/server.go:70 NewSchedulerCommand->
cmd/kube-scheduler/app/server.go:117 runCommand ->
cmd/kube-scheduler/app/server.go:167 Run ->
pkg/scheduler/scheduler.go:276 run
(cmd/kube-scheduler/scheduler.go:34 表示cmd/kube-scheduler/scheduler.go文件的第34行)
|
可以看到,CMD目录果然是入口,到了pkg/scheduler/scheduler.go就到了真正运行调度了。下面是 pkg/scheduler/scheduler.go:276 run 的函数。
1
2
3
4
5
6
7
8
9
|
// Run begins watching and scheduling. It waits for cache to be synced, then starts a goroutine and returns immediately.
func (sched *Scheduler) Run() {
//检查是否同步,这个先不用管
if !sched.config.WaitForCacheSync() {
return
}
//语句含义:每隔 0 秒, 执行一次sched.scheduleOne函数,直到sched.config.StopEverything信号的到来。
go wait.Until(sched.scheduleOne, 0, sched.config.StopEverything)
}
|
可以看到,这里就是周期行的执行调度函数了。
sched.scheduleOne:调度一个pending的pod.
补充:
sched 是一个Scheduler结构体的对象。Scheduler结构体的内容可以在
pkg/scheduler/factory/factory.go:96 中查看。
看名字是使用了工厂模式。
k8s代码的结构
api: 输出接口文档用,基本是json源码
build:构建脚本
cmd:所有的二进制可执行文件入口代码,也就是各种命令的接口代码。
pkg:项目diamante主目录,cmd只是接口,这里是具体实现。cmd类似业务代码,pkg类似核心
plugin:插件
test:测试相关的工具
third_party:第三方工具
docs:文档
example:使用例子
Godeps:项目依赖的Go的第三方包,比如docker客户端sdk,rest等
hack:工具箱,各种编译,构建,校验的脚本都在这。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/cmd/kube-scheduler
├── app
│ ├── BUILD
│ ├── server.go //schedule初始化以及运行启动函数
├── BUILD
├── OWNERS
├── scheduler.go //schedule main函数
/pkg
├── plugin/pkg/admission
├── plugin/pkg/auth //相关认证
├── plugin/pkg/scheduler //schedule主要逻辑,包含预选优选算法、测量等
├── plugin/pkg/scheduler/algorithm //schedule预选优选算法
├── ...
├── plugin/pkg/scheduler/schedulercache //schedule缓存,便于业务逻辑
├── plugin/pkg/scheduler/metrics// 测量相关
├── BUILD
├── testutil.go
├── OWNERS
├── scheduler.go // scheduler的代码逻辑入口,其中scheduleOne函数就在里面
├── scheduler_test.go
|
参考的学习资料
https://github.com/farmer-hutao/k8s-source-code-analysis/blob/master/README.md