本篇說明何謂Job:
以下表格很清楚的說明不同的Job類型與行為:
根據Job Spec建立Pod,並且持續監控Pod的狀態,直到成功結束。如果失敗,就根據restartPolicy(只支援OnFailure和Never, 不支援Always)決定是否創建新的Pod再次重試任務。
spec.template
格式同PodRestartPolicy
只支援Never 或OnFailure.spec.completions
標記的Job結束需要成功運行的Pod個數,預設為1.spec.parallelism
標記出並行運作的Pod個數,預設為1spec.activeDeadlineSeconds
標記出失敗Pod的重試最大時間,超過就不會再繼續重試apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
# kubectl create -f job.yaml -n job
# kubectl discribe job pi -n job
# kubectl get pod --show-all -l job-name=pi -n job
※ 利用jsonpath取得POD ID並查看日誌
# pod=$(kubectl get pod -n job --selector=job-name=pi --output=jsonpath={.items.metadata.name})
# kubectl logs $pods
從v1.21之後,就可以透過.spec.suspend
暫停和重啟Job
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
suspoend: true
parallelism: 1
completions: 5
template:
spec:
....
當Job暫停之後,Job conditions中就會出現一條Job暫停的event:
# kubectl get jobs/myjob -o yaml
apiVersion: batch/v1
kind: Job
# .metadata and .spec omitted
status:
conditions:
- lastProbeTime: "2021-02-05T13:14:33Z"
lastTransitionTime: "2021-02-05T13:14:33Z"
status: "True"
type: Suspended
startTime: "2021-02-05T13:13:48Z"
### 執行單一Job
apiVersion: batch/v1
kind: Job
metadata:
name: finalcountdown
spec:
template:
metadata:
name: finalcountdown
spec:
containers:
- name: counter
image: busybox
command:
- bin/sh
- -c
- "for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ; done"
restartPolicy: Never
# kubectl create -f simplejob.yaml -n simple-job
# kubectl get job -n simple-job
NAME COMPLETIONS DURATION AGE
finalcountdown 1/1 6s 9s
# kubectl describe jobs/finalcountdown -n simple-job
# kubectl log finalcountdown-xxxxx
由於Job主要用於管理一次性任務或批次性任務,可以想像到有以下應用場景可能會適用:
跟據需求的變化,Job還可以有更多可應用的場景,只要理解Job的應用特性就可以想出更多有彈性的做法來協助管理整個平台上的任務。