Kubernetes的Scheduler是如何工作的
Kubernetes的scheduler是一個獨立的組件,它負(fù)責(zé)監(jiān)視集群中新建的未調(diào)度的Pod,根據(jù)預(yù)定義的調(diào)度策略和集群資源的可用性,選擇最佳的節(jié)點進行調(diào)度。
Scheduler不會立即將Pod調(diào)度到一個節(jié)點上,而是會將Pod調(diào)度到一個未綁定(unbound)狀態(tài)(如果一個Pod是unbound狀態(tài),那么它的狀態(tài)將被列為"Pending")。這樣,kubelet就可以在后續(xù)的時間里為該Pod綁定一個節(jié)點。
下面是Kubernetes Scheduler的工作流程:
- 監(jiān)聽API Server:Kubernetes Scheduler監(jiān)聽API Server的調(diào)度事件,包括新建的未調(diào)度的Pod以及已調(diào)度但未運行的Pod。
- 獲取調(diào)度信息:Scheduler通過API Server獲取未調(diào)度的Pod的調(diào)度信息,包括Pod的資源需求和節(jié)點親和性/反親和性約束等信息。
- 選擇節(jié)點:Scheduler使用調(diào)度算法根據(jù)節(jié)點資源的可用性和約束條件,選擇最佳的節(jié)點進行調(diào)度。調(diào)度算法通??紤]節(jié)點資源的負(fù)載情況、節(jié)點和Pod的親和性/反親和性約束等因素。具體如下:
Scheduler的工作可以分為三個階段:預(yù)選(preemption)、優(yōu)選(prioritization)和選擇(selection)。
- 預(yù)選階段
在預(yù)選階段,Scheduler會對當(dāng)前集群中所有的節(jié)點進行評分,計算每個節(jié)點可以分配給待調(diào)度的Pod的資源是否足夠。如果某個節(jié)點的資源不足以滿足Pod的需求,那么Scheduler會嘗試從該節(jié)點上遷移一些低優(yōu)先級的Pod,以便為高優(yōu)先級的Pod騰出足夠的資源。
- 優(yōu)選階段
在預(yù)選階段完成之后,Scheduler會對所有可用的節(jié)點進行優(yōu)選,選出最適合待調(diào)度的Pod的節(jié)點。在這個階段,Scheduler會為每個節(jié)點計算一個優(yōu)先級值,優(yōu)先級值越高的節(jié)點越有可能被選中。優(yōu)選的算法可以由用戶自定義,Kubernetes提供了一些默認(rèn)的算法。
- 選擇階段
在優(yōu)選階段完成之后,Scheduler會將Pod綁定到被選中的節(jié)點上,完成Pod的調(diào)度工作。如果調(diào)度失敗,Scheduler會繼續(xù)嘗試調(diào)度,直到成功為止。
總體來說,Scheduler的工作流程可以用以下幾個步驟概括:
- 獲取所有待調(diào)度的Pod
- 針對每個Pod進行預(yù)選操作,以確定是否需要遷移其他Pod來釋放資源
- 針對每個Pod進行優(yōu)選操作,以確定最適合的節(jié)點
- 將Pod綁定到被選中的節(jié)點上
4.更新Pod狀態(tài):Scheduler將調(diào)度好的Pod的信息更新到API Server中,同時將Pod的調(diào)度信息發(fā)送到kubelet,讓kubelet啟動Pod所在的容器。
Kubernetes的Scheduler是一個高度可擴展的系統(tǒng),用戶可以自定義調(diào)度算法和插件來滿足自己的需求。