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