Job資源在建立時會立即運行pod。但是許多batch任務需要在特定的時間運行,或者在指定的時間間隔內重複執行。類似Linux的CronJob。 k8s中的cron任務透過建立CronJob資源進行設定。在設定的時間,k8s將根據在CronJob物件中設定的Job樣板來建立Job資源。建立Job資源後,再根據Job的pod樣板來建立一個或者多個pod副本。
建立 cronjob.yaml ,以下是每15分鐘執行一個job任務。
時間表從左到右為:分 時 每月第幾天 月 星期幾 ,跟Linux的crontab時間表是一樣的。
apiVersion: batch/v1
kind: CronJob
metadata:
name: batch-job-every-fifteen-minutes
spec:
schedule: "0,15,30,45 * * * *" # 時間使用方式跟linux一樣
jobTemplate: # 用來定義job的樣板
spec:
template:
metadata:
labels:
app: periodic-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: main
image: luksa/batch-job
[root@cp200 ch4]# kubectl create -f cronjob.yaml
cronjob.batch/batch-job-every-fifteen-minutes created
由於時間還未到,所以還看不到job跟pod有再執行。
[root@cp200 ch4]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
batch-job-every-fifteen-minutes 0,15,30,45 * * * * False 0 <none> 16s
[root@cp200 ch4]# kubectl get job
No resources found in default namespace.
[root@cp200 ch4]# kubectl get po
No resources found in default namespace.
等到當下時間符合設定的時間,再次執行查看CronJob、Job、Pod
[root@cp200 ch4]# kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
batch-job-every-fifteen-minutes 0,15,30,45 * * * * False 0 2m21s 13m
[root@cp200 ch4]# kubectl get job
NAME COMPLETIONS DURATION AGE
batch-job-every-fifteen-minutes-27470820 0/1 115s 115s
[root@cp200 ch4]#
[root@cp200 ch4]# kubectl get po
NAME READY STATUS RESTARTS AGE
batch-job-every-fifteen-minutes-27470820-stc9r 1/1 Running 0 2m1s
補充:CronJob透過CronJob規範中設定的JobTemplete屬性建立job資源。
在排程的大約時間內,CronJob會建立Job,然後Job建立pod。
但可能發生Job或pod建立並執行的時間相對較晚,如果對這項工作有高的要求,job開始時間不能落後預定時間過多,這種情況下可以設定 spec.startingDeadlineSeconds 來指定截止時間。如下:
apiVersion: batch/v1
kind: CronJob
spec:
schedule: "0,15,30,45 * * * *"
startingDeadlineSeconds: 15 # 設定job的截止時間
以上例子中,假如job執行時間應該在10:30:00,如果因為任何原因10:30:15不起動,任務將不會執行,並且將顯示為Failed。
在正常情況下,CronJob總是為排程中設定的job每一個執行建立一個Job,但可能會同時建立兩個Job,或者根本沒有建立。 為了解決第一個問題,你的任務應該是冪等的(多次而不是一次執行得到不希望的結果,多次執行還是一樣的結果)。對於第二個問題,請確保下一個任務執行完成本應該由上一次的(錯過的)執行完成的任何工作。