k8s源码学习 - Scheduler笔记(1)

任务:找到scheduler的入口

(1)k8s 代码目录结构
cmd:所有的二进制可执行文件入口代码,也就是各种命令的接口代码。
pkg:项目diamante主目录,cmd只是接口,这里是具体实现。cmd类似业务代码,pkg类似核心

(2)寻找k8s入口函数
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 的函数。

// 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 中查看。
看名字是使用了工厂模式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容