在上一篇安裝篇之后,我們已經(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主要作了以下兩個(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。