在Kubernetes體系內,Pod構成了工作負載調度的核心單元。當創建工作負載時,調度系統會自動為Pod分配合理的位置,例如將它們分散到資源充裕的節點上。盡管調度器的默認設置足以應對許多基礎需求,但在特定場景下,用戶可能希望對Pod的部署位置進行更為精細的控制。為此,Kubernetes提供了在工作負載定義中自定義調度策略的功能。具體示例如下:
將前端與后端應用部署在同一位置,有助于縮減延遲,因為它們可以共享物理資源。
某些應用需部署在特定節點上,以確保關鍵應用始終運行在最優硬件或配置上。
不同應用部署在不同節點上,有助于實現應用隔離,防止問題擴散。
Kubernetes中Pod調度策略
節點選擇(nodeSelector):這是最簡單的調度方式,通過節點標簽選擇目標節點,僅將Pod調度到擁有特定標簽的節點。參考指引:設置負載的節點選擇器(nodeSelector)
節點親和性(nodeAffinity):節點親和性不僅具備nodeSelector的功能,而且更為強大。它允許您根據節點標簽使用標簽選擇器篩選親和節點,支持必須滿足和盡量滿足的規則。參考指引:設置節點親和調度(nodeAffinity)
工作負載親和性/反親和性(podAffinity/podAntiAffinity):根據工作負載標簽,使用標簽選擇器篩選親和/反親和的Pod,并將新工作負載調度/不調度至目標Pod所在節點(或節點組),同樣支持必須滿足和盡量滿足的規則。參考指引:設置工作負載親和/反親和調度(podAffinity/podAntiAffinity)
注意
- 若同時指定nodeSelector和nodeAffinity,則兩者條件均需滿足,Pod才能被調度到候選節點。
在大規模集群中,由于工作負載親和性和反親和性需要額外計算時間,可能會顯著降低調度速度,因此不建議在包含數百個節點的集群中使用節點親和性調度策略。
親和性規則
基于節點親和性或工作負載親和性/反親和性的調度策略還可以設定硬約束(必須滿足)和軟約束(盡量滿足),以適應更復雜的調度場景。
必須滿足
requiredDuringSchedulingIgnoredDuringExecution:硬約束,調度器僅在規則滿足時執行調度。
盡量滿足
preferredDuringSchedulingIgnoredDuringExecution:軟約束,調度器會嘗試尋找滿足規則的目標對象,即使找不到匹配對象,也會調度Pod。在使用時,可為每個實例設置weight字段(1-100),權重越高,調度優先級越高。
參考指引:設置節點親和調度(nodeAffinity)、設置工作負載親和/反親和調度(podAffinity/podAntiAffinity)
注意
在親和規則中,requiredDuringScheduling或preferredDuringScheduling表示調度時需強制滿足或盡量滿足定義的標簽規則;IgnoredDuringExecution表示若節點標簽在Pod調度后變更,Pod將繼續運行而不會重新調度,但kubelet重啟時會重新校驗節點親和性規則,并可能將Pod調度至其他節點。
標簽選擇器
在創建調度策略時,需使用標簽選擇器的邏輯運算符篩選標簽值,確定親和/反親和對象。
key:標簽鍵名,滿足條件的對象需包含此鍵名的標簽,且標簽值需滿足標簽值列表(values字段)和邏輯運算符的關系。
operator:使用邏輯運算符確定標簽值的篩選規則,運算符包括:
In:親和/反親和對象的標簽在標簽值列表中。
NotIn:親和/反親和對象的標簽不在標簽值列表中。
Exists:親和/反親和對象存在指定標簽名(無需填寫標簽值列表)。
DoesNotExist:親和/反親和對象不存在指定標簽名(無需填寫標簽值列表)。
Gt(僅節點親和性):調度節點的標簽值大于列表值(字符串比較)。
Lt(僅節點親和性):調度節點的標簽值小于列表值(字符串比較)。
values:標簽值的列表。
示例:對象需包含鍵名為topology.kubernetes.io/zone的標簽,且標簽值為az1或az2
matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- az1
- az2