介紹
Kubernetes有兩個概念跟job有關:git
- Job: 負責批量處理短暫的一次性任務,僅執行一次,並保證處理的一個或者多個Pod成功結束。
- CronJob: 負責定時任務,在指定的時間週期運行指定的任務。
Job
Job用於批量處理短暫的一次性任務,並保證指定數量的Pod成功結束。
K8S支持如下幾種方式:github
-
非並行Job:數據庫
- 一般只運行一個Pod,Pod成功結束Job就退出。
-
固定完成次數的並行Job:json
- 併發運行指定數量的Pod,直到指定數量的Pod成功,Job結束。
-
帶有工做隊列的並行Job:api
- 用戶能夠指定並行的Pod數量,當任何Pod成功結束後,不會再建立新的Pod
- 一旦有一個Pod成功結束,而且全部的Pods都結束了,該Job就成功結束。
- 一旦有一個Pod成功結束,其餘Pods都會準備退出。
Job Spec
完整Job字段能夠參考Job。Job有幾個主要參數配合用於指定完成次數,併發運行,錯誤重試等操做:併發
- .spec.completions: 指定job須要成功運行Pods的次數。默認值: 1
- .spec.parallelism: 指定job在任一時刻應該併發運行Pods的數量。默認值: 1
- .spec.activeDeadlineSeconds: 指定job可運行的時間期限,超過期間還未結束,系統將會嘗試進行終止。
- .spec.backoffLimit: 指定job失敗後進行重試的次數。默認是6次,每次失敗後重試會有延遲時間,該時間是指數級增加,最長時間是6min。
已知問題
Issue #54870, .spec.template.spec.restartPolicy設置爲」Onfailure」時,會與.spec.backoffLimit衝突,能夠暫時將restartPolicy設置爲」Never」進行規避。
注1: .spec.activeDeadlineSeconds要比.spec.backoffLimit優先級高,若是時間到了,可是backoffLimit還未到,該Job也會被強制中止。rest
Job模式
Job有幾種典型的模式應用於不一樣的業務場景:code
-
基於Job模版進行擴展:隊列
- 須要先編寫一個通用的Job模版,根據不一樣的參數生成多個Job json/yml文件用於Job的建立,可使用相同的標籤進行Job管理。
-
按每一個工做項目排列的隊列:ip
- 須要用戶提早準備好一個消息隊列服務,好比rabbitMQ,該服務是一個公共組件,每一個工做項目能夠往裏塞任務消息。
- 用戶能夠建立並行Job,須要能適用於該消息隊列,而後從該消息隊列中消費任務,並進行處理直到消息被處理完。
- 該模式下,用戶須要根據項目數量填寫
spec.completions
, 並行數量.spec.parallelism
能夠根據實際狀況填寫。該模式下就是以全部的任務都成功完成了,job纔會成功結束。
-
可變任務數量的隊列:
- 須要用戶提早準備好一個存儲服務來保存工做隊列,好比Redis。每一個項目能夠往該存儲服務填充消息。
- 用戶能夠啓動適用於該工做隊列的多個並行Job,進行消息處理。與前一個Rabbit消息隊列的差別在於,每一個Job任務是能夠知道工做隊列已經空了,這時候即可以成功退出。
- 該模式下,
spec.completions
須要置1, 並行數量.spec.parallelism
能夠根據實際狀況填寫。只要其中有一個任務成功完成,該Job就會成功結束。
- 普通的靜態任務
CronJob
cronJob是基於時間進行任務的定時管理:
- 在特定的時間點運行任務
- 反覆在指定的時間點運行任務:好比定時進行數據庫備份,定時發送電子郵件等等。
CronJob Spec
完整的spec字段,能夠參考CronJob,介紹幾個主要的字段:
- .spec.schedule: 指定任務運行週期,具體格式參考Cron - Wikipedia
- .spec.startingDeadlineSeconds: 指定任務運行的截止時間
- .spec.concurrencyPolicy: 指定任務的併發策略,參數支持Allow、Forbid和Replace。
- .spec.jobTemplate: 指定須要運行的任務,格式同Job。因此其實cronJob是基於Job進行實現。
參考資料