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































