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