kubernetes scheduler 基本原理算法
kubernetes scheduler 做爲一個單獨的進程部署在 master 節點上,它會 watch kube-apiserver 進程去發現 PodSpec.NodeName 爲空的 Pod,而後根據指定的算法將 Pod 調度到合適的 Node 上,這一過程也叫綁定(Bind)。scheduler 的輸入是須要被調度的 Pod 和 Node 的信息,輸出是通過調度算法篩選出條件最優的 Node,並將該 Pod 綁定到這個 Node 上。以下圖所示:api
scheduler 調度算法分爲兩個階段:函數
預選 (Predicates)3d
根據Predicates策略去濾掉不符合 Policies 的 Node.server
優選 (Priorities)blog
通過 Predicates 剩下的 Node,須要通過Priorities 策略選出一個最優的 Node,並將 Pod 綁定到該 Node 上。根據下面這張調度圖詳細描述下進程
1. 首先 scheduler 根據 predicates 集合過濾掉不符合的 Node。例如,若是 PodSpec 指定的請求資源 (resource requests),那麼 scheduler 會過濾掉沒有足夠資源的 Node。ci
2. 其次 scheduler 會根據 priority functions 集合從 predicates 中過濾出來的 Node 中,選出一個最優的 Node。資源
算法實現:部署
對每個 Node, priority functions 會計算出一個 0-10 之間的數字,表示 Pod 放到該 Node 的合適程度,其中 10 表示很是合適,0 表示不合適,priority functions 集合中的每個函數都有一個權重 (weight),最終的值爲 weight 和 priority functions 的乘積,而一個節點的 weight 就是全部 priority functions 結果的加和。例如,有兩個 priority functions: priorityFunc1 和 priorityFunc2,對應的 weight 分別爲 weight1 和 weight2,那麼 NodeA 的最終得分是:
3. 最終,得分最高的 Node 勝出(若是有多個得分相同的 Node,會隨機的選取一個 Node 做爲最終勝出的 Node)。