1. 程式人生 > >Kubernetes Scheduler淺析

Kubernetes Scheduler淺析

### 概述 Kubernetes 排程器(Scheduler)是Kubernetes的核心元件;使用者或者控制器建立Pod之後,排程器通過 kubernetes 的 watch 機制來發現叢集中新建立且尚未被排程到 Node 上的 Pod。排程器會將發現的每一個未排程的 Pod 排程到一個合適的 Node 上來執行。排程器會依據下文的排程原則來做出排程選擇。 kube-scheduler 給一個 pod 做排程選擇包含兩個步驟:過濾、打分 過濾階段會將所有滿足 Pod 排程需求的 Node 選出來。例如,PodFitsResources 過濾函式會檢查候選 Node 的可用資源能否滿足 Pod 的資源請求。在過濾之後,得出一個 Node 列表,裡面包含了所有可排程節點;通常情況下,這個 Node 列表包含不止一個 Node。如果這個列表是空的,代表這個 Pod 不可排程。 打分階段,排程器會為 Pod 從所有可排程節點中選取一個最合適的 Node。根據當前啟用的打分規則,排程器會給每一個可排程節點進行打分。 最後,kube-scheduler 會將 Pod 排程到得分最高的 Node 上。如果存在多個得分最高的 Node,kube-scheduler 會從中隨機選取一個。 本文主要對Kubernetes Scheduler做一個簡單介紹,讓大家理解 Pod 為什麼會被排程到特定的 Node 上。 ### 首先來看下Pod生命週期 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/7ddbb1dcd4e5030d0679921833474034&showdoc=.jpg) ### 排程示意圖 Kubernetes Scheduler的任務是選擇一個Pod放置到Node節點。 放置是一組Pod對一組Node的部分非注入式分配。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/842055a996a8f85b9cefd4e668462412&showdoc=.jpg) 排程是一個優化問題:首先,排程程式確定可行的放置節點集合,即滿足一組給定約束的節點集合。 然後,排程程式確定可行的節點集合,這是得分最高的可用節點的集合。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/c2ae7c32dfdea8b0c37679a782b519aa&showdoc=.jpg) Kubernetes Scheduler是確保區域性最優的多步排程程式,而不是確保全域性最優的單步排程程式。 如下圖所示,並不保證每個可用node都被分配到pod ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/bb4ae343cdc929d4f88576643ef246ee&showdoc=.jpg) Kubernetes Scheduler監視Kubernetes物件儲存並選擇具有最高優先順序的未繫結Pod來執行排程步驟或搶佔步驟。 ### 排程步驟 對於給定的Pod,如果存在至少一個節點,則啟用排程步驟,以使該節點可用於託管Pod。 如果啟用了“排程步驟”,則排程程式會將Pod繫結到可行的節點,這樣繫結將實現最高的生存能力。 如果未啟用“排程步驟”,則排程程式將嘗試執行搶佔步驟。 ### 搶佔步驟 對於給定的Pod,如果存在至少一個節點,則啟用搶佔步驟,以便如果要刪除繫結到該節點的優先順序較低的Pod子集,則該節點可用於託管Pod。 如果啟用了搶佔步驟,則排程程式將觸發刪除繫結到一個節點的具有較低優先順序的Pod子集,搶佔步驟將造成最低的人員傷亡。 (造成的人員傷亡是根據Pod中斷預算(PDB)違規情況進行評估的) 注意,排程程式不保證觸發搶佔步驟的Pod將在後續的排程步驟中繫結到該節點。 ###1、過濾器 對於每個Pod,Kubernetes Scheduler都會確定可行節點的集合,這是滿足Pod約束的節點的集合。 從概念上講,Kubernetes Scheduler定義了一組過濾器函式,這些過濾器函式在給定Pod和Node的情況下,確定Node是否滿足Pod的約束。 所有過濾器函式都必須對節點託管Pod產生true。 ####1.1 可排程性和生命週期階段(Schedulability and Lifecycle) 此過濾器功能根據節點的可排程性和生命週期階段認為該節點可行。 節點條件是通過taints和tolerations考慮的(taints和tolerations後續再介紹)。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/ea54e4bbd5cfa09959343f974450dcd2&showdoc=.jpg) #### 1.2 資源需求和資源可用性(Resource) 此過濾器功能根據Pod的資源要求和Node的資源可用性將Node視為可行。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/1832fcf3801b52570fd09c5d3d4b9d0f&showdoc=.jpg) #### 1.3 節點選擇器(Node Selector) 該過濾器功能根據Pod的節點選擇器值和Node的標籤值將Node視為可行。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/5fb9996365d2420ff74d53ceb2e7f8bb&showdoc=.jpg) #### 1.4 Node Taints and Pod Tolerations 此篩選器功能根據Pod的汙點的鍵值對和Node的Tolerations的鍵值對將Node視為可行。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/2e1db42acf7fed2b35970703d43668a0&showdoc=.jpg) #### 1.5 親和力(Required Affinity) 此過濾器功能根據Pod所需的Node Affinity條件,Pod Affinity條件和Pod Anti Affinity條件將Node視為可行。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/5b3070b8d3e71631c551740874287af0&showdoc=.jpg) - Node Affinity 必須將Pod分配給Node,以使Node的標籤與Pod的Node Affinity Requirements匹配。 此外,不得將Pod分配給節點,以使節點的標籤不符合Pod節點親和性要求。 - Pod Affinity 必須將Pod分配給一個節點,以使節點上至少有一個與TopologyKey匹配的Pod符合Pod的Pod相似性要求。 - Pod Anti-Affinity 必須將Pod分配給節點,以使與TopologyKey匹配的節點上沒有Pod符合Pod的Pod反親和性要求。 ###2、可行性 對於每個Pod,Kubernetes Scheduler都會確定可行節點的集合,這是滿足Pod約束的節點的集合。 然後,Kubernetes Scheduler確定具有最高生存能力的可行節點集。 從概念上講,Kubernetes Scheduler定義了一組評估函式,給定Pod和Node,它們確定Pod和Node對的生存能力。 評分相加。 #### 2.1 首選親和力 此過濾器功能根據Pod的首選Node Affinity條款,Pod Affinity條款和Pod Anti Affinity條款對Node的生存能力進行評估。 ![](http://showdoc.ieasou.cn/server/index.php?s=/api/attachment/visitFile/sign/0aa262747fc60c6109df0fb6e496bb4e&showdoc=.jpg) 更多詳情,請參見[官網](https://kubernetes.io/zh/docs/concepts/scheduling-eviction/kube-scheduler/ "