在上一篇安裝篇之后深胳,我們已經(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會篩選掉資源條件不允許的node,比如某個(gè)pod需要1個(gè)gpu資源呐粘,那么scheduler會首先排除掉沒有g(shù)pu的node满俗。
其次转捕,scheduler會篩選掉因其他原因,不能運(yùn)行該pod的node唆垃。
然后五芝,會有一個(gè)打分機(jī)制,根據(jù)各種維度的打分選出最優(yōu)的pod辕万。其中枢步,不同的分?jǐn)?shù)有不同的權(quán)重。
那么渐尿,如果要更改這些機(jī)制醉途,人為添加條件,該如何做呢砖茸?
第一種方法:git clone k8s的官方源碼隘擎,然后修改scheduler,自己編譯k8s
這種方法顯然會帶來非常多的麻煩凉夯,尤其是后期維護(hù)的開銷货葬。我們知道,k8s是允許master和node使用不同版本的k8s運(yùn)行的恍涂,這一點(diǎn)我們可以在get nodes里面觀察到宝惰。如果自行修改源代碼,可靠性難以保證再沧,對整個(gè)集群后期維護(hù)也會埋下隱患尼夺。
第二種方法:自己寫一個(gè)scheduler,和kube-scheduler同時(shí)運(yùn)行炒瘸。
這一種方法的想法是淤堵,默認(rèn)的scheduler和你自己寫的scheduler分別管不同的pod,可以通過在pod里添加schedulerName字段來實(shí)現(xiàn)顷扩。但是拐邪,這樣做也會帶來問題,因?yàn)榧菏欠植际降陌兀嬖赾ache同步一致性的問題扎阶。比如,有這樣一個(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舞丛。