k8s學(xué)習(xí)記錄(kube-scheduler)

在上一篇安裝篇之后,我們已經(jīng)初步擁有了一個(gè)k8s集群,并且運(yùn)行著k8s-device-plugin,能夠?qū)pu任務(wù)分配到裝有g(shù)pu的node上。

但是,如果我們想讓任務(wù)調(diào)度更加靈活呢?

首先,我們必須要了解k8s任務(wù)調(diào)度機(jī)制

kube-scheduler

https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/

k8s scheduler 流程

簡單的說,k8s的scheduler主要作了以下兩個(gè)工作:

篩選和打分。

首先,k8s會(huì)篩選掉資源條件不允許的node,比如某個(gè)pod需要1個(gè)gpu資源,那么scheduler會(huì)首先排除掉沒有g(shù)pu的node。

其次,scheduler會(huì)篩選掉因其他原因,不能運(yùn)行該pod的node。

然后,會(huì)有一個(gè)打分機(jī)制,根據(jù)各種維度的打分選出最優(yōu)的pod。其中,不同的分?jǐn)?shù)有不同的權(quán)重。

那么,如果要更改這些機(jī)制,人為添加條件,該如何做呢?

第一種方法:git clone k8s的官方源碼,然后修改scheduler,自己編譯k8s

這種方法顯然會(huì)帶來非常多的麻煩,尤其是后期維護(hù)的開銷。我們知道,k8s是允許master和node使用不同版本的k8s運(yùn)行的,這一點(diǎn)我們可以在get nodes里面觀察到。如果自行修改源代碼,可靠性難以保證,對整個(gè)集群后期維護(hù)也會(huì)埋下隱患。

第二種方法:自己寫一個(gè)scheduler,和kube-scheduler同時(shí)運(yùn)行。

這一種方法的想法是,默認(rèn)的scheduler和你自己寫的scheduler分別管不同的pod,可以通過在pod里添加schedulerName字段來實(shí)現(xiàn)。但是,這樣做也會(huì)帶來問題,因?yàn)榧菏欠植际降?,存在cache同步一致性的問題。比如,有這樣一個(gè)pod,提交到k8s,被兩個(gè)scheduler同時(shí)分配到同一個(gè)node上。這樣的問題不是不能解決,但是要花費(fèi)相當(dāng)大的精力。

第三種方法:寫一個(gè)scheduler extender

第四種方法:scheduling framework

在筆者寫這篇文章時(shí)(2020年4月),其實(shí)第三種方法第四種方法看上去都比較實(shí)用,因?yàn)闆]有破壞k8s原有的代碼和架構(gòu),也兼容默認(rèn)的kube-scheduler。但是不知為何,在kubernetes官方文檔里,關(guān)于scheduling這部分


沒有任何關(guān)于scheduler extender的介紹,只有scheduling framework的介紹,而scheduling framework目前還處于alpha版本。目前我們計(jì)劃寫一個(gè)scheduling framework的plugin。

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

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

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