104 - kube-scheduler源碼分析 - predicate整體流程

来源:https://www.cnblogs.com/cloudgeek/archive/2018/12/03/10061029.html
-Advertisement-
Play Games

(註:從微信公眾:CloudGeek複製過來,格式略微錯亂,更好閱讀體驗請移步公眾號,二維碼在文末) 今天我們來跟一下predicates的整個過程;predicate這個詞應該是“斷言、斷定”的意思,在這裡我們姑且翻譯為“預選”,雖然不符合這個單詞的本意,但是在schedule過程中predica ...


(註:從微信公眾:CloudGeek複製過來,格式略微錯亂,更好閱讀體驗請移步公眾號,二維碼在文末)

 

今天我們來跟一下predicates的整個過程;predicate這個詞應該是“斷言、斷定”的意思,在這裡我們姑且翻譯為“預選”,雖然不符合這個單詞的本意,但是在schedule過程中predicate過程做的事情確實還是叫“預選”比較好理解!

上一講我們提到predicate過程的入口在findNodesThatFit這個函數,所以今天我們從這個函數入手,看看這裡面有哪些玄機。這個函數在:pkg/scheduler/core/generic_scheduler.go:289,聲明如下:

 

可以看到有不少參數,我們理一下這些參數都是什麼:

  1. pod *v1.Pod,
    //表示一個pod
  2. nodeNameToInfo map[string]*schedulercache.NodeInfo,
    //NodeInfonode級別的信息集合,裡面包含v1.NodepodsusedPortsnode上的信息;nodeNameToInfo也就是一個nodenameNodeInfo的映射
  3. nodes []*v1.Node,
    //node列表,可用的node集合
  4. predicateFuncs map[string]algorithm.FitPredicate,
    //predicate函數的別名到具體函數的映射,這裡的string類似:PodFitsHostPorts;後面的FitPredicate類型是一個func類型:type FitPredicate func(pod *v1.Pod, meta PredicateMetadata, nodeInfo *schedulercache.NodeInfo) (bool, []PredicateFailureReason, error);這個函數類型判斷一個pod能否跑在一個node
  5. extenders []algorithm.SchedulerExtender,
    //SchedulerExtender是一個介面類型,表示的是一個外部的處理過程,主要用於某些資源不是直接由k8s管理的場景下,調度決策需要外部介入時調用
  6. metadataProducer algorithm.PredicateMetadataProducer,
    //PredicateMetadataProducer是一個函數類型,入參是podnodeNameToInfo,返回值是PredicateMetadataPredicateMetadata是一個interface類型,這個類型表示predicate metadata支持的所有access操作,包含3個函數:ShallowCopy()/AddPod()/RemovePod();這個interface的實現是structpredicateMetadata,這個struct包含podpodPortsserviceAffinityInUse等屬性
  7. ecache *EquivalenceCache,
    //結構體EquivalenceCache主要包含1:一個以node namekeyAlgorithmCachevaluemap2:一個獲取equivalence pod的函數。AlgorithmCache這個結構體存儲了一個lru.Cache類型的屬性,lru是最近最少使用的意思,groupcache里實現的這個Cache
  8. schedulingQueue SchedulingQueue,
    //這個interface保存一個等待被調度的pods隊列,有Add()Pop()等函數
  9. alwaysCheckAllPredicates bool,
    //是否檢查所有的predicate

 

咋看你肯定感覺迷糊,略抓狂,這麼多東西咋個理解呢,,,別急,咱再看一下一個關鍵類型,然後靜下心來往後看完,再回過頭看是不是理解了這裡的所有參數:

1、上面的FitPredicate類型源碼里解釋如下:

// FitPredicate is a function that indicates(標示) if a pod fits into an existing node. The failure information is given by the error.入參有3個,分別是:

  • pod *v1.Pod
  • meta PredicateMetadata
  • nodeInfo *schedulercache.NodeInfo

返回值是:

  • bool
  • []PredicateFailureReason
  • error

