深刻K8S Job(一):介紹

介紹

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進行實現。

參考資料

相關文章
相關標籤/搜索