Kubernetes Scheduler淺析

空殼先生發表於2020-10-29

概述

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生命週期

排程示意圖

Kubernetes Scheduler的任務是選擇一個Pod放置到Node節點。 放置是一組Pod對一組Node的部分非注入式分配。

排程是一個優化問題:首先,排程程式確定可行的放置節點集合,即滿足一組給定約束的節點集合。 然後,排程程式確定可行的節點集合,這是得分最高的可用節點的集合。

Kubernetes Scheduler是確保區域性最優的多步排程程式,而不是確保全域性最優的單步排程程式。
如下圖所示,並不保證每個可用node都被分配到pod

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後續再介紹)。

1.2 資源需求和資源可用性(Resource)

此過濾器功能根據Pod的資源要求和Node的資源可用性將Node視為可行。

1.3 節點選擇器(Node Selector)

該過濾器功能根據Pod的節點選擇器值和Node的標籤值將Node視為可行。

1.4 Node Taints and Pod Tolerations

此篩選器功能根據Pod的汙點的鍵值對和Node的Tolerations的鍵值對將Node視為可行。

1.5 親和力(Required Affinity)

此過濾器功能根據Pod所需的Node Affinity條件,Pod Affinity條件和Pod Anti Affinity條件將Node視為可行。

  • 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的生存能力進行評估。

更多詳情,請參見官網