k8s 關於Job與Cronjob


在Kubernetes 中通過創建工作負載資源 Job 可完成大型計算以及一些批處理任務。比如 Job 轉碼文件、獲取部分文件和目錄,機器學習中的訓練任務等。這篇小作文我們一起來了解 k8s 中關於 job、cronjob 的內容。


Job創建

我們可以通過API版本 batch/v1創建出一個簡單的k8s Job

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: command-job
spec:
  template:
    spec:
      containers:
      - name: command-job
        image: busybox
        command: ["/bin/sh","-c","sleep 5;echo 'job one'"]
      restartPolicy: Never

Job對象 將會啟動一個pod用於完成我們的工作--睡眠5s,接着輸出 job one

應用job定義,查看job工作工作狀態:

$ kubectl apply -f new-job.yml 
job.batch/command-job created

image-20211023220152228

任務完成后,pod狀態被置為Completed:

image-20211023220112509

通過logs查看我們的任務執行結果:

image-20211023220329267


Job重啟與失敗認定

在上面我們的例子中,job pod順利的完成了我們的任務。當pod在執行作業時,容器可能會由於一些原因啟動失敗,比如進程以非0代碼退出或超出內存限制等。在pod模板中可以通過restartPolicy控制job pod的重啟策略。

重啟策略(restartPolicy):

  • Never:pod啟動失敗時不會重啟,而是通過job-controller重新創建pod供節點調度。
  • OnFailure:pod將會在節點重啟執行任務。

失敗回退策略(backoffLimit):

當Job pod 經過多次重啟無果,顯然我們應該認定這個Job是一個失敗任務,默認失敗認定重啟次數為6,我們可以通過在spec中添加backoffLimit來改變這一認定。

我們調整new-job.yml如下:

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: command-job-two
spec:
  template:
    spec:
      containers:
      - name: command-job-two
        image: busybox
        command: ["/bin/sh","-c","sleep 5;echo 'job two';exit 1"]
      restartPolicy: Never
  backoffLimit: 2

我們通過describe查看創建的Job

image-20211023224555309

job-controller經過2次重建pod達到閾值,job-controller認定本次Job為失敗工作流。

image-20211023223943399

在重啟策略為Never時,認定失敗的Job會將pod遺留在節點上。


Job 期限與清理

除了Job執行結束與重啟失敗認定的Job 終止外還可以通過配置活躍期限(activeDeadlineSeconds)來自動停止Job任務。

我們可以為 Job 的 .spec.activeDeadlineSeconds 設置一個秒數值。 該值適用於 Job 的整個生命期,無論 Job 創建了多少個 Pod。 一旦 Job 運行時間達到 activeDeadlineSeconds 秒,其所有運行中的 Pod 都會被終止,並且 Job 的狀態更新為 type: Failedreason: DeadlineExceeded

注意 Job 的 .spec.activeDeadlineSeconds 優先級高於其 .spec.backoffLimit 設置。 因此,如果一個 Job 正在重試一個或多個失效的 Pod,該 Job 一旦到達 activeDeadlineSeconds 所設的時限即不再部署額外的 Pod,即使其重試次數還未 達到 backoffLimit 所設的限制。

調整new-job.yml如下:

#new-job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: command-job-three
spec:
  template:
    spec:
      containers:
      - name: command-job-three
        image: busybox
        command: ["/bin/sh","-c","sleep 50;echo 'job three'"]
      restartPolicy: Never
  backoffLimit: 2
  activeDeadlineSeconds: 10

雖然是50s的任務,但是由於activeDeadlineSeconds的限制,Job運行10s后被終止

image-20211023231642032

清理job和終止相似,我們可以通過添加spec.ttlSecondsAfterFinished使Job在任務完成后一段時間內被清理,讀者感興趣可動手嘗試一下。


Job 任務類型

  • 非並行 Job

    通常只啟動一個 Pod,除非該 Pod 失敗,Pod中應用成功運行完成即視為Job任務為完成狀態,我們上面討論的任務即屬於此類。

  • **並行 Job **

    • 指定任務數的並行 Job

      通過spec.completions指定任務數,一旦所有 Pod 成功完成它的任務. 作業將完成。

      我們添加一個new-jobs.yml,並指定completions為3

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: command-jobs
      spec:
        template:
          spec:
            containers:
            - name: command-jobs
              image: busybox
              command: ["/bin/sh","-c","sleep 50;echo 'jobs '"]
            restartPolicy: Never
        backoffLimit: 2
        completions: 3
      

      當3個Pod都運行完成時,Job狀態為成功執行。

    image-20211023235914663

    我們可以從Job pod 運行過程中看到次模式中Pod 創建存在先后順序,即需要等待一個job完成后,開啟下一個Job的運行。

    • 工作隊列式的並行 Job

      一旦一個 Pod 成功終止則所有 Pod 都都終止,此時Job 成功完成。

      修改new-jobs.yml,並添加parallelism使其並行數為5

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: command-jobs
      spec:
        template:
          spec:
            containers:
            - name: command-jobs
              image: busybox
              command: ["/bin/sh","-c","sleep 50;echo 'jobs '"]
            restartPolicy: Never
        backoffLimit: 2
        parallelism: 5
      
      

      此類Job Pod在同一時間創建和結束。

      image-20211024005056600


Cronjob周期性任務

CronJob 用於執行周期性的動作,例如備份、郵件、報告生成等。

cron時間配置與linux crontab相似。

#      ┌────────────────── 時區 (可選)
#      |      ┌───────────── 分鍾 (0 - 59)
#      |      │ ┌───────────── 小時 (0 - 23)
#      |      │ │ ┌───────────── 月的某天 (1 - 31)
#      |      │ │ │ ┌───────────── month (1 - 12)
#      |      │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系統上,7 也是星期日)
#      |      │ │ │ │ │                                
#      |      │ │ │ │ │
#      |      │ │ │ │ │
# CRON_TZ=UTC * * * * *

添加cronjob.yml如下:

#cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob
            image: busybox
            command: ["/bin/sh","-c","date"]
          restartPolicy: Never

我們通過cronjob沒隔一分鍾打印一次日期。

查看cronjob信息:

image-20211024013232637

通過logs查看任務結果:

[docker@localhost yml]$ kubectl logs cronjob-1635010680-n5gxj
Sat Oct 23 17:38:15 UTC 2021

cronjob可以自動清理任務,默認保留3次成功的任務,我們可以通過添加.spec.successfulJobsHistoryLimit改變保留的歷史任務信息即Pod。


以上我們將k8s中Job、Cronjob涉及的大部分內容進行了介紹。

參考:

Job

Running Automated Tasks with a CronJob

希望小作文對你有些許幫助,如果內容有誤請指正。

您可以隨意轉載、修改、發布本文,無需經過本人同意。亦可通過博客閱讀本文iqsing.github.io


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM