1. 程式人生 > 其它 >k8s 關於Job與Cronjob

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

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

通過logs檢視我們的任務執行結果:


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

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

在重啟策略為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後被終止

清理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狀態為成功執行。

    我們可以從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在同一時間建立和結束。


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資訊:

通過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