類似於Linux的Cron模塊,CronJob用來運行定時性任務,或者周期性、重復性任務。注意CronJob啟動的是kubernetes中的Job,不是ReplicaSet、DaemonSet等其它控制器類型。
示例:
以下CronJob每分鍾運行一次,打印出當前時間與hello消息。
- CronJob SPEC:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
以上內容,schedule: "*/1 * * * *"與Linux Cron意義相同,表示每分鍾啟動一次。
- 運行CronJob
$ kubectl create -f ./cronjob.yaml
cronjob "hello" created
或者通過祈使命令行方式:
$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created
查看CronJob狀態:
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>
-
NAME:CronJob名稱。
-
SCHEDULE:基於時間的調度規則。
-
SUSPEND:如果其值為True表示此CronJob暫時失效,不變成False之前不再創建新任務。對於已經創建的任務沒有影響。
-
ACTIVE:表示當前活動的任務數,0表示當前沒有活動任務。1表示有一個活動任務。此值可能大於1,原因如下:
- 任務允許重復啟動,如前一次啟動后還沒有退出,下一次已經啟動。
- 允許延后啟動,當CronJob Controller發現因為某種原因錯誤啟動,並且任務允許延后啟動,則會啟動任務。
- LAST-SCHEDULE:表示最后一次調度時間,
表示未曾調度過任務。
從CronJob狀態可以看出,其輸出中並沒有相關字段指示其所創建的JOB是否運行成功,運行如上命令查看JOB的詳細信息:
查看CronJob創建的Job:
$ kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-4111706356 1 1 2s
-
NAME:表示CronJob創建的Job名稱,后邊的數字由系統自動生成,保證不重復。
-
DESIRED:表示CronJob只創建的是最簡單的一次Job,只創建一個pod。
-
SUCCESSFUL:表示pod成功個數。
-
AGE:表示上JOB生存時間。
再次查看CronJob:
$ kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 Mon, 29 Aug 2016 14:34:00 -0700
LAST-SCHEDULE表示最近一次調度時間,ACTIVE為0表示實例已經運行結束。
CronJob創建Job,Job創建pod,已經獲知CronJob創建的Job名稱:hello-4111706356,查看pod方法如下:
# Replace "hello-4111706356" with the job name in your system
$ pods=$(kubectl get pods --show-all --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})
$ echo $pods
hello-4111706356-o9qcm
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
刪除CronJob:
$ kubectl delete cronjob hello
cronjob "hello" deleted
刪除CronJob會導致其創建的Job、pod一起被刪除。
簡單起見,以上示例控制CronJob行為的字段沒有設置或者也可以說是采用了默認值,下面解釋CronJob中的重要字段。
-
.spec.startingDeadlineSeconds:單位是秒,表示如果Job因為某種原因無法按調度准時啟動,在spec.startingDeadlineSeconds時間段之內,CronJob仍然試圖重新啟動Job,如果在.spec.startingDeadlineSeconds時間之內沒有啟動成功,則不再試圖重新啟動。如果spec.startingDeadlineSeconds的值沒有設置,則沒有按時啟動的任務不會被嘗試重新啟動。spec.startingDeadlineSeconds同時也影響到CronJob計算任務損失率。如果指定,那么CronJob計算有多少Job沒有按時啟動時是從當前時間向后推spec.startingDeadlineSeconds秒數,如果沒有指定,那么是從當前時間向后推到最后一次成功調度的時間。無論那種算法,如果損失的按時任務超過一定個數,那么CronJob會報錯並停止運行。
-
.spec.concurrencyPolicy:是否允許Job並發,可能的聚會有3個。
Allow:上一次Job沒有完成,本次Job可以啟動。
Forbid:上一次Job沒有完成,本次Job不可以啟動。
Replace:上一次Job沒有完成,本次Job取而代之,將上一次Job殺死。 -
.spec.suspend:true或者false,表示是否臨時阻塞CronJob。
-
.spec.successfulJobsHistoryLimit:保存成功歷史Job的數量,默認3,如果為0則CronJob在Job成功后立即刪除。
-
.spec.failedJobsHistoryLimit:保存失敗歷史Job的數量,默認1,如果為0則CronJob在Job失敗后立即刪除。