kubernetes1.9源碼閱讀 kube-scheduler

之前寫過kubernetes1.8 kube-scheduler源碼閱讀。基于上篇文章的基礎(chǔ),重新閱讀了kubernetes1.9的kube-scheduler的代碼。本篇文章是kubernetes1.9的kube-scheduler代碼閱讀筆記。不得不說,kubernetes工程師們,每經(jīng)過短短三個月的版本發(fā)布,代碼都會經(jīng)過大大的重構(gòu)。好的工程師是在不斷重構(gòu)代碼中,認(rèn)識得到升華,錘煉出來的。

kubernetes tag v.1.9.0

kube-scheduler的代碼路徑為:plugin/

入口程序:plugin/cmd/kube-scheduler/scheduler.go main()

1. kubernetes1.9對入口程序cmd部分進(jìn)行了重構(gòu)

2. 首先,調(diào)用app.NewSchedulerCommand(),? NewSchedulerCommand()方法在plugin/cmd/kube-scheduler/app/server.go中,NewSchedulerCommand()方法將調(diào)用opts.Run();

3. 創(chuàng)建NewSchedulerServer和啟動調(diào)度服務(wù);

4. componentconfig.KubeSchedulerConfiguration{}定義了kube-scheduler的參數(shù)信息;

構(gòu)建調(diào)度服務(wù)器:plugin/cmd/kube-scheduler/app/server.go NewSchedulerServer()

1. 調(diào)用createClients(),創(chuàng)建apiserver客戶端,通過REST方式訪問APIserver提供的API服務(wù),用來watch pod和node,并調(diào)用api server bind接口完成node和pod的Bind操作;

2. 調(diào)用record.NewBroadcaster(),創(chuàng)建eventBroadcaster對象,recorder記錄config.SchedulerName的事件;

3. 如果設(shè)置了leaderElect,調(diào)用makeLeaderElectionConfig()進(jìn)行選舉;

4. 調(diào)用informers.NewSharedInformerFactory(),創(chuàng)建sharedInformerFactory對象

5. 調(diào)用factory.NewPodInformer(),創(chuàng)建PodInformer對象,PodInformer用于watch/list non-terminal pods并緩存;

啟動程序:plugin/cmd/kube-scheduler/app/server.go Run()

1. 調(diào)用s.SchedulerConfig()方法,創(chuàng)建scheduler.Config對象;

2. 在s.SchedulerConfig()方法中,首先,通過factory.NewConfigFactory()創(chuàng)建ConfigFactory對象,ConfigFactory是scheduler.Configurator接口的實(shí)現(xiàn);

3. ConfigFactory對象,包括:nodeInformer、podInformer、pvInformer、pvcInformer、rcInformer、rsInformer、statefulsetInformer、serviceInformer、pdbInformer、storageClassInformer,這些是通過s.InformerFactory創(chuàng)建;

4. 調(diào)用scheduler.NewFromConfig(schedulerConfig),創(chuàng)建Scheduler對象;

5. 調(diào)用s.Broadcaster.StartRecordingToSink(),接收EventBroadcaster發(fā)送的event,輸出到EventSink;

6. 啟動healthz server和metrics server,提供必要的健康檢查和性能量度;

7. 調(diào)用informerFactory.start() ,開始運(yùn)行Informer,進(jìn)行緩存;

8. 調(diào)用sched.Run(),運(yùn)行調(diào)度程序;

SharedInformers模式設(shè)計同時用在k8s的"Controller"中,下面是一段關(guān)于SharedInformers模式設(shè)計的英文介紹:(摘自https://github.com/kubernetes/community/blob/8decfe4/contributors/devel/controllers.md

Use SharedInformers. SharedInformers provide hooks to receive notifications of adds, updates, and deletes for a particular resource. They also provide convenience functions for accessing shared caches and determining when a cache is primed.

SharedInformers提供勾子機(jī)制,接收到特定資源添加、更新、刪除的通知。并提供函數(shù)更新緩存,啟動執(zhí)行。簡而言之kube-scheduler的"informer"負(fù)責(zé):watch/list non-terminal pods, 進(jìn)行緩存,再從podQueue中獲得NextPod,執(zhí)行調(diào)度;

調(diào)度程序:plugin/pkg/scheduler/scheduler.go?Run()

1. 等待緩存更新完成;

2. 調(diào)用sched.scheduleOne,運(yùn)行調(diào)度流程;

調(diào)度流程:plugin/pkg/scheduler/scheduler.go scheduleOne()

1. 調(diào)用sched.config.NextPod(),從podQueue緩存中獲得一個Pod;

2. 調(diào)用sched.schedule(pod),獲得一個suggestedHost,此操作是同步操作;

3. 調(diào)用metrics.SchedulingAlgorithmLatency.Observe(metrics.SinceInMicroseconds(start)),記錄算法延遲的量度;

4. 此Pod將標(biāo)注為assumedPod;此時Pod并沒有被成功調(diào)度;

5. 調(diào)用sched.bind(),綁定Pod到suggestedHost,此操作是異步操作;

6. 調(diào)用metrics.E2eSchedulingLatency.Observe(),記錄調(diào)度延遲的量度;

調(diào)度邏輯:plugin/pkg/scheduler/scheduler.go Schedule()

1. 根據(jù)調(diào)度策略算法確定一個suggestedHost;

調(diào)度算法函數(shù):

1. 調(diào)度算法函數(shù)支持plugin模式plugin/pkg/scheduler/algorithmprovider/plugins.go,scheduler的commandLine參數(shù)AlgorithmProvider可以指定調(diào)度算法函數(shù);默認(rèn)使用defaultProvider, defaultPredicates(), defaultPriorities() plugin/pkg/scheduler/algorithmprovider/defaults/default.go;同時,scheduler的commandLine參數(shù)PolicyConfigFile,可以加載自定義的調(diào)度策略文件。如:openshift中,/etc/origin/master/scheduler.json定義了調(diào)度策略文件。(參考信息:https://docs.openshift.com/container-platform/3.6/admin_guide/scheduling/scheduler.html

2. FitPredicates:k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/predicates

3. PrioritiesFunc:k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/priorities

4. 調(diào)度流程plugin/pkg/scheduler/core/generic_scheduler.go schedule(),調(diào)度流程圖如下:(摘自kubernetes調(diào)度詳解:http://dockone.io/article/2885

綁定邏輯:plugin/pkg/scheduler/scheduler.go bind()

1. 調(diào)用SchedulerCache.FinishBinding(),更新schedulerCache,將assumedPod的狀態(tài)變?yōu)閑xpired;? schedulerCache實(shí)現(xiàn)了schedulercache.cache接口;

2. schedulerCache定義在plugin/pkg/scheduler/schedulercache/cache.go;

3. schedulercache.cache定義在plugin/pkg/scheduler/schedulercache/interface.go;

4. 調(diào)用metrics.BindingLatency.Observe(),記錄綁定延遲的量度;

5. 調(diào)用?sched.config.Recorder.Eventf(),記錄綁定事件;

相關(guān)閱讀:

1.?http://licyhust.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容