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

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

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

評論