add-license-1
yinwenqin 5 years ago
parent aa5e71494e
commit f46420c0f2

BIN
.DS_Store vendored

Binary file not shown.

@ -41,7 +41,7 @@ Kubernetes这一整个项目颇为庞大一般情况下如果熟悉kuberne
### 参考
## 参考
1.官方开发者向导md文档: https://github.com/kubernetes/community/tree/master/contributors/devel
2.http://hutao.tech/k8s-source-code-analysis/

@ -142,7 +142,7 @@ delete pods: pod1
```
#### 看到这里相信对cobra的强大简洁已经有了初步的认知建议自行进入项目主页了解详情并进行安装测试
** 看到这里相信对cobra的强大简洁已经有了初步的认知建议自行进入项目主页了解详情并进行安装测试**
## 入口
通过对上方cobra的基本了解我们不难知道`cmd/kube-scheduler/scheduler.go`内的main()方法内部实际调用的是`cobra.Command.Run`内的匿名函数,我们可以进入`NewSchedulerCommand()`内部确认:
@ -181,8 +181,15 @@ Broadcaster record.EventBroadcaster
![image](http://pwh8f9az4.bkt.clouddn.com/scheRun.jpg)
`wait.Until`这个调用的逻辑是直到收到stop信号才终止在此之前循环运行`sched.scheduleOne`。代码走到这里,终于找到启动入口最内部的主体啦:
![image](http://pwh8f9az4.bkt.clouddn.com/scheduleOne.jpg)
`sched.scheduleOne`这个函数有代码点长,整体的功能可以概括为:获取需调度的pod、寻找匹配node、发起绑定到node请求、绑定检查等一系列操作.
![](http://pwh8f9az4.bkt.clouddn.com/image-20190827163439895.png)
#### 本篇入口篇到这里就先告一段落,下一篇开始阅读学习调度过程的逻辑!
`sched.scheduleOne`这个函数有代码点长,整体的功能可以概括为:
1.获取需调度的pod
2.使用调度算法寻找匹配node、发起绑定到node请求、绑定检查等一系列操作.
3.若匹配node失败则尝试根据pod的指定优先级来抢占资源
**本篇入口篇到这里就先告一段落,下一篇开始阅读学习调度过程的逻辑!**

@ -10,6 +10,8 @@
## 正文
### 筛选算法入口
Schedule()的筛选算法核心是`findNodesThatFit()`方法 ,直接跳转过去:
`pkg/scheduler/core/generic_scheduler.go:184` --> `pkg/scheduler/core/generic_scheduler.go:435`
@ -80,7 +82,9 @@ func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v
}
```
这里一眼就可以看出核心匿名函数内的主体是`podFitsOnNode()`,但是并不是直接执行`podFitsOnNode()`函数,而是又封装了一层函数,这个函数的作用是在外层使用`nodeName := g.cache.NodeTree().Next()`来获取要判断的node主体传递给`podFitsOnNode()`函数,而后对`podFitsOnNode`函数执行返回的结果进行处理。着眼于其下的并发处理实现:`workqueue.ParallelizeUntil(ctx, 16, int(allNodes), checkNode)`,就可以理解这样封装的好处了,来看看并发实现的内部吧:
这里一眼就可以看出核心匿名函数内的主体是`podFitsOnNode()`,但是并不是直接执行`podFitsOnNode()`函数,而是又封装了一层函数,这个函数的作用是在外层使用`nodeName := g.cache.NodeTree().Next()`来获取要判断的node主体传递给`podFitsOnNode()`函数,而后对`podFitsOnNode`函数执行返回的结果进行处理。着眼于其下的并发处理实现:`workqueue.ParallelizeUntil(ctx, 16, int(allNodes), checkNode)`,就可以理解这样封装的好处了,来看看并发实现的内部吧
### 并发控制
`vendor/k8s.io/client-go/util/workqueue/parallelizer.go:38`
@ -231,11 +235,11 @@ func podFitsOnNode(
图中`pkg/scheduler/core/generic_scheduler.go:608`位置正式开始了逐个计算筛选算法,那么筛选方法、筛选方法顺序在哪里呢?在上一篇[P2-框架篇]([https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/P2-%E8%B0%83%E5%BA%A6%E5%99%A8%E6%A1%86%E6%9E%B6.md](https://github.com/yinwenqin/kubeSourceCodeNote/blob/master/scheduler/P2-调度器框架.md))中已经有讲过,默认调度算法都在`pkg/scheduler/algorithm/`路径下,我们接着往下看.
**Predicates Ordering / Predicates Function**
### Predicates Function
筛选算法相关的`key/func/ordering`,全部集中在`pkg/scheduler/algorithm/predicates/predicates.go`这个文件中
**筛选顺序**:
#### 筛选顺序
`pkg/scheduler/algorithm/predicates/predicates.go:142`
@ -258,7 +262,7 @@ var (
![](http://pwh8f9az4.bkt.clouddn.com/predicates.jpg)
**筛选key**
#### 筛选key
```go
const (
@ -339,7 +343,7 @@ const (
)
```
**筛选Function**
#### 筛选Function
每个`predicate key`对应的`function name`一般为`${KEY}Predicate`,function的内容其实都比较简单,不一一介绍了,自行查看,这里仅列举一个:
@ -371,7 +375,7 @@ func CheckNodeMemoryPressurePredicate(pod *v1.Pod, meta PredicateMetadata, nodeI
筛选算法过程到这里就已然清晰明了!
### 重点回顾
## 重点回顾
筛选算法代码中的几个不易理解的点(亮点?)圈出:

Loading…
Cancel
Save