【K8s概念】排程器效能調優
參考:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/scheduler-perf-tuning/
FEATURE STATE: Kubernetes 1.14 [beta]
作為 kubernetes 叢集的預設排程器, kube-scheduler 主要負責將 Pod 排程到叢集的 Node 上。
在一個叢集中,滿足一個 Pod 排程請求的所有 Node 稱之為 可排程 Node。 排程器先在叢集中找到一個 Pod 的可排程 Node,然後根據一系列函式對這些可排程 Node 打分, 之後選出其中得分最高的 Node 來執行 Pod。 最後,排程器將這個排程決定告知 kube-apiserver,這個過程叫做 繫結(Binding)。
這篇文章將會介紹一些在大規模 Kubernetes 叢集下排程器效能優化的方式。
在大規模叢集中,你可以調節排程器的表現來平衡排程的延遲(新 Pod 快速就位) 和精度(排程器很少做出糟糕的放置決策)。
你可以通過設定 kube-scheduler 的 percentageOfNodesToScore 來配置這個調優設定。 這個 KubeSchedulerConfiguration 設定決定了排程叢集中節點的閾值。
設定閾值
percentageOfNodesToScore 選項接受從 0 到 100 之間的整數值。 0 值比較特殊,表示 kube-scheduler 應該使用其編譯後的預設值。 如果你設定 percentageOfNodesToScore 的值超過了 100, kube-scheduler 的表現等價於設定值為 100。
要修改這個值,先編輯 kube-scheduler 的配置檔案 然後重啟排程器。 大多數情況下,這個配置檔案是 /etc/kubernetes/config/kube-scheduler.yaml。
修改完成後,你可以執行
kubectl get pods -n kube-system | grep kube-scheduler
來檢查該 kube-scheduler 元件是否健康。
節點打分閾值
要提升排程效能,kube-scheduler 可以在找到足夠的可排程節點之後停止查詢。 在大規模叢集中,比起考慮每個節點的簡單方法相比可以節省時間。
你可以使用整個叢集節點總數的百分比作為閾值來指定需要多少節點就足夠。 kube-scheduler 會將它轉換為節點數的整數值。在排程期間,如果 kube-scheduler 已確認的可排程節點數足以超過了配置的百分比數量, kube-scheduler 將停止繼續查詢可排程節點並繼續進行 打分階段。
排程器如何遍歷節點 詳細介紹了這個過程。
預設閾值
如果你不指定閾值,Kubernetes 使用線性公式計算出一個比例,在 100-節點叢集 下取 50%,在 5000-節點的叢集下取 10%。這個自動設定的引數的最低值是 5%。
這意味著,排程器至少會對叢集中 5% 的節點進行打分,除非使用者將該引數設定的低於 5。
如果你想讓排程器對叢集內所有節點進行打分,則將 percentageOfNodesToScore 設定為 100。
示例
下面就是一個將 percentageOfNodesToScore 引數設定為 50% 的例子。
apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
algorithmSource:
provider: DefaultProvider
...
percentageOfNodesToScore: 50
調節 percentageOfNodesToScore 引數
percentageOfNodesToScore 的值必須在 1 到 100 之間,而且其預設值是通過叢集的規模計算得來的。 另外,還有一個 50 個 Node 的最小值是硬編碼在程式中。
值得注意的是,該引數設定後可能會導致只有叢集中少數節點被選為可排程節點, 很多節點都沒有進入到打分階段。這樣就會造成一種後果, 一個本來可以在打分階段得分很高的節點甚至都不能進入打分階段。
由於這個原因,這個引數不應該被設定成一個很低的值。 通常的做法是不會將這個引數的值設定的低於 10。 很低的引數值一般在排程器的吞吐量很高且對節點的打分不重要的情況下才使用。 換句話說,只有當你更傾向於在可排程節點中任意選擇一個節點來執行這個 Pod 時, 才使用很低的引數設定。
排程器做排程選擇的時候如何覆蓋所有的 Node
如果你想要理解這一個特性的內部細節,那麼請仔細閱讀這一章節。
在將 Pod 排程到節點上時,為了讓叢集中所有節點都有公平的機會去執行這些 Pod, 排程器將會以輪詢的方式覆蓋全部的 Node。 你可以將 Node 列表想象成一個數組。排程器從陣列的頭部開始篩選可排程節點, 依次向後直到可排程節點的數量達到 percentageOfNodesToScore 引數的要求。 在對下一個 Pod 進行排程的時候,前一個 Pod 排程篩選停止的 Node 列表的位置, 將會來作為這次排程篩選 Node 開始的位置。
如果叢集中的 Node 在多個區域,那麼排程器將從不同的區域中輪詢 Node, 來確保不同區域的 Node 接受可排程性檢查。如下例,考慮兩個區域中的六個節點:
Zone 1: Node 1, Node 2, Node 3, Node 4
Zone 2: Node 5, Node 6
排程器將會按照如下的順序去評估 Node 的可排程性:
Node 1, Node 5, Node 2, Node 6, Node 3, Node 4
在評估完所有 Node 後,將會返回到 Node 1,從頭開始。
作者:Varden 出處:http://www.cnblogs.com/varden/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。