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