在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