Kubernetes 1.26加入了一項Pod新功能調度閘(Scheduling Gate),當Pod準備完成就能透過調度閘讓調度程式知道,反之當Pod尚未準備完成,調度程式也能夠檢查調度閘的狀態略過該Pod。

當Pod創建時,調度程式需要不斷地嘗試尋找適合該Pod的節點,這個無限循環會一直持續,直到調度程式找到Pod的節點,或是該Pod被刪除。官方提到,當Pod被外部阻塞或其他原因造成Pod長時間無法調度,便會浪費調度周期,依據Pod調度限制的複雜性,一個調度周期可能約為20毫秒或是更久。

因此在較大的規模時,這些被浪費的周期便會明顯影響調度程式的效能,而調度閘便能夠解決這個問題,因為該功能讓新創建的Pod,能夠宣告尚未準備好接受調度的狀態,因此當Pod上存在調度閘時,調度程式便會忽略該Pod,以避免不必要的嘗試,當用戶在叢集安裝Cluster Autoscaler,這些Pod也會被忽略。

而清除調度閘的工作,則是由外部控制器負責,像是配額管理器等外部控制器,將會知道可對Pod進行調度的時機。

官方解釋,調度閘的工作方式與Finalizer相當類似,當spec.schedulingGates欄位不為空值時,Pod將顯示SchedulingGated狀態並且阻擋所有調度。Pod可以在創建時加入多個調度閘,當SchedulingGated欄位被清除時,調度閘就會清除,所有調度閘不用一次全部移除,但是調度程式只會在所有調度閘都被移除後,才會重新考慮Pod的調度。

調度閘其中一個重要使用案例是動態配額管理,由於Kubernetes支援ResourceQuota,但是API伺服器會在Pod創建時強制給予配額,當一個新的Pod超過CPU配額,這個Pod就會被API伺服器拒絕加入佇列,而創建該Pod的程式便會不斷嘗試重新創建。

這個情況可能會讓API伺服器和調度程式負載增加,此時外部控制器ResourceQuota便可對叢集中創建的所有Pod,添加一個檢查調度閘,當有啟動Pod的配額時,管理器才會移除調度閘,調度程式也才會考慮調度該Pod。

熱門新聞

Advertisement