Scuedulor是K8s的調度器
sheduler 是作為單獨的程序運行的,啟動之后會一直堅挺 API Server,獲取
PodSpec.NodeName
為空的 pod,對每個 pod 都會創建一個 binding,表明該 pod 應該放到哪個節點上
Kubernetes的調度器以插件化形式實現的,方便用戶定制和二次開發。用戶可以自定義調度器並以插件形式與Kubernetes集成,或集成其他調度器,便於調度不同類型的任務。
Kubernetes調度器的源碼位於kubernetes/plugin/中,大體的代碼目錄結構如下所示:
Kubernetes調度器的源碼位於kubernetes/plugin/中,大體的代碼目錄結構如下所示:
kubernetes/plugin/pkg/ `-- scheduler //調度相關的具體實現 |-- algorithm | |-- predicates //節點篩選策略 | `-- priorities //節點打分策略 | `-- util |-- algorithmprovider | `-- defaults //定義默認的調度器
Predicate 預選過程——過濾不滿足條件的節點,滿足要求的節點在第二階段輸出
PodFitsResources
:節點上剩余的資源是否大於 pod 請求的資源PodFitsHost
:如果 pod 指定了 NodeName,檢查節點名稱是否和 NodeName 匹配PodFitsHostPorts
:節點上已經使用的 port 是否和 pod 申請的 port 沖突PodSelectorMatches
:過濾掉和 pod 指定的 label 不匹配的節點NoDiskConflict
:已經 mount 的 volume 和 pod 指定的 volume 不沖突,除非它們都是只讀
如果predicate過程中沒有合適的節點,pod會一直處於pending狀態,直到出現滿足條件的節點
Priorities 第二階段,如果出現多個滿足條件的節點,如何計算優先級?
BalancedResourceAllocation
:節點上 CPU 和 Memory 使用率越接近,權重越高。這個應該和上面的一起使用,不應該單獨使用
ImageLocalityPriority
:傾向於已經有要使用鏡像的節點,鏡像總大小值越大,權重越高
Kubernetes中的調度策略主要分為全局調度與運行時調度2種。其中全局調度策略在調度器啟動時配置,而運行時調度策略主要包括選擇節點(
nodeSelector),節點親和性(nodeAffinity),pod親和與反親和性(podAffinity與podAntiAffinity)。Node Affinity、
podAffinity/AntiAffinity以及后文即將介紹的污點(Taints)與容忍(tolerations)等特性,在Kuberntes1.6中均處於Beta階段。