k8s驅逐篇(4)-kube-scheduler搶佔調度驅逐
- 2022 年 9 月 15 日
- 筆記
- kubernetes源碼解析, kube-scheduler, k8s驅逐
介紹kube-scheduler搶佔調度驅逐之前,先簡單的介紹下kube-scheduler組件;
kube-scheduler簡介
kube-scheduler組件是kubernetes中的核心組件之一,主要負責pod資源對象的調度工作,具體來說,kube-scheduler組件負責根據調度演算法(包括預選演算法和優選演算法)將未調度的pod調度到合適的最優的node節點上。
kube-scheduler架構圖
kube-scheduler的大致組成和處理流程如下圖,kube-scheduler對pod、node等對象進行了list/watch,根據informer將未調度的pod放入待調度pod隊列,並根據informer構建調度器cache(用於快速獲取需要的node等對象),然後sched.scheduleOne方法為kube-scheduler組件調度pod的核心處理邏輯所在,從未調度pod隊列中取出一個pod,經過預選與優選演算法,最終選出一個最優node,上述步驟都成功則更新cache並非同步執行bind操作,也就是更新pod的nodeName欄位,失敗則進入搶佔邏輯,至此一個pod的調度工作完成。

kube-scheduler搶佔調度驅逐概述
優先順序和搶佔機制,解決的是 Pod 調度失敗時該怎麼辦的問題。
正常情況下,當一個 pod 調度失敗後,就會被暫時 「擱置」 處於 pending 狀態,直到 pod 被更新或者集群狀態發生變化,調度器才會對這個 pod 進行重新調度。
但是有的時候,我們希望給pod分等級,即分優先順序。當一個高優先順序的 Pod 調度失敗後,該 Pod 並不會被「擱置」,而是會「擠走」某個 Node 上的一些低優先順序的 Pod,這樣一來就可以保證高優先順序 Pod 會優先調度成功。
搶佔發生的原因,一定是一個高優先順序的 pod 調度失敗,我們稱這個 pod 為「搶佔者」,稱被搶佔的 pod 為「犧牲者」(victims)。
PDB概述
PDB全稱PodDisruptionBudget,可以理解為是k8s中用來保證Deployment、StatefulSet等控制器在集群中存在的最小副本數量的一個對象。
搶佔調度驅逐功能開啟與關閉配置
kube-scheduler的搶佔調度驅逐功能默認開啟。
在 Kubernetes 1.15+版本,如果 NonPreemptingPriority被啟用了(kube-scheduler組件啟動參數--feature-gates=NonPreemptingPriority=true) ,PriorityClass 可以設置 preemptionPolicy: Never,則該 PriorityClass 的所有 Pod在調度失敗後將不會執行搶佔邏輯。
另外,在 Kubernetes 1.11+版本,kube-scheduler組件也可以配置文件參數設置將搶佔調度功能關閉(注意:不能通過組件啟動命令行參數設置)。
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
...
disablePreemption: true
配置文件通過kube-scheduler啟動參數--config指定。
kube-scheduler搶佔調度驅逐-流程圖
下方處理流程圖展示了kube-scheduler搶佔調度驅逐的核心處理步驟,在開始搶佔邏輯處理之前,會先進行搶佔調度功能是否開啟的判斷。

關於kube-scheduler搶佔調度驅逐的源碼分析,可以查看kube-scheduler源碼分析(3)-搶佔調度分析