也就是說給定一個pod和一個node,這個函數需要判斷這個pod能否跑在這個node上,能否體現在返回值bool類型上;然後如果失敗了,也就是不能的情況,需要返回PredicateFailureReason集合,也就是失敗的原因們。這個PredicateFailureReason是個interface,看一眼定義就很清晰了,特別簡單:

 

ok,我們接著看findNodesThatFit函數的返回值:

1.[]*v1.Node, 

2.FailedPredicateMap, 

//這個返回值是map[string][]algorithm.PredicateFailureReason類型,這個類型就是上面截圖中那個

3.error

 

到這裡我們可以初步判斷findNodesThatFit函數的輸入是一個pod和一堆nodes和xxx,返回值是可以跑這個pod的node集合和xxx,xxx先不考慮,我們專註一下這裡的一個pod和N個node,返回值是M個node,M<=N.

這個函數的邏輯並不複雜,我們撇開裡面主要的子函數podFitsOnNode後過程大致如下圖:

 

 

這裡我們稍微看一下這裡的checkNode函數是怎麼被併發調用的:

如上圖,checkNode是一個函數類型,明顯predicateFuncs都在這個內嵌函數中執行了。這個內嵌函數的調用在截圖的倒數第二行:workqueue.Parallelize(16, len(nodes), checkNode);這個函數的入參是16,nodes的數量,checkNode這個函數,跟進去看一下可以知道這裡的邏輯,不複雜不過挺有意思:

 

上面的workers是16,pieces是node數量,doWorkPiece就是checkNode這個函數,這個函數的參數還記得嗎?是一個int類型的i;ParallelizeUntil這個函數中寫入了pieces個數據到toProcess,也就是node的數量,然後就close掉了這個channal,也就是這個channal被讀完就廢了。然後判斷如果node數量少於workers,也就是少於16的話,則workers=16;最後開了workers個goroutines, 也就是最多16個併發來消費toProcess,也就是最多16個併發來計算N個checkNode任務,每個checkNode任務處理一個node上的predicate functions計算過程。

好,下麵看podFitsOnNode了,先略看函數聲明:

 

可以看到這裡的註釋不少,大致翻譯過來是這個意思:podFitsOnNode檢查一個以NodeInfo形式提供的node是否能夠通過給定的predicate functions篩選;對於一個給定的pod,podFitsOnNode會檢查node上是否有已經存在的等價的pod,如果存在則嘗試儘量重用這個pod緩存的predicate結果信息。這個函數會從2個不同的入口被調用:Schedule and Preempt,當從Schedule進入時,本函數檢測一個node在考慮所有已存在pods和被指定將跑到這個node上是所有更高優先順序或者相同優先順序(和當前要被調度的pod比較)的pod都跑起來的情況下能否跑現在這個被調度的pod.;;;就解釋到這裡,下麵我們還是老規矩,看看入參和返回值:

入參:

  • pod *v1.Pod,
  • meta algorithm.PredicateMetadata,
  • info *schedulercache.NodeInfo,

//上一個函數的nodeNameToInfo[nodeName]獲取到的NodeInfo

  • predicateFuncs map[string]algorithm.FitPredicate,
  • ecache *EquivalenceCache,
  • queue SchedulingQueue,
  • alwaysCheckAllPredicates bool,
  • equivCacheInfo *equivalenceClassInfo,

 

返回值:

  • bool,
  • []algorithm.PredicateFailureReason,

//上層函數返回值中的FailedPredicateMapmap[string][]algorithm.PredicateFailureReason類型

  • error

這裡沒有逐個解釋,基本和上層函數的參數對應得上,findNodesThatFit解釋哪些nodes能夠跑給定的pod,而podFitsOnNode解釋給定node能否跑給定pod.我們先看一下這個過程的簡要流程圖(2次迴圈考慮第一次的情況):

 

看一下代碼:predicateResults := make(map[string]HostPredicate)這一行的string標識predicate名稱,HostPredicate類型是:

 

這個i從0到1只跑2遍的for迴圈中分歧點只有如下這個if:

 

