Kubernetes Scheduler淺析

概述

Kubernetes 調度器(Scheduler)是Kubernetes的核心組件;用戶或者控制器建立Pod以後,調度器經過 kubernetes 的 watch 機制來發現集羣中新建立且還沒有被調度到 Node 上的 Pod。調度器會將發現的每個未調度的 Pod 調度到一個合適的 Node 上來運行。調度器會依據下文的調度原則來作出調度選擇。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的部分非注入式分配。
ui

調度是一個優化問題:首先,調度程序肯定可行的放置節點集合,即知足一組給定約束的節點集合。 而後,調度程序肯定可行的節點集合,這是得分最高的可用節點的集合。
3d

Kubernetes Scheduler是確保局部最優的多步調度程序,而不是確保全局最優的單步調度程序。
以下圖所示,並不保證每一個可用node都被分配到pod
對象

Kubernetes Scheduler監視Kubernetes對象存儲並選擇具備最高優先級的未綁定Pod來執行調度步驟或搶佔步驟。blog

調度步驟

對於給定的Pod,若是存在至少一個節點,則啓用調度步驟,以使該節點可用於託管Pod。
若是啓用了「調度步驟」,則調度程序會將Pod綁定到可行的節點,這樣綁定將實現最高的生存能力。
若是未啓用「調度步驟」,則調度程序將嘗試執行搶佔步驟。生命週期

搶佔步驟

對於給定的Pod,若是存在至少一個節點,則啓用搶佔步驟,以便若是要刪除綁定到該節點的優先級較低的Pod子集,則該節點可用於託管Pod。
若是啓用了搶佔步驟,則調度程序將觸發刪除綁定到一個節點的具備較低優先級的Pod子集,搶佔步驟將形成最低的人員傷亡。
(形成的人員傷亡是根據Pod中斷預算(PDB)違規狀況進行評估的)
注意,調度程序不保證觸發搶佔步驟的Pod將在後續的調度步驟中綁定到該節點。資源

一、過濾器

對於每一個Pod,Kubernetes Scheduler都會肯定可行節點的集合,這是知足Pod約束的節點的集合。
從概念上講,Kubernetes Scheduler定義了一組過濾器函數,這些過濾器函數在給定Pod和Node的狀況下,肯定Node是否知足Pod的約束。 全部過濾器函數都必須對節點託管Pod產生true。rem

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反親和性要求。

二、可行性

對於每一個Pod,Kubernetes Scheduler都會肯定可行節點的集合,這是知足Pod約束的節點的集合。 而後,Kubernetes Scheduler肯定具備最高生存能力的可行節點集。
從概念上講,Kubernetes Scheduler定義了一組評估函數,給定Pod和Node,它們肯定Pod和Node對的生存能力。 評分相加。

2.1 首選親和力

此過濾器功能根據Pod的首選Node Affinity條款,Pod Affinity條款和Pod Anti Affinity條款對Node的生存能力進行評估。

更多詳情,請參見官網

相關文章
相關標籤/搜索