diff --git a/.DS_Store b/.DS_Store index da9ee58..ee5b1a9 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/scheduler/.DS_Store b/scheduler/.DS_Store index 499486d..4c602db 100644 Binary files a/scheduler/.DS_Store and b/scheduler/.DS_Store differ diff --git a/scheduler/P2-调度器框架.md b/scheduler/P2-调度器框架.md new file mode 100644 index 0000000..1aaec1c --- /dev/null +++ b/scheduler/P2-调度器框架.md @@ -0,0 +1,63 @@ +调度器框架 + +## 前言 + +在上一篇文档中,我们找到了sheduler调度功能主逻辑的入口: + +[**P1-调度器入口篇**](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/P1-%E8%B0%83%E5%BA%A6%E5%99%A8%E5%85%A5%E5%8F%A3%E7%AF%87.md) + +那么在本篇,我们基于找到的入口,来进入调度器框架内部,看一看整体的逻辑流程,本篇先跳过调度的算法(Predicates断言选择、Priority优先级排序),只关注`pkg/scheduler`目录内的scheduler框架相关的逻辑流向,摸清scheduler框架本身的代码结构,调度算法留在后面的文章再谈 + +## 框架流程 + +让回到我们上一篇篇末找到的调度逻辑入口位置,`pkg/scheduler/scheduler.go:435`, `scheduleOne()`函数内部,定位在`pkg/scheduler/scheduler.go:457`位置,是通过这个`sched.schedule(pod)`方法来获取与pod匹配的node的,我们直接跳转2次,来到了这里`pkg/scheduler/core/generic_scheduler.go:107` + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/schedule.jpg) + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/AlgSchedule.jpg) + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/scheduleStruct.jpg) + +通过注释可以知道,ScheduleAlgorithm interface中的Schedule方法就是用来为pod筛选node的,但这是个接口方法,并不是实际调用的,我们稍微往下,在`pkg/scheduler/core/generic_scheduler.go:162`这个位置,就可以找到实际调用的Schedule方法: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/genericSchedule.jpg) + +本篇我们不看Schedule方法内的具体调度算法细节,先来逆向回溯代码结构,找到哪里创建了scheduler,调度器的默认初始化配置,默认的调度算法来源等等框架相关的东西。`Schedule()`方法属于`genericScheduler`结构体,先查看`genericScheduler`结构体,再选中结构体名称,crtl + b组合键查看它在哪些地方被引用,找出创建结构体的位置: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/createGenSche.jpg) + +通过缩略代码框,排除test相关的测试文件,很容易找出创建结构体的地方位于`pkg/scheduler/core/generic_scheduler.go:1189`,点击图中红框圈中位置,跳转过去,果然找到了`NewGenericScheduler()`方法,这个方法是用来创建一个`genericScheduler`对象的,那么我们再次crtl + b组合键查看`NewGenericScheduler`再什么地方被调用: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/newGenericScheduler.jpg) + +找出了在`pkg/scheduler/factory/factory.go:441`这个位置上找到了调用入口,这里位于`CreateFromKeys()`方法中,继续crtl + b查看它的引用,跳转到`pkg/scheduler/factory/factory.go:336`这个位置: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/createFromKeys.jpg) + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/createFromProvider.jpg) + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/getAlgorithmProvider.jpg) + +这里找到了`algorithmProviderMap`这个变量,顾名思义,这个变量里面包含的应该就是调度算法的来源,点击进去查看,跳转到了`pkg/scheduler/factory/plugins.go:86`这个位置,组合键查看引用,一眼就可以看出哪个引用为这个map添加了元素: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/addMapEle.jpg) + +跳转过去,来到了`pkg/scheduler/factory/plugins.go:391`这个位置,这个函数的作用是为scheduler的配置指定调度算法,即`FitPredicate、Priority`这两个算法需要用到的metric或者方法,再次请出组合键,查找哪个地方调用了这个方法: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/registerAlgorithmProvider.jpg) + +来到了`pkg/scheduler/algorithmprovider/defaults/defaults.go:99`,继续组合键向上查找引用,这次引用只有一个,没有弹窗直接跳转过去了`pkg/scheduler/algorithmprovider/defaults/defaults.go:36`: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/registerAlgorithmProvider1.jpg) + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/init.jpg) + +我们来看看`defaultPredicates(), defaultPriorities()`这两个函数具体的内容: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/default.jpg) + +我们随便点击进去一个`predicates`选项查看其内容: + +[image](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/image/p2/memPressure.jpg) + +`CheckNodeMemoryPressure`这个词相应熟悉kubernetes pod的朋友一定不会陌生,在node内存压力大无法调度的pod时,`kubectl describe pod xxx`就会在状态信息里面看到这个关键词。同时,该变量的定义位于`pkg/scheduler/algorithm/predicates/predicates.go:102`,`pkg/scheduler/algorithm/`这个目录在调度器的总览中已经讲过是调度算法相关的目录,`defaultPredicates(), defaultPriorities()`里面的内容都是位于这个目录中,具体调度器的断言过滤、优先级排序算法详情将在下篇中详解,本篇调度器框架结构梳理到此结束! \ No newline at end of file diff --git a/scheduler/README.md b/scheduler/README.md index 0e00748..a9a29a4 100644 --- a/scheduler/README.md +++ b/scheduler/README.md @@ -2,7 +2,7 @@ ## 调度器源码分段阅读目录 - [调度器入口](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/P1-%E8%B0%83%E5%BA%A6%E5%99%A8%E5%85%A5%E5%8F%A3%E7%AF%87.md) -- 待补充 +- [调度器框架](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/P1-%E8%B0%83%E5%BA%A6%E5%99%A8%E5%85%A5%E5%8F%A3%E7%AF%87.md) ## 概览 首先列出官方md链接,讲解颇为生动: diff --git a/scheduler/image/.DS_Store b/scheduler/image/.DS_Store new file mode 100644 index 0000000..d8253e3 Binary files /dev/null and b/scheduler/image/.DS_Store differ diff --git a/scheduler/image/p2/AlgSchedule.jpg b/scheduler/image/p2/AlgSchedule.jpg new file mode 100644 index 0000000..3d06714 Binary files /dev/null and b/scheduler/image/p2/AlgSchedule.jpg differ diff --git a/scheduler/image/p2/addMapEle.jpg b/scheduler/image/p2/addMapEle.jpg new file mode 100644 index 0000000..c6ee670 Binary files /dev/null and b/scheduler/image/p2/addMapEle.jpg differ diff --git a/scheduler/image/p2/createFromKeys.jpg b/scheduler/image/p2/createFromKeys.jpg new file mode 100644 index 0000000..31c5460 Binary files /dev/null and b/scheduler/image/p2/createFromKeys.jpg differ diff --git a/scheduler/image/p2/createFromProvider.jpg b/scheduler/image/p2/createFromProvider.jpg new file mode 100644 index 0000000..970d64c Binary files /dev/null and b/scheduler/image/p2/createFromProvider.jpg differ diff --git a/scheduler/image/p2/createGenSche.jpg b/scheduler/image/p2/createGenSche.jpg new file mode 100644 index 0000000..bf2fae7 Binary files /dev/null and b/scheduler/image/p2/createGenSche.jpg differ diff --git a/scheduler/image/p2/default.jpg b/scheduler/image/p2/default.jpg new file mode 100644 index 0000000..b0f7fc3 Binary files /dev/null and b/scheduler/image/p2/default.jpg differ diff --git a/scheduler/image/p2/generricSchedule.jpg b/scheduler/image/p2/generricSchedule.jpg new file mode 100644 index 0000000..b488b96 Binary files /dev/null and b/scheduler/image/p2/generricSchedule.jpg differ diff --git a/scheduler/image/p2/getAlgorithmProvider.jpg b/scheduler/image/p2/getAlgorithmProvider.jpg new file mode 100644 index 0000000..f9083d1 Binary files /dev/null and b/scheduler/image/p2/getAlgorithmProvider.jpg differ diff --git a/scheduler/image/p2/init.jpg b/scheduler/image/p2/init.jpg new file mode 100644 index 0000000..3acf9c8 Binary files /dev/null and b/scheduler/image/p2/init.jpg differ diff --git a/scheduler/image/p2/memPressure.jpg b/scheduler/image/p2/memPressure.jpg new file mode 100644 index 0000000..e85d97e Binary files /dev/null and b/scheduler/image/p2/memPressure.jpg differ diff --git a/scheduler/image/p2/newGenericScheduler.jpg b/scheduler/image/p2/newGenericScheduler.jpg new file mode 100644 index 0000000..45114f5 Binary files /dev/null and b/scheduler/image/p2/newGenericScheduler.jpg differ diff --git a/scheduler/image/p2/registerAlgorithmProvider.jpg b/scheduler/image/p2/registerAlgorithmProvider.jpg new file mode 100644 index 0000000..c1c73bc Binary files /dev/null and b/scheduler/image/p2/registerAlgorithmProvider.jpg differ diff --git a/scheduler/image/p2/registerAlgorithmProvider1.jpg b/scheduler/image/p2/registerAlgorithmProvider1.jpg new file mode 100644 index 0000000..949ac5c Binary files /dev/null and b/scheduler/image/p2/registerAlgorithmProvider1.jpg differ diff --git a/scheduler/image/p2/schedule.jpg b/scheduler/image/p2/schedule.jpg new file mode 100644 index 0000000..d5a507c Binary files /dev/null and b/scheduler/image/p2/schedule.jpg differ diff --git a/scheduler/image/p2/scheduleStruct.jpg b/scheduler/image/p2/scheduleStruct.jpg new file mode 100644 index 0000000..79b787a Binary files /dev/null and b/scheduler/image/p2/scheduleStruct.jpg differ