Kubernetes之Job、CronJob詳解

最近學習Kubernetes碰到Job和CronJob,在這裏總結記錄一下。

Job

Job控制器也是Kubernetes中的一個重要的控制器資源,但是它和Deployment、DaemonSet不同的是:Job控制器用於調配pod對象中的運行一次性的任務。

在實踐中可能任務不止運行一次就結束,用戶可以配置它們以串行或並行的方式運行。

Job運行方式

總結起來就是兩種運行方式:並行和串行。

  • 單工作隊列的串行方式:即以多個一次性的作業放式串行執行多次任務,直至滿足期望的次數,可以理解爲並行度爲1的作業執行方式,在某一個時刻至存在一個pod資源。
  • 多工作隊列的並行方式:這種工作方式可以設置任務數、並行度。可以多個任務隊列每個隊列執行一個任務,也可以多個任務隊列每個隊列執行多個任務。

通過以下job創建示例來說明:

apiVersion: batch/v1
kind: Job
metadata:
  name: job-example
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: nginx
        command: ["/bin/sh","-c", "sleep 120"]
        restartPolicy: Never

注意:

  • Job位於API羣組“batch/v1"內。
  • Pod模板的spec.restartPolicy默認爲"Always",這對Job控制器來講並不適用,因此必須指定爲Never或OnFailure。

上述示例是並行式Job,通過spec.parallelism的值進行設置,並通過spec.completion的值設定總任務數。上例中表示已2個隊列運行,總共運行5次任務。

Job擴容

Job控制器的spec.parallelism定義的並行度表示同時運行的Pod對象數,此屬性值支持運行時調整從而改變其隊列總數,實現擴容縮容。

使用" Kubectl scale --replicas"命令擴展:

$ Kubectl scale jobs job-example --replicas=3

Job刪除

Job控制器待其執行結束之後,將不會佔用系統資源。用戶可按需刪除資源,但是存在一些Job控制器的容器無法正常結束,而restartPolicy又定義爲重啓了,那它可能就會一直處於重啓狀態。

Job控制器提供瞭如下兩種方式來防止該類情況:

  • spec.activeDealineSeconds : Job的deadline,用於指定最大活動時間長度,超出此時間長度作業會被終止。。
  • spec.backoffLimit : 將作業標記爲失敗狀態之前的重試次數,默認值爲6。
spec: 
  backoffLimit: 5
  activeDealineSeconds: 100

說了這麼多Job,那CronJob和它有什麼關係呢

CronJob

CronJob控制器是用於管理Job控制器資源的運行時間。

Job控制器定義的作業任務在其控制器資源創建之後便可以立即執行,但是CronJob可以做到類似於Linux操作系統的週期性任務作業計劃(cronTab)的方式控制其運行的時間點和重複運行的方式。包括以下兩種:

  • 在未來某個時間點運行作業一次。
  • 在指定的時間點重複運行作業。

CronJob對象創建

CronJob控制器的spec字段可嵌套使用以下字段:

  • jobTemplate : Job控制器模板,用於爲CronJob控制器生成Job對象;
  • schedule : Cron格式的作業調度運行時間點;
  • concurrencyPolicy : 併發執行策略,可用值有Allow(允許)、Forbid(禁止)和Replace(替換),用於定義前一次作業運行尚未完成時是否和後一次作業一同運行;
  • failedJobHistoryLimit: 爲失敗的任務執行保留歷史記錄數,默認爲1.
  • successfulJobHistoryLimit : 爲成功執行的任務保留歷史記錄,默認值爲3;
  • startingDeadlineSeconds : 因爲各種原因缺乏執行作業的時間點導致的啓動作業錯誤的超時時長,會被記入錯誤歷史記錄;
  • suspend :是否掛起後續的任務執行,默認爲false,對運作中的任務不會產生影響;

通過以下CronJob來說明:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: Cronjob-example
  labels:
    app: mycronjob
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    metadata:
      labels:
        app: mycronjob-jobs
    spec:
      parallelism: 2
      template:
        spec;
          containers:
          - name: myjob
            image: nginx
            command: ["/bin/sh","-c", "sleep 120"]
            restartPolicy: OnFailure

上例創建一個每隔兩分鐘運行一次的簡單CronJob任務。

CronJob的控制機制

CronJob是一個跟高級別的資源,它是以Job控制器資源爲管控對象,並藉助它管理Pod資源對象。

如果作業的重複指定時間比較密集,,而作業執行時間又比較長,則會出現兩個Job對象同時存在的情況。有些Job對象可能會存在無法或不能同時運行的情況,這個時候就要通過 spec.concurrencyPolicy屬性控制作業並存的機制,其默認值爲“Allow",即允許前後Job甚至是屬於同一個CronJob的Job同時運行。其他兩個可用值中,“foebid” 用於禁止前後兩個job同時運行,“Replace” 用於讓後一個代替前一個。

參考書籍《Kubernetes進階實戰》
個人github賬號:https://github.com/SpecialAll

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章