K8s的調度策略


Scuedulor是K8s的調度器
sheduler 是作為單獨的程序運行的,啟動之后會一直堅挺 API Server,獲取  PodSpec.NodeName為空的 pod,對每個 pod 都會創建一個 binding,表明該 pod 應該放到哪個節點上
 
Kubernetes的調度器以插件化形式實現的,方便用戶定制和二次開發。用戶可以自定義調度器並以插件形式與Kubernetes集成,或集成其他調度器,便於調度不同類型的任務。

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階段。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM