【原創】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,ScheduledPodLister,scheduledPodPopulator 這個是關鍵資料,稍後分析
3、PodLister ,NodeLister,ServiceLister,ControllerLister 排程的時候需要用到的資料
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、assumedPods1、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日