如上,在i為0時調用到了addNominatedPods函數,這個函數把更高或者相同優先順序的pod(待運行到本node上的)信息增加到meta和nodeInfo中,也就是對應考慮這些nominated都Running的場景;後面i為1對應的就是不考慮這些pod的場景。對於這個2遍過程,註釋里是這樣解釋的:

如果這個node上“指定”了更高或者相等優先順序的pods(也就是優先順序不低於本pod的一群pods將要跑在這個node上),我們運行predicates過程當這些pods信息全被加到meta和nodeInfo中的情況。如果所有的predicates過程成功了,我們再次運行這些predicates過程在這些pods信息沒有被加到meta和nodeInfo的情況。這樣第二次過程可能會因為一些pod間的親和性策略過不了(因為這些計劃要跑的pods沒有跑,所以可能親和性被破壞)。這裡其實基於2點考慮:1、有親和性要求的pod如果認為這些nominated pods在,則在這些nominated pods不在的情況下會異常;2、有反親和性要求的pod如果認為這些nominated pods不在,則在這些nominated pods在的情況下會異常。

我們接著看predicate函數主要是怎樣被調用的:

 

如上,predicate是FitPredicate類型的一個對象,也就是對應具體的predicate函數,所以下麵的predicate(pod, metaToUse, nodeInfoToUse)也就對應一個具體的predicate函數的執行。

最後我們瞄一眼具體的predicate函數是怎麼定義的:

一個predicate函數類似這樣:

 

這樣被註冊:

 

紫色部分的常量對應一個個字元串描述:

行,剩下的我們下回分解~

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 《工作細胞》最近比較火,bilibili 上目前的短評已經有17000多條。 先看分析下頁面 右邊 li 標簽中的就是短評信息,一共20條。一般我們載入大量數據的時候,都會做分頁,但是這個頁面沒有,只有一個滾動條。 隨著滾動條往下拉,信息自動載入了,如下圖,變40條了。由此可見,短評是通過非同步載入的 ...
  • 因為工作中慢慢開始用python的協程,所以想更好的理解一下實現方式,故翻譯此文 原文中把辭彙表放到最後,但是我個人覺得放在最開始比較好,這樣可以增加當你看原文時的理解程度 辭彙表 原生協程函數 Native coroutine function: 由async def定義的協程函數,可以使用awa ...
  • 只使用Spring的時候,我把applicationContext.xml是放在項目的src路徑下的,這樣使用ClassPathXmlApplicationContext很方便嘛 整合了struts之後,就讀取不到這個配置文件了,因為Spring會到WEB-INF下來找配置文件, Spring配置文 ...
  • 1.線程列隊 queue隊列 :使用import queue,用法與進程Queue一樣 class queue.Queue(maxsize=0) 1 # 先進先出: 2 q = queue.Queue(3) # 也可以不加數字表示不限 3 q.put('約嗎') 4 q.put('你個糟老頭') 5 ...
  • 題意 "題目鏈接" 求滿足$i^2 + j^2 \% M = 0$的數對$(i, j)$的個數,$1 \leqslant i, j \leqslant 10^9, M \leqslant 1000$ Sol 發這篇博客的目的就是為了證明一下我到底有多菜。 mdzz小學組水題我想了40min都沒想出來 ...
  • 首先我們來講講我們python中的可變對象和不可變對象: 可變對象:該對象指向記憶體中的值是可以改變的。實際上是其所指的值直接發生改變,而不是發生複製,或者開闢一個新的地址空間。例如:列表list,字典dict,集合set。 不可變對象:該對象所指向的記憶體中的值是不能被改變的。當改變一個變數時,由於其 ...
  • 一、多線程 1、1 線程與進程區別 進程:每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。 線程:線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。 總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。多線程的好處是可以提高程式的效率。 一個應用系統可以多個 ...
  • 1.線程,線程創建 概念:在傳統操作系統中,每個進程有一個地址空間,而且預設就有一個控制線程,線程顧名思義,就是一條流水線工作的過程,一條流水線必須屬於一個車間,一個車間的工作過程是一個進程,車間負責把資源整合到一起,是一個資源單位,而一個車間內至少有一個流水線。流水線的工作需要電源,電源就相當於c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...