【原创】k8s源码分析-----kube-scheduler


本文转自本人空间:http://user.qzone.qq.com/29185807/blog/1459831332

源码为k8s v1.1.1稳定版本

一、主要流程

1、main入口

源码在k8s.io/kubernetes/plugin/cmd/kube-scheduler

这种封装是k8s里面一贯的封装风格,就不再多说了

【原创】k8s源码分析-----kube-scheduler_第1张图片 

源码在k8s.io/kubernetes/plugin/cmd/kube-scheduler/app

继续往下

【原创】k8s源码分析-----kube-scheduler_第2张图片

真正的入口

【原创】k8s源码分析-----kube-scheduler_第3张图片 

下面有个ratelimiter

 

factory.NewConfigFactory之后调用了func (s *SchedulerServer) createConfig

 

2、configFactory

源码k8s.io/kubernetes/plugin/pkg/scheduler/factory

先看下结构体

【原创】k8s源码分析-----kube-scheduler_第4张图片

1、client 与apiserver的接口

2、podqueue,ScheduledPodListerscheduledPodPopulator 这个是关键数据,稍后分析

3、PodLister NodeListerServiceListerControllerLister 调度的时候需要用到的数据

4、BindPodsRateLimiter,在入口初始化的ratelimiter

5、modeler,pod信息处理部分

 

我们继续

以下代码,做了简单的初始化。其中重要的初始化有modeler

【原创】k8s源码分析-----kube-scheduler_第5张图片

【原创】k8s源码分析-----kube-scheduler_第6张图片  

继续流程

【原创】k8s源码分析-----kube-scheduler_第7张图片 

继续

【原创】k8s源码分析-----kube-scheduler_第8张图片

【原创】k8s源码分析-----kube-scheduler_第9张图片

【原创】k8s源码分析-----kube-scheduler_第10张图片

3、Scheduler流程


【原创】k8s源码分析-----kube-scheduler_第11张图片


二、modeler分析

源码在k8s.io\kubernetes\plugin\pkg\scheduler\modeler.go

【原创】k8s源码分析-----kube-scheduler_第12张图片

在modeler中,有三个list

1、queuedPods: a PodLister that will return pods that have not been scheduled yet.

       即将被调度,还未被调度的

2、scheduledPods: a PodLister that will return pods that we know for sure have been scheduled.

       已经调度的

3、 assumedPods  holds the pods that we think we've scheduled, but that   haven't yet shown up in the scheduledPods variable.        正在调度中,还未确认 以上三个队列 我们看看三个队列的前世与今生  

1、queuedPods

k8s.io\kubernetes\plugin\pkg\scheduler\factory\factory.go中(上文中已经有)

很明显podqueue初始化了modeler

【原创】k8s源码分析-----kube-scheduler_第13张图片

k8s.io\kubernetes\plugin\pkg\scheduler\modeler.go

ConfigFactory中的podqueue就是modeler中的queuedpods

【原创】k8s源码分析-----kube-scheduler_第14张图片

func (f *ConfigFactory) CreateFromKeys 函数中,在这里生成了一个生产者,用于获取那些需要调度的pod,保存在podqueue中



func (f *ConfigFactory) CreateFromKeys函数末尾,在函数尾部,提供了一个借口用于Scheduler获取需要调度的pod


k8s.io\kubernetes\plugin\pkg\scheduler中的scheduleOne,获取需要调度的pod,然后进行调度

【原创】k8s源码分析-----kube-scheduler_第15张图片

2、assumedPods

k8s.io\kubernetes\plugin\pkg\scheduler中的scheduleOne,调度需要调度的pod,然后将其调度放到assumedpods中

 

在modeler中,添加到assumepods队列

 

然后我们看看在什么时候将assumepods消费掉

NewConfigFactory函数中,我们看到,生成了一个生产者,获取到所有被调度的pod,然后在两个接口中,将在assumepods中的,已经被调度的pod删除

【原创】k8s源码分析-----kube-scheduler_第16张图片


3、scheduledPods

这个已经被调度的则是在NewConfigFactory函数中,定时获取到的已经被调度的pod

【原创】k8s源码分析-----kube-scheduler_第17张图片

【原创】k8s源码分析-----kube-scheduler_第18张图片  

总结

1、在ConfigFactory中,调用与apiserver的接口,定期获取需要调度的pod,将其保存在modeler中的queuedPods

2、在ConfigFactory中,像Scheduler提供获取需要调度pod的接口,然后在Scheduler中进行调度处理,(通过genericScheduler获取调度需要的host),然后将其放入modeler中的assumepods中

3、在ConfigFactory中,定期获取已经调度的pod信息,然后刷新assumepod和scheduledPods

 

三、genericScheduler分析

我们看看k8s.io\kubernetes\plugin\pkg\scheduler\factory

GenericScheduler需要什么

func (f *ConfigFactory) CreateFromKeys


准备数据

func (f *ConfigFactory) CreateFromKeys


1、podlister为modeler的podlister

【原创】k8s源码分析-----kube-scheduler_第19张图片

 

2、ServiceLister

func (f *ConfigFactory) CreateFromKeys


3、ControllerLister

func (f *ConfigFactory) CreateFromKeys

 

4、NodeLister

 

那么我们看scheduler工作流程。初始化中nodelister和genericScheduler

【原创】k8s源码分析-----kube-scheduler_第20张图片 

调度的时候,获取到需要调度的pod,然后genericScheduler进行调度获取host

【原创】k8s源码分析-----kube-scheduler_第21张图片

我们看genericScheduler中的调度


【原创】k8s源码分析-----kube-scheduler_第22张图片


 

四、调度算法

k8s.io\kubernetes\plugin\pkg\scheduler\algorithmprovider


【原创】k8s源码分析-----kube-scheduler_第23张图片

具体算法就不做探讨了

 

五、总结

在此系统中,3个部分功能清晰,各司其责

modeler,主要负责pod 信息管理(需要调度的,已经调度的,正在调度中的)

genericScheduler,主要负责pod,计算出host的工作

Scheduler,组织前两个部分,进行调度

 

龚浩华

qq 月牙寂 29185807

2016年4月5日

 (版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)

 

你可能感兴趣的:(源码,分布式,golang,容器,k8s)