k8s源碼學習——scheduler

scheduler模塊在k8s系統中的作用是分配pod,它會watch未分配的pod,然后把pod分配到合適的節(jié)點上。scheduler模塊代碼在目錄pkg/scheduler中,其中scheduler.go文件中有一個Scheduler結構體,它主要由下面幾個數據結構組成:

1)Algorithm:算法接口,提供schedule時候的算法。

2)SchedulingQueue:等待schedule的pod隊列。

3)NextPod():每次取從隊列中取一個pod進行schedule,這個方法是非阻塞的。

Scheduler結構體的Run方法內容如下:


scheduler run

Scheduler首先同步需要分配的pod到隊列中,然后運行一個無限循環(huán),每次循環(huán)做一次分配。

scheduleOne方法里面是一次分配的邏輯,首先會從優(yōu)先級隊列里面取下一個Pod,然后用Algorithm去schedule一次pod,如果schedule失敗則記錄一次失敗。

Algorithm是一個interface,只有三個方法,用戶可以實現這三個方法來實現自己的Algorithm。


Algorithm

其中preempt方法在一個pod分配失敗之后,通過搶占一些低優(yōu)先級pod資源的方式來嘗試重新分配。Extenders則是對schedule的擴展,比如運行一些pre-scheduler和after-scheduler的流程等等。k8s提供了一個內置的schedule算法,我們來看看它是怎么運行的。

內置schedule的算法是這樣的:首先獲得一個node列表,然后filter掉那些不合適的node,用這些node和pod信息去排一個優(yōu)先級隊列(heap實現的優(yōu)先級隊列),然后從隊列中選擇評分最高的一個,開發(fā)者可以用插件的方式去定制化評分算法。

scheduler內部還有一個插件加載的機制,在framework文件夾里面。它實際上用一個框架規(guī)定了schedule的幾個階段,PreFilter, Filter, QueueSort等等,用戶可以把自己的邏輯用plugin的方式插入各個階段,從而定制化schedule的整個流程。

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

友情鏈接更多精彩內容