From f46420c0f27fc9933beefa4cdae02378025f8ca0 Mon Sep 17 00:00:00 2001 From: yinwenqin Date: Tue, 3 Sep 2019 20:46:17 +0800 Subject: [PATCH] p5 --- .DS_Store | Bin 8196 -> 8196 bytes README.md | 2 +- ...�学习-Scheduler-P1-调度器入口篇.md | 15 +++++++++++---- ...码学习-Scheduler-P3-Node筛选算法.md | 16 ++++++++++------ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/.DS_Store b/.DS_Store index 18b94aa97300b9d37c58280dedb027c989be2ee2..6b3f9ca1fd24765014ff3a4524f061654d8dc60c 100644 GIT binary patch literal 8196 zcmeI1O>Ep$5P)YkX=1xg@)FX<+4N_XC2D{q-Az;4l&0Nm0w~bZsQFLRZg&m$ z_Ga@#P~ZRpdM!xMa^L_$;X(@s4jiCD;($PcNE9xJ0~Z7wxNv2jpEqjrBW^%dKgn;N z-^|!=#-IH%8vwv$UW)^$03gx9CEH2e7LDuqv8jdpnNpHS{s0=}!2}(0nZhRPU?Rvs zkbxirK?Z^h1R3~0WPtW;-lT2zeW4BdAOk@L?#T@B??Z$RE)%|75z_l~Q0J8ZBzXzo zH5yYL;Q2&+negR`ke(}DQ&bP=yP{uWpl~OBgqxF0_;N)^;SMO=0sT9pU!kCPck+vP z=70$ygFeVWkb%t^;IEGi4rF19>h{~}cV{+Z+8NS*m6j)~&Gm6QGi>OE6szsAEjMjgdd_n;G@VQ)Mhr`{ z3rRa~X^wZD0ilp2S&~z%VQDGe+1cI_X+7Gp+!9%e$B)EXBGk7pFUwM0Q@pG1(#*o* z(sRqtUljqO|B-;I4FO-k-k07K+i{Dn=_SJJrV?SNcYctZfY#i+YMxITUOk zo%ZMSISOnfYn%BQ%So~7Y}(A`&9tj`nSY~FAeSX7d{*@nHU zGNI8b&e$6F(%8q6>}euCRG`9C?=Nn4Ig+=Q3j{!IWk8Uu5E`D zb;wL-bdzbaxX((^BCMlX|7J2d_l^Nem>Y))j-~{x;7-3z2%Wwr=hj(BVZonsS6TXIT z;9K|(Zo$v+EBpq(!yoV$mSP!}qlDGC5BK8%Y{phRgfWccaXf|Hn8Y4DjpuL>hj18E zIEe;6gVX5ZGOpkY_#(cBZ{k(FhHvA0_#s}$8~71^il5_6vBFRh%_qcpvBxiHw8e`^ zX!*I^ zD-pWG$`Of(WjloSm~vburdg@bb}6SMLYI}T)z_(ex|52+fWKn$Mh3Sf@O`)rpAmgO z!cXuEk@qK22Si*YsvdET7{w-RBkJPVjvd&ACow_faqiCGQ`nDVIF1u|f#{ne`liuD z3kx`pi?~D-zJxF1EBGp2#w+*+vG|rppuk0-x9(84-oAC9)9<1_cwr#)kgpT literal 8196 zcmeHMOKcTY82-Of;LPyo6ydf-E?g-Dgrc{AtvuA*2aoy)gtoLmLi6TKD zK_EdOK_EdOLE!&@0H4{iiCNBlWlhEefdqjY5&`*r$Z(f37t2W{qfZA9Q3=3OmH<)X zIoAPEOeU7OSWYS#h4M93^?*1OaftyH&i0ISXPJxTq>?I}pu!39oe@_ki0;mDnaG`x zQ!*J71QGvnJm1nXF`@se`tvF36%QoR8ANli=*=1_nSeuZ`k(! zda6z#4oOR!W!aW!%&k{D9HrZs%c_;eM@a+S#s|k<8emcn(-@th=jeGlOK;NKbdlbt zkLXkSj6SC?=o|W$zN7EyNBWt5pkM!7F$jZ{Qp*;4Qp^_wa#ww5kd*-$RmVI(IsvGkqi$vtTDw9qdl0Iswtx4<5Z!NN|U&FSl*wVC#EpwR4 z%GSJDPaAWYwJNTqRo9JbrnR!}*vZy;Okgq9P*ny`sEcPF-CJ31oX?ZJK=Ko5Fx5P6s=GWTre z-Y|17K!^!EhR5*)PU8%o#S3^5FX3gp#ymWK75};_%u^BJj4%)K%& zSzX5n%u&x?FYEtZv;Y2o9cP$4dV)ZLz~3Q&>dx-YcJ`X>8!v0^4EJN)Ws`oBN=6|( uNEfM(%5j#{|1jivCbs2bIjJODxc%!t1js)tlJh^petJmG|7j?0l*ylKyw+g= diff --git a/README.md b/README.md index ae1e909..f2863a8 100644 --- a/README.md +++ b/README.md @@ -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/ diff --git a/scheduler/Kubernetes源码学习-Scheduler-P1-调度器入口篇.md b/scheduler/Kubernetes源码学习-Scheduler-P1-调度器入口篇.md index 7b21658..d8992bf 100644 --- a/scheduler/Kubernetes源码学习-Scheduler-P1-调度器入口篇.md +++ b/scheduler/Kubernetes源码学习-Scheduler-P1-调度器入口篇.md @@ -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的指定优先级来抢占资源 + +**本篇入口篇到这里就先告一段落,下一篇开始阅读学习调度过程的逻辑!** diff --git a/scheduler/Kubernetes源码学习-Scheduler-P3-Node筛选算法.md b/scheduler/Kubernetes源码学习-Scheduler-P3-Node筛选算法.md index b4dfb00..60c3e67 100644 --- a/scheduler/Kubernetes源码学习-Scheduler-P3-Node筛选算法.md +++ b/scheduler/Kubernetes源码学习-Scheduler-P3-Node筛选算法.md @@ -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 筛选算法过程到这里就已然清晰明了! -### 重点回顾 +## 重点回顾 筛选算法代码中的几个不易理解的点(亮点?)圈出: