K8S調(diào)度器Kube-schduler的主要作用是將新創(chuàng)建的Pod調(diào)度到集群中的合適節(jié)點(diǎn)上運(yùn)行。kube-scheduler的調(diào)度算法非常靈活,可以根據(jù)不同的需求進(jìn)行自定義配置,比如資源限制、親和性和反親和性等。 kube-scheduler的工作原理
監(jiān)聽(tīng)API Server:kube-scheduler會(huì)監(jiān)聽(tīng)API Server上的Pod對(duì)象,以獲取需要被調(diào)度的Pod信息。它會(huì)通過(guò)API Server提供的REST API接口獲取Pod的信息,例如Pod的標(biāo)簽、資源需求等信息。
篩選可用節(jié)點(diǎn):kube-scheduler會(huì)根據(jù)Pod的資源需求和約束條件(例如Pod需要的特定節(jié)點(diǎn)標(biāo)簽)篩選出可用的Node節(jié)點(diǎn)。它會(huì)從所有注冊(cè)到集群中的Node節(jié)點(diǎn)中選擇符合條件的節(jié)點(diǎn)。
計(jì)算分值:kube-scheduler會(huì)為每個(gè)可用的節(jié)點(diǎn)計(jì)算一個(gè)分值,以決定哪個(gè)節(jié)點(diǎn)是最合適的。分值的計(jì)算方式可以通過(guò)調(diào)度算法來(lái)指定,例如默認(rèn)的算法是將節(jié)點(diǎn)資源利用率和距離Pod的網(wǎng)絡(luò)延遲等因素納入考慮。
選擇節(jié)點(diǎn):kube-scheduler會(huì)選擇分值最高的節(jié)點(diǎn)作為最終的調(diào)度目標(biāo),并將Pod綁定到該節(jié)點(diǎn)上。如果有多個(gè)節(jié)點(diǎn)得分相等,kube-scheduler會(huì)隨機(jī)選擇一個(gè)節(jié)點(diǎn)。
更新API Server:kube-scheduler會(huì)更新API Server上的Pod對(duì)象,將選定的Node節(jié)點(diǎn)信息寫(xiě)入Pod對(duì)象的spec字段中,然后通知Kubelet將Pod綁定到該節(jié)點(diǎn)上并啟動(dòng)容器。
Kube-scheduler調(diào)度器內(nèi)部流轉(zhuǎn)過(guò)程
Scheduler 通過(guò)注冊(cè) client-go 的 informer 的 handler 方法監(jiān)聽(tīng) api-server 的 pod 和 node 變更事件,從而實(shí)現(xiàn)將 pod 的信息更新 scheduler 的 activeQ,podbackoffQ,unschedulableQ 三個(gè)隊(duì)列中。
帶調(diào)度的 pod 會(huì)進(jìn)入到 activeQ 的調(diào)度隊(duì)列中,activeQ 是一個(gè)維護(hù)著 pod 優(yōu)先級(jí)的堆結(jié)構(gòu),調(diào)度器在調(diào)度循環(huán)中每次從堆中取出優(yōu)先級(jí)最高的 pod 進(jìn)行調(diào)度。
取出的待調(diào)度 pod 會(huì)經(jīng)過(guò)調(diào)度器的一系列調(diào)度算法找到合適的 node 節(jié)點(diǎn)進(jìn)行綁定。如果調(diào)度算法判定沒(méi)有適合的節(jié)點(diǎn),會(huì)將 pod 更新為不可調(diào)度狀態(tài),并扔進(jìn) unschedulable 的隊(duì)列中。
調(diào)度器在執(zhí)行綁定操作的時(shí)候是一個(gè)異步過(guò)程,調(diào)度器會(huì)先在緩存中創(chuàng)建一個(gè)和原來(lái) pod 一樣的 assume pod 對(duì)象用模擬完成節(jié)點(diǎn)的綁定,如將 assume pod 的 nodename 設(shè)置成綁定節(jié)點(diǎn)名稱(chēng),同時(shí)通過(guò)異步執(zhí)行綁定指令操作。
在 pod 和 node 綁定前,scheduler需要確保 volume 已經(jīng)完成綁定操作,確認(rèn)完所有綁定前準(zhǔn)備工作,scheduler 會(huì)向 api-server 發(fā)送一個(gè) bind 對(duì)象,對(duì)應(yīng)節(jié)點(diǎn)的 kubelet 將待綁定的pod在節(jié)點(diǎn)運(yùn)行起來(lái)。
為節(jié)點(diǎn)計(jì)算分值 節(jié)點(diǎn)分值計(jì)算是通過(guò)調(diào)度器算法實(shí)現(xiàn)的,而不是固定的。默認(rèn)情況下,kube-scheduler采用的是DefaultPreemption算法,其計(jì)算分值的方式包括以下幾個(gè)方面:
節(jié)點(diǎn)的資源利用率 kube-scheduler會(huì)考慮每個(gè)節(jié)點(diǎn)的CPU和內(nèi)存資源利用率,將其納入節(jié)點(diǎn)分值的計(jì)算中。資源利用率越低的節(jié)點(diǎn)得分越高。
節(jié)點(diǎn)上的Pod數(shù)目 kube-scheduler會(huì)考慮每個(gè)節(jié)點(diǎn)上已經(jīng)存在的Pod數(shù)目,將其納入節(jié)點(diǎn)分值的計(jì)算中。如果節(jié)點(diǎn)上已經(jīng)有大量的Pod,新的Pod可能會(huì)導(dǎo)致資源競(jìng)爭(zhēng)和擁堵,因此節(jié)點(diǎn)得分會(huì)相應(yīng)降低。
Pod與節(jié)點(diǎn)的親和性和互斥性 kube-scheduler會(huì)考慮Pod與節(jié)點(diǎn)的親和性和互斥性,將其納入節(jié)點(diǎn)分值的計(jì)算中。如果Pod與節(jié)點(diǎn)存在親和性,例如Pod需要特定的節(jié)點(diǎn)標(biāo)簽或節(jié)點(diǎn)與Pod在同一區(qū)域,節(jié)點(diǎn)得分會(huì)相應(yīng)提高。如果Pod與節(jié)點(diǎn)存在互斥性,例如Pod不能與其他特定的Pod共存于同一節(jié)點(diǎn),節(jié)點(diǎn)得分會(huì)相應(yīng)降低。
節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲 kube-scheduler會(huì)考慮節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲,將其納入節(jié)點(diǎn)分值的計(jì)算中。如果節(jié)點(diǎn)之間的網(wǎng)絡(luò)延遲較低,節(jié)點(diǎn)得分會(huì)相應(yīng)提高。
Pod的優(yōu)先級(jí) kube-scheduler會(huì)考慮Pod的優(yōu)先級(jí),將其納入節(jié)點(diǎn)分值的計(jì)算中。如果Pod具有高優(yōu)先級(jí),例如是關(guān)鍵業(yè)務(wù)的部分,節(jié)點(diǎn)得分會(huì)相應(yīng)提高。
這些因素的相對(duì)權(quán)重可以通過(guò)kube-scheduler的命令行參數(shù)或者調(diào)度器配置文件進(jìn)行調(diào)整。需要注意的是,kube-scheduler的算法是可擴(kuò)展的,可以根據(jù)需要編寫(xiě)自定義的調(diào)度算法來(lái)計(jì)算節(jié)點(diǎn)分值。 調(diào)度策略
默認(rèn)調(diào)度策略(DefaultPreemption):默認(rèn)調(diào)度策略是kube-scheduler的默認(rèn)策略,其基本原則是為Pod選擇一個(gè)未滿(mǎn)足需求的最小代價(jià)節(jié)點(diǎn)。如果無(wú)法找到這樣的節(jié)點(diǎn),就會(huì)考慮使用預(yù)選,即將一些已經(jīng)調(diào)度的Pod驅(qū)逐出去來(lái)為新的Pod騰出空間。
帶優(yōu)先級(jí)的調(diào)度策略(Priority):帶優(yōu)先級(jí)的調(diào)度策略基于Pod的優(yōu)先級(jí)對(duì)節(jié)點(diǎn)進(jìn)行排序,優(yōu)先選擇優(yōu)先級(jí)高的Pod。該策略可以通過(guò)設(shè)置Pod的PriorityClass來(lái)實(shí)現(xiàn)。
節(jié)點(diǎn)親和性調(diào)度策略(NodeAffinity):節(jié)點(diǎn)親和性調(diào)度策略基于節(jié)點(diǎn)標(biāo)簽或其他條件,選擇與Pod需要的條件相匹配的節(jié)點(diǎn)。這可以通過(guò)在Pod定義中使用NodeAffinity配置實(shí)現(xiàn)。
Pod 親和性調(diào)度策略(PodAffinity):Pod 親和性調(diào)度策略根據(jù)Pod的標(biāo)簽和其他條件,選擇與Pod相似的其他Pod所在的節(jié)點(diǎn)。這可以通過(guò)在Pod定義中使用PodAffinity配置實(shí)現(xiàn)。
Pod 互斥性調(diào)度策略(PodAntiAffinity):Pod 互斥性調(diào)度策略選擇與Pod不相似的其他Pod所在的節(jié)點(diǎn),以避免同一節(jié)點(diǎn)上運(yùn)行相似的Pod。這可以通過(guò)在Pod定義中使用PodAntiAffinity配置實(shí)現(xiàn)。
資源限制調(diào)度策略(ResourceLimits):資源限制調(diào)度策略選擇可用資源最多的節(jié)點(diǎn),以滿(mǎn)足Pod的資源需求。這可以通過(guò)在Pod定義中使用ResourceLimits配置實(shí)現(xiàn)。
審核編輯:劉清
-
REST
+關(guān)注
關(guān)注
0文章
33瀏覽量
9663 -
API接口
+關(guān)注
關(guān)注
1文章
85瀏覽量
10877 -
調(diào)度器
+關(guān)注
關(guān)注
0文章
98瀏覽量
5496
原文標(biāo)題:這些Kubernetes調(diào)度知識(shí)點(diǎn)你知道嗎
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
leader選舉在kubernetes controller中是如何實(shí)現(xiàn)的
深入探討Linux的進(jìn)程調(diào)度器

用于vGPU的GPU調(diào)度程序
調(diào)度器運(yùn)行的過(guò)程是怎樣的? 它的應(yīng)用有哪些?
電機(jī)實(shí)際的運(yùn)轉(zhuǎn)過(guò)程是怎樣的?
關(guān)于RTT中scheduler線(xiàn)程調(diào)度的學(xué)習(xí)
從零開(kāi)始入門(mén) K8s | 調(diào)度器的調(diào)度流程和算法介紹
Kube-capacity CLI的安裝與用法
Kube Multisensor NodeMCU模塊板

容器進(jìn)程調(diào)度時(shí)是該優(yōu)先考慮CPU資源還是內(nèi)存資源
kube-scheduler v1.21 的調(diào)度流程分析
NVIDIA Triton 系列文章(11):模型類(lèi)別與調(diào)度器-1
Linux調(diào)度器的核心scheduler_tick介紹
重新分配pod節(jié)點(diǎn)

評(píng)論