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 會從中隨機選取一個。ide

本文主要對Kubernetes Scheduler作一個簡單介紹,讓你們理解 Pod 爲何會被調度到特定的 Node 上。函數

首先來看下Pod生命週期

Kubernetes Scheduler淺析

調度示意圖

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

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

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

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後續再介紹)。
Kubernetes Scheduler淺析

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

此過濾器功能根據Pod的資源要求和Node的資源可用性將Node視爲可行。
Kubernetes Scheduler淺析

1.3 節點選擇器(Node Selector)

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

1.4 Node Taints and Pod Tolerations

此篩選器功能根據Pod的污點的鍵值對和Node的Tolerations的鍵值對將Node視爲可行。
Kubernetes Scheduler淺析

1.5 親和力(Required Affinity)

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

  • 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的生存能力進行評估。
Kubernetes Scheduler淺析
更多詳情,請參見官網

相關文章
相關標籤/搜索