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首先同步需要分配的pod到隊列中,然后運行一個無限循環(huán),每次循環(huán)做一次分配。
scheduleOne方法里面是一次分配的邏輯,首先會從優(yōu)先級隊列里面取下一個Pod,然后用Algorithm去schedule一次pod,如果schedule失敗則記錄一次失敗。
Algorithm是一個interface,只有三個方法,用戶可以實現這三個方法來實現自己的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的整個流程。