K8s中的批處理任務模塊主要是由Job控制器完成,今天咱們就來關注下其底層的關鍵設計,包括完成狀態、並行模式、並行策略等關鍵機制api
在聊k8s的任務模塊的實現的時候,咱們先看一下傳統的任務系統的設計與實現,而後聊下基於k8s的基礎的概念微信
傳統的任務系統設計主要能夠分爲master(任務分配/故障感知/負載均衡)、Worker(任務執行/任務監控/任務管理)、分佈式協調(etcd等存儲元數據)、任務倉庫(存儲任務的實現好比類或者接口)等幾部分, 從大的部分又能夠切分爲兩個部分管控端(分佈式協調/master/倉庫)、執行端(Worker),傳統的任務系統大概就是這樣併發
一般複雜的就是如何在master如何作任務的負載均衡、任務的快速完成、依賴等管控功能,其次就是如何在worker端實現一個牛x的引擎,能夠支持各類不一樣任務的執行環境和類型的執行負載均衡
k8s中的最小單元調度是Pod,一樣的job控制器調度的最小單元也是Pod, Pod裏面包含容器,以容器爲載體k8s屏蔽了傳統worker模塊的任務執行環境與實現兩個部分,只須要添加一些配置數據,對應的Pod就能夠完成對應的任務的執行分佈式
在k8s中Pod一般被定義爲一個不穩定的單元,即k8s並不保證你的pod在被調度到某一臺機器後就會一直的穩定運行,直到這臺機器下線,這與傳統的系統都不太同樣,基於該特色,Job調度器的調度層其實也是一種面向於終態的設計。ide
大概就先介紹這些,接下來咱們去分析k8s中job的核心實現機制源碼分析
Job控制器的核心實現有幾個關鍵點:並行粒度、完成狀態、並行策略、並行模式、刪除策略,記住這些關鍵點,咱們來一一剖析學習
並行的粒度是指的針對同一任務能夠同時有多少個並行的Pod即同時運行的Pod,Job控制器會根據用戶設定的並行粒度肯定須要同時運行的Podui
在一些批處理調度的系統裏面可能會經過數據分片後,等待全部分片的任務都完成後,來肯定任務的完成狀態,可是在k8s中Job控制器是一個通用的實現, 並且調度層自己也並不關注調度任務的具體數據 因此在k8s中裏面實際上是經過Completion的和backoffLimit來完成狀態轉移的,即經過Completion來肯定須要等待的Pod的完成的數量,而經過backoffLimit肯定到底能夠容許失敗重試的次數,肯定重試多少次就認爲任務失敗了設計
在k8s的job控制器模式介紹中提到四種併發模式, 那實現上是否是真的有四種模式呢,答案是否認的。能夠說k8s的job控制器根本也就不關注是那種模式,模式是應用層本身的設計,而job控制器只負責並行粒度、當前狀態、完成狀態
這裏咱們主要分析下Parallel JOb with a fix completion count和Parallel Job with a work queue的實現來聊聊Job控制器是如何實現的,二者很大的一個區別就是後者不能設置Completions,即不須要設置須要等待多少個Pod完成,爲何一個參數的設定就能夠實現二者模式呢? 答案就是指望的完成數量不一樣,若是Completions不設定,則實際上Job控制器發現有任一一個Pod成功而且當前活躍的Pod的數量爲0,則表示當前任務完成, 該模式主要適用於單次的批任務,即本次批任務的全部Pod任務都完成,一般也意味着本次批任務是有限的集合
而Completions設定爲數量則意味着只須要完成指定數量的批任務,即任務可能相似於流處理模式,本次只指望完成一部分便可,即Completions設定數量的任務
並行策略主要是指的若是咱們指定的Parallelism的數量過大,爲了不單個任務同時建立大量的Job任務對集羣帶來的影響則採用分批逐次遞增的策略,逐步完成並行所須要的Pod的更新
指望計數是k8s中控制器常見的機制,即當控制器進行Pod操做完成後,會設定當前指望的Pod的增長或者刪除的計數,經過指望計數的統計來肯定當前是否須要繼續更新對應的pod, 指望的知足主要來源於兩個地方:informer和當前控制流,informer經過監聽apiserver來感知事件,而當前控制流則主要是在操做Pod失敗的時候,直接更新指望,由於這些操做失敗的Pod並不會從後續的informer中感知到
咱們提到過時望計數來決定是否更新狀態,但這個並不保證一致性,頗有可能由於事件的延遲致使控制器建立了大量的Pod此時就須要基於終態的繼續調整,即須要根據當前的數量來刪除部分的Pod, 刪除策略主要是包含六點:1)未分配優先 2)未運行優先 3)未就緒優先 4)運行時間最短優先 5)重啓次數多優先 6)建立時間較短優先
Job控制器的實現設計上仍是很好玩的,主要是是面向常見的批處理場景,但自己並無考慮優先級、關係、效率、分片等功能,只是一個通用的基礎的任務調度的實現, 當前k8s中還有不少針對不一樣場景的專用任務調度實現,但基於k8s的任務系統設計自己就給咱們下降了不少的複雜度,這也就是雲原生帶來的好處,今天就到這裏,謝謝你們
kubernetes學習筆記地址: https://www.yuque.com/baxiaoshi/tyado3
> 微信號:baxiaoshi2020 > 關注公告號閱讀更多源碼分析文章 > 更多文章關注 www.sreguide.com