k8s-scheduler调度规则
目錄
- 一、預選階段
- 1、第一種類型,叫作 GeneralPredicates。
- 2、第二種類型,是與 Volume 相關的過濾規則。
- 3、第三種類型,是宿主機相關的過濾規則。
- 4、第四種類型,是 Pod 相關的過濾規則。
- 二、優選階段
- 三、調度源碼
- 總結
在 Kubernetes 項目中,默認調度器的主要職責,就是為一個新創建出來的 Pod,尋找一個最合適的節點(Node)。
預選,優選,綁定三個階段
一、預選階段
Kubernetes 中,默認的調度策略有如下三種:
1、第一種類型,叫作 GeneralPredicates。
2、第二種類型,是與 Volume 相關的過濾規則。
3、第三種類型,是宿主機相關的過濾規則。
4、第四種類型,是 Pod 相關的過濾規則。
上面這四種類型的 Predicates,就構成了調度器確定一個 Node 可以運行待調度 Pod 的基本策略。在具體執行的時候, 當開始調度一個 Pod 時,Kubernetes 調度器會同時啟動 16 個 Goroutine,來并發地為集群里的所有 Node 計算 Predicates,最后返回可以運行這個 Pod 的宿主機列表。
二、優選階段
在 預選 階段完成了節點的“過濾”之后,Priorities 階段的工作就是為這些節點打分。這里打分的范圍是 0-10 分,得分最高的節點就是最后被 Pod 綁定的最佳節點。
1、最常用到的一個打分規則,是 LeastRequestedPriority。它的計算方法,可以簡單地總結為如下所示的公式:
2、LeastRequestedPriority 一起發揮作用的,還有 BalancedResourceAllocation。它的計算公式如下所示:
score = 10 -variance(cpuFraction,memoryFraction,volumeFraction)*10其中,每種資源的 Fraction 的定義是 :Pod 請求的資源 / 節點上的可用資源。而 variance 算法的作用,則是計算每兩種資源 Fraction 之間的“距離”。而最后選擇的,則是資源 Fraction 差距最小的節點。所以說,BalancedResourceAllocation 選擇的,其實是調度完成后,所有節點里各種資源分配最均衡的那個節點,從而避免一個節點上 CPU 被大量分配、而 Memory 大量剩余的情況。
3、NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority 這三種 Priority。顧名思義,它們與前面的 PodMatchNodeSelector、PodToleratesNodeTaints 和 PodAffinityPredicate 這三個 Predicate 的含義和計算方法是類似的。但是作為 Priority,一個 Node 滿足上述規則的字段數目越多,它的得分就會越高。
4、在默認 Priorities 里,還有一個叫作 ImageLocalityPriority 的策略。它是在 Kubernetes v1.12 里新開啟的調度規則,即:如果待調度 Pod 需要使用的鏡像很大,并且已經存在于某些 Node 上,那么這些 Node 的得分就會比較高。當然,為了避免這個算法引發調度堆疊,調度器在計算得分的時候還會根據鏡像的分布進行優化,即:如果大鏡像分布的節點數目很少,那么這些節點的權重就會被調低,從而“對沖”掉引起調度堆疊的風險。
三、調度源碼
1、UpdateNodeNameToInfoMap根據node的cache更新信息,如果node已被移除,則將map的對應節點信息刪掉,如果map中不存在節點的信息,將該節點的信息集合加入map中,這些信息集合運用于后期的pod調度的邏輯判斷,對于么個節點,這些信息包括:
a、節點的node資源信息;
b、在該節點上的pod請求和可分配的資源總和,包括cpu、內存、gpu、容許的pod總數、存儲等;
c、內存、磁盤壓力情況;
d、節點上的占用端口;
e、Pod的親和性;
f、節點taints容忍性;
2、findNodesThatFit是schedule的預選,該函數根據配置的 Predicates Policies會返回一組符合Policies的nodes,最后將這組nodes作為優選的輸入。如果經過預選后返回的節點只有一個,那么直接將該節點的名稱返回,如果多余1個,將繼續優選。
priorityMetaProducer獲取pod effect為空或者為PreferNoSchedule,將toleration加入toleration列表,獲取selector與pod相關的rc、rs、service加入到selector列表。獲取pod中container請求的cpu、內存大小綜合,如果container未設定,cpu默認為100,內存默認為209715200。
獲取pod的親和性。
關于PreferNoSchedule、NoSchedule、NoExecute的介紹如下:
對比一個 node 上所有的 taints,忽略掉和 pod 中 toleration 匹配的 taints,遺留下來未被忽略掉的所有 taints 將對 pod 產生 effect。
a、至少有 1 個未被忽略的 taint 且 effect 是 NoSchedule 時,則 k8s 不會將該 pod 調度到這個 node 上
b、不滿足上述場景,但至少有 1 個未被忽略的 taint 且 effect 是 PreferNoSchedule 時,則 k8s 將嘗試不把該 pod 調度到這個 node 上
c、至少有 1 個未被忽略的 taint 且 effect 是 NoExecute 時,則 k8s 會立即將該 pod 從該 node 上驅逐(如果已經在該 node 上運行),或著不會將該 pod 調度到這個 node 上(如果還沒在這個 node 上運行)
總結
調度會獲取pod中container請求的cpu、內存大小,如果container未設定,cpu默認為100,內存默認為209715200,建議合理設置resource request/limit,防止調度不均,節點熱度不同的問題
總結
以上是生活随笔為你收集整理的k8s-scheduler调度规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统分析和设计方法之输出设计和原型化
- 下一篇: Entersekt欢迎Nicolas H