kubernetes1.9源碼閱讀 kube-scheduler

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

kubernetes tag v.1.9.0

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

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

1. kubernetes1.9對入口程序cmd部分進行了重構

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

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

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

構建調度服務器:plugin/cmd/kube-scheduler/app/server.go NewSchedulerServer()

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

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

3. 如果設置了leaderElect,調用makeLeaderElectionConfig()進行選舉;

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

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

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

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

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

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

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

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

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

7. 調用informerFactory.start() ,開始運行Informer,進行緩存;

8. 調用sched.Run(),運行調度程序;

SharedInformers模式設計同時用在k8s的"Controller"中,下面是一段關于SharedInformers模式設計的英文介紹:(摘自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提供勾子機制,接收到特定資源添加、更新、刪除的通知。并提供函數(shù)更新緩存,啟動執(zhí)行。簡而言之kube-scheduler的"informer"負責:watch/list non-terminal pods, 進行緩存,再從podQueue中獲得NextPod,執(zhí)行調度;

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

1. 等待緩存更新完成;

2. 調用sched.scheduleOne,運行調度流程;

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

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

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

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

4. 此Pod將標注為assumedPod;此時Pod并沒有被成功調度;

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

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

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

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

調度算法函數(shù):

1. 調度算法函數(shù)支持plugin模式plugin/pkg/scheduler/algorithmprovider/plugins.go,scheduler的commandLine參數(shù)AlgorithmProvider可以指定調度算法函數(shù);默認使用defaultProvider, defaultPredicates(), defaultPriorities() plugin/pkg/scheduler/algorithmprovider/defaults/default.go;同時,scheduler的commandLine參數(shù)PolicyConfigFile,可以加載自定義的調度策略文件。如:openshift中,/etc/origin/master/scheduler.json定義了調度策略文件。(參考信息: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. 調度流程plugin/pkg/scheduler/core/generic_scheduler.go schedule(),調度流程圖如下:(摘自kubernetes調度詳解:http://dockone.io/article/2885

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

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

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

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

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

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

相關閱讀:

1.?http://licyhust.com/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容