1. 程式人生 > >【原創】k8s原始碼分析-----kube-scheduler

【原創】k8s原始碼分析-----kube-scheduler

原始碼為k8s v1.1.1穩定版本

一、主要流程

1、main入口

原始碼在k8s.io/kubernetes/plugin/cmd/kube-scheduler

這種封裝是k8s裡面一貫的封裝風格,就不再多說了

原始碼在k8s.io/kubernetes/plugin/cmd/kube-scheduler/app

繼續往下


真正的入口

下面有個ratelimiter

factory.NewConfigFactory之後呼叫了func (s *SchedulerServer) createConfig

 

2、configFactory

原始碼k8s.io/kubernetes/plugin/pkg/scheduler/factory

先看下結構體


1、client 與apiserver的介面

2、podqueue,ScheduledPodListerscheduledPodPopulator 這個是關鍵資料,稍後分析

3、PodLister NodeListerServiceListerControllerLister 排程的時候需要用到的資料

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

5、modeler,pod資訊處理部分

我們繼續

以下程式碼,做了簡單的初始化。其中重要的初始化有modeler


 

繼續流程

繼續




3、Scheduler
流程




二、modeler分析

原始碼在k8s.io\kubernetes\plugin\pkg\scheduler\modeler.go


在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 thathaven't yet shown up in the scheduledPods variable.正在排程中,還未確認以上三個佇列我們看看三個佇列的前世與今生

1、queuedPods

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

很明顯podqueue初始化了modeler


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

ConfigFactory中的podqueue就是modeler中的queuedpods


func (f *ConfigFactory) CreateFromKeys 函式中,在這裡生成了一個生產者,用於獲取那些需要排程的pod,儲存在podqueue中



func (f *ConfigFactory) CreateFromKeys函式末尾,在函式尾部,提供了一個藉口用於Scheduler獲取需要排程的pod


k8s.io\kubernetes\plugin\pkg\scheduler中的scheduleOne,獲取需要排程的pod,然後進行排程


2、assumedPods

k8s.io\kubernetes\plugin\pkg\scheduler中的scheduleOne,排程需要排程的pod,然後將其排程放到assumedpods中

 

在modeler中,新增到assumepods佇列

然後我們看看在什麼時候將assumepods消費掉

NewConfigFactory函式中,我們看到,生成了一個生產者,獲取到所有被排程的pod,然後在兩個介面中,將在assumepods中的,已經被排程的pod刪除



3、scheduledPods

這個已經被排程的則是在NewConfigFactory函式中,定時獲取到的已經被排程的pod


 

總結

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


2、ServiceLister

func (f *ConfigFactory) CreateFromKeys


3、ControllerLister

func (f *ConfigFactory) CreateFromKeys

4、NodeLister

 

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

 

排程的時候,獲取到需要排程的pod,然後genericScheduler進行排程獲取host


我們看genericScheduler中的排程



四、排程演算法

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



具體演算法就不做探討了

五、總結

在此係統中,3個部分功能清晰,各司其責

modeler,主要負責pod 資訊管理(需要排程的,已經排程的,正在排程中的)

genericScheduler,主要負責pod,計算出host的工作

Scheduler,組織前兩個部分,進行排程

龔浩華

qq 月牙寂 道長 29185807

2016年4月5日