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: Failed
及 reason: 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涉及的大部分內容進行了介紹。
參考:
Running Automated Tasks with a CronJob
希望小作文對你有些許幫助,如果內容有誤請指正。
您可以隨意轉載、修改、釋出本文,無需經過本人同意。亦可通過部落格閱讀本文:iqsing.github.io