摘要:調(diào)度擴(kuò)展自帶了一個(gè)默認(rèn)調(diào)度器,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場景下可以滿足要求。我們就需要對(duì)調(diào)度器進(jìn)行擴(kuò)展,以達(dá)到調(diào)度適合業(yè)務(wù)場景的目的。可以參考故采用第三種實(shí)現(xiàn)擴(kuò)展調(diào)度程序的方案。以保證和擴(kuò)展調(diào)度程序的通信。
kube-scheduler調(diào)度擴(kuò)展
Kubernetes 自帶了一個(gè)默認(rèn)調(diào)度器kube-scheduler,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場景下可以滿足要求。但是在一些特殊場景下,默認(rèn)調(diào)度器不能滿足我們復(fù)雜的調(diào)度需求。我們就需要對(duì)調(diào)度器進(jìn)行擴(kuò)展,以達(dá)到調(diào)度適合業(yè)務(wù)場景的目的。
背景中間件redis容器化后,需要兩主不能在同一個(gè)節(jié)點(diǎn)上,一對(duì)主從不能在同一節(jié)點(diǎn)上;elasticsearch容器化后,兩個(gè)data實(shí)例不能在同一節(jié)點(diǎn)上。在這類場景下,默認(rèn)調(diào)度器內(nèi)置的預(yù)選、優(yōu)選算法不能滿足需求,我們有以下三種選擇:
將新的調(diào)度算法添加到默認(rèn)調(diào)度程序中,并重新編譯鏡像,最終該鏡像運(yùn)行的實(shí)例作為kubernetes集群調(diào)度器;
參考kube-scheduler實(shí)現(xiàn)滿足自己業(yè)務(wù)場景的調(diào)度程序,并編譯鏡像,將該程序作為獨(dú)立的調(diào)度器運(yùn)行到kubernetes集群內(nèi),需要用該調(diào)度器調(diào)度的pod實(shí)例,在spec.schedulerName里指定該調(diào)度器;
實(shí)現(xiàn)“調(diào)度擴(kuò)展程序“:默認(rèn)調(diào)度器kube-scheduler在進(jìn)行預(yù)選時(shí)會(huì)調(diào)用該擴(kuò)展程序進(jìn)行過濾節(jié)點(diǎn);在優(yōu)選時(shí)會(huì)調(diào)用該擴(kuò)展程序進(jìn)行給節(jié)點(diǎn)打分,或者在bind操作時(shí),調(diào)用該擴(kuò)展器進(jìn)行bind操作。
對(duì)上述三種方式進(jìn)行評(píng)估:
第一種:將自己的調(diào)度算法添加到默認(rèn)調(diào)度器kube-scheduler中,對(duì)原生代碼侵入性較高,而且隨著kubernetes版本升級(jí),維護(hù)成本也較高;
第二種:默認(rèn)調(diào)度器里內(nèi)置了很多優(yōu)秀調(diào)度算法,如:檢查節(jié)點(diǎn)資源是否充足;端口是否占用;volume是否被其他pod掛載;親和性;均衡節(jié)點(diǎn)資源利用等,如果完全使用自己開發(fā)的調(diào)度器程序,可能在達(dá)到了實(shí)際場景調(diào)度需求同時(shí),失去更佳的調(diào)度方案,除非集成默認(rèn)調(diào)度器中的算法到自己獨(dú)立調(diào)度程序中,但這無疑是不現(xiàn)實(shí)的;
第三種:通過啟動(dòng)參數(shù)的policy配置,選用某些默認(rèn)調(diào)度器中的預(yù)選、優(yōu)選調(diào)度算法的同時(shí),也可以調(diào)用外部擴(kuò)展調(diào)度程序的算法,計(jì)算得到最優(yōu)的調(diào)度節(jié)點(diǎn),無需修改kube-scheduler代碼,只需要在啟動(dòng)參數(shù)中增加配置文件即可將默認(rèn)調(diào)度程序和擴(kuò)展調(diào)度程序相互關(guān)聯(lián)。
可以參考:
https://github.com/kubernetes...
故采用第三種:實(shí)現(xiàn)擴(kuò)展調(diào)度程序的方案。
整體架構(gòu)kube-scheduler在調(diào)度pod實(shí)例時(shí),首先獲取到Node1、Node2、Node3三個(gè)節(jié)點(diǎn)信息,進(jìn)行默認(rèn)的預(yù)選階段,篩選滿足要求的節(jié)點(diǎn),其次再調(diào)用擴(kuò)展程序中的預(yù)選算法,選出剩下的節(jié)點(diǎn),假設(shè)預(yù)選階段Node3上資源不足被過濾掉,預(yù)選結(jié)束后只剩Node1和Node2;Node1和Node2進(jìn)入kube-scheduler默認(rèn)的優(yōu)選階段進(jìn)行節(jié)點(diǎn)打分,其次再調(diào)用擴(kuò)展調(diào)度程序中的優(yōu)選算法進(jìn)行打分,kube-scheduler會(huì)將所有算法的打分結(jié)果進(jìn)行加權(quán)求和,獲得分?jǐn)?shù)最高的節(jié)點(diǎn)作為pod最終bind節(jié)點(diǎn),然后kube-scheduler調(diào)用apiserver進(jìn)行bind操作。
實(shí)現(xiàn)步驟 實(shí)現(xiàn)擴(kuò)展調(diào)度程序代碼編寫擴(kuò)展調(diào)度器程序代碼,根據(jù)實(shí)際業(yè)務(wù)調(diào)度場景編寫預(yù)選邏輯、優(yōu)選邏輯:
實(shí)現(xiàn)預(yù)選接口,入?yún)閟chedulerapi.ExtenderArgs,出參為schedulerapi.ExtenderFilterResult:
實(shí)現(xiàn)優(yōu)選接口,入?yún)閟chedulerapi.ExtenderArgs,出參為schedulerapi.HostPriorityList:
暴露http接口:
參考:
https://github.com/ll83744879...
默認(rèn)調(diào)度器部署由于kubernetes集群內(nèi)已經(jīng)有了一個(gè)名為default-scheduler的默認(rèn)調(diào)度器,為了不影響集群正常調(diào)度功能,下面會(huì)創(chuàng)建一個(gè)名為my-kube-scheduler的調(diào)度器,這個(gè)調(diào)度器和default-scheduler除了啟動(dòng)參數(shù)不一樣外,鏡像無差別。
1、創(chuàng)建一個(gè)名為my-scheduler-config的configmaps,data下的config.yaml文件指定了調(diào)度器的一些參數(shù),包括leader選舉,調(diào)度算法策略的選擇(指定另一個(gè)configmaps),以及指定調(diào)度器的名稱為my-kube-scheduler。
相應(yīng)的創(chuàng)建一個(gè)my-scheduler-policy的configmaps,里面指定了選擇哪些預(yù)選、優(yōu)選策略,以及外部擴(kuò)展調(diào)度程序的urlPrefix、擴(kuò)展預(yù)選URI、擴(kuò)展優(yōu)選URI、擴(kuò)展pod優(yōu)先級(jí)搶占URI、擴(kuò)展bind URI、擴(kuò)展優(yōu)選算法的權(quán)重等。
以保證my-kube-scheduler和擴(kuò)展調(diào)度程序的通信。
apiVersion: v1 kind: ConfigMap metadata: name: my-scheduler-config namespace: kube-system data: config.yaml: | apiVersion: kubescheduler.config.k8s.io/v1alpha1 kind: KubeSchedulerConfiguration schedulerName: my-kube-scheduler algorithmSource: policy: configMap: namespace: kube-system name: my-scheduler-policy leaderElection: leaderElect: false lockObjectName: my-kube-scheduler lockObjectNamespace: kube-system --- apiVersion: v1 kind: ConfigMap metadata: name: my-scheduler-policy namespace: kube-system data: policy.cfg : | { "kind" : "Policy", "apiVersion" : "v1", "predicates" : [ {"name" : "PodFitsHostPorts"}, {"name" : "PodFitsResources"}, {"name" : "NoDiskConflict"}, {"name" : "MatchNodeSelector"}, {"name" : "HostName"} ], "priorities" : [ {"name" : "LeastRequestedPriority", "weight" : 1}, {"name" : "BalancedResourceAllocation", "weight" : 1}, {"name" : "ServiceSpreadingPriority", "weight" : 1}, {"name" : "EqualPriority", "weight" : 1} ], "extenders" : [{ "urlPrefix": "http://10.168.107.12:80/scheduler", "filterVerb": "predicates/always_true", "prioritizeVerb": "priorities/zero_score", "preemptVerb": "preemption", "bindVerb": "", "weight": 1, "enableHttps": false, "nodeCacheCapable": false }], "hardPodAffinitySymmetricWeight" : 10 }
2、在my-kube-scheduler yaml文件中將configmaps:my-scheduler-config以文件的形式掛載到容器內(nèi)/my-scheduler目錄下,并在啟動(dòng)參數(shù)中指定--config=/my-scheduler/config.yaml,使用和默認(rèn)調(diào)度器一樣的鏡像。
增加掛載:
擴(kuò)展調(diào)度器鏡像制作和部署1、編譯擴(kuò)展調(diào)度程序my-scheduler-extender鏡像,以下為Dockerfile:
推送my-scheduler-extender鏡像到harbor:
2、創(chuàng)建外部擴(kuò)展程序my-scheduler-extender的deployment,如下為yaml描述:
apiVersion: apps/v1 kind: Deployment metadata: name: my-scheduler-extender namespace: kube-system labels: app: my-scheduler-extender spec: replicas: 1 selector: matchLabels: app: my-scheduler-extender template: metadata: labels: app: my-scheduler-extender spec: containers: - name: my-scheduler-extender image: 192.168.26.46/k8s-deploy/my-scheduler-extender:v1.0 imagePullPolicy: Always livenessProbe: httpGet: path: /version port: 80 readinessProbe: httpGet: path: /version port: 80 ports: - containerPort: 80驗(yàn)證
查看my-kube-scheduler pod日志,加載到了policy里的extender信息,獲取到了擴(kuò)展調(diào)度器的接口地址:
創(chuàng)建一個(gè)nginx的pod,指定schedulerName為my-kube-scheduler:
查看擴(kuò)展調(diào)度器pod日志,發(fā)現(xiàn)默認(rèn)調(diào)度器會(huì)調(diào)用extender擴(kuò)展調(diào)度器,如下為extender日志打印的入?yún)ⅰ⒊鰠ⅲ?/p>
從而可以通過編寫擴(kuò)展調(diào)度程序,對(duì)默認(rèn)調(diào)度器的預(yù)選和優(yōu)選算法進(jìn)行擴(kuò)展。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/32975.html
摘要:調(diào)度擴(kuò)展自帶了一個(gè)默認(rèn)調(diào)度器,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場景下可以滿足要求。我們就需要對(duì)調(diào)度器進(jìn)行擴(kuò)展,以達(dá)到調(diào)度適合業(yè)務(wù)場景的目的。可以參考故采用第三種實(shí)現(xiàn)擴(kuò)展調(diào)度程序的方案。以保證和擴(kuò)展調(diào)度程序的通信。 kube-scheduler調(diào)度擴(kuò)展 Kubernetes 自帶了一個(gè)默認(rèn)調(diào)度器kube-scheduler,其內(nèi)置了很多節(jié)點(diǎn)預(yù)選和優(yōu)選的調(diào)度算法,一般調(diào)度場景...
摘要:代碼的組織結(jié)構(gòu)中,仍然是作為一個(gè)放在代碼中,在根目錄下的目錄中,目錄是其編譯入口,目錄是其主要核心代碼。而如果通過指定啟動(dòng),參數(shù)中的算法都來自的方法。登記時(shí)會(huì)提供自己本身包含的兩類算法的集合。 kube-scheduler代碼的組織結(jié)構(gòu)(ver:1.9.2) 1.9中,kube-scheduler仍然是作為一個(gè)plugin放在k8s代碼中,在k8s根目錄下的plugin目錄中,cmd/...
摘要:我們要學(xué)習(xí),就有首先了解的技術(shù)范圍基礎(chǔ)理論知識(shí)庫等,要學(xué)習(xí),肯定要有入門過程,在這個(gè)過程中,學(xué)習(xí)要從易到難,先從基礎(chǔ)學(xué)習(xí)。組件組件一個(gè)集群是由一組被稱為節(jié)點(diǎn)的機(jī)器或虛擬機(jī)組成,節(jié)點(diǎn)有兩種類型。我們要學(xué)習(xí) Kubernetes,就有首先了解 Kubernetes 的技術(shù)范圍、基礎(chǔ)理論知識(shí)庫等,要學(xué)習(xí) Kubernetes,肯定要有入門過程,在這個(gè)過程中,學(xué)習(xí)要從易到難,先從基礎(chǔ)學(xué)習(xí)。 接...
摘要:簡稱,是在年發(fā)布的一個(gè)開源項(xiàng)目。網(wǎng)絡(luò)要能夠通信,必須部署網(wǎng)絡(luò),是其中一個(gè)可選方案。最常使用,可以管理多個(gè)副本,并確保按照期望的狀態(tài)運(yùn)行,底層調(diào)用。用于每個(gè)最多只運(yùn)行一個(gè)副本的場景。 Kubernetes 簡稱 k8s,是 google 在 2014 年發(fā)布的一個(gè)開源項(xiàng)目。 Kubernetes 解決了哪些問題? 真實(shí)的生產(chǎn)環(huán)境應(yīng)用會(huì)包含多個(gè)容器,而這些容器還很可能會(huì)跨越多個(gè)服務(wù)器主機(jī)部...
摘要:又因?yàn)槭枪雀璩銎返?,依賴了很多谷歌自己的鏡像,所以對(duì)于國內(nèi)的同學(xué)環(huán)境搭建的難度又增加了一層。 帶著問題學(xué) Kubernetes 架構(gòu) 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog 打開這篇文章的同學(xué),想必對(duì) docker 都不會(huì)陌生。docker 是一種虛擬容器技術(shù),它上手比較簡單,只需在宿主機(jī)上起一個(gè) docke...
閱讀 1374·2021-11-15 11:37
閱讀 2323·2021-09-30 09:55
閱讀 4780·2021-09-22 15:51
閱讀 3848·2021-09-22 15:46
閱讀 2838·2019-08-30 15:52
閱讀 555·2019-08-29 16:20
閱讀 2958·2019-08-29 15:12
閱讀 1225·2019-08-26 18:27