Job負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。而CronJob則就是在Job上加上了時間調度。
Job
我們用Job這個資源對象來創建一個任務,我們定一個Job來執行一個倒計時的任務,定義YAML文件:
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
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"
注意Job的RestartPolicy僅支持Never和OnFailure兩種,不支持Always,我們知道Job就相當於來執行一個批處理任務,執行完就結束了,如果支持Always的話是不是就陷入了死循環了?
然后來創建該Job,保存為job-demo.yaml:
$ kubectl create -f ./job.yaml job "job-demo" created
然后我們可以查看當前的Job資源對象:
$ kubectl get jobs
注意查看我們的Pod的狀態,同樣我們可以通過kubectl logs來查看當前任務的執行結果。
CronJob
CronJob其實就是在Job的基礎上加上了時間調度,我們可以:在給定的時間點運行一個任務,也可以周期性地在給定時間點運行。這個實際上和我們Linux中的crontab就非常類似了。
一個CronJob對象其實就對應中crontab文件中的一行,它根據配置的時間格式周期性地運行一個Job,格式和crontab也是一樣的。
crontab的格式如下:
分 時 日 月 星期 要運行的命令 第1列分鍾0~59 第2列小時0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要運行的命令
現在,我們用CronJob來管理我們上面的Job任務,
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
我們這里的Kind是CronJob了,要注意的是.spec.schedule字段是必須填寫的,用來指定任務運行的周期,格式就和crontab一樣,另外一個字段是.spec.jobTemplate, 用來指定需要運行的任務,格式當然和Job是一致的。還有一些值得我們關注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示歷史限制,是可選的字段。它們指定了可以保留多少完成和失敗的Job,默認沒有限制,所有成功和失敗的Job都會被保留。然而,當運行一個Cron Job時,Job可以很快就堆積很多,所以一般推薦設置這兩個字段的值。如果設置限制的值為 0,那么相關類型的Job完成后將不會被保留。
接下來我們來創建這個cronjob
$ kubectl create -f cronjob-demo.yaml cronjob "cronjob-demo" created
當然,也可以用kubectl run來創建一個CronJob:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>
$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1202039034 1 1 49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
$ kubectl delete cronjob hello
cronjob "hello" deleted
一旦不再需要 Cron Job,簡單地可以使用 kubectl 命令刪除它:
$ kubectl delete cronjob hello cronjob "hello" deleted
這將會終止正在創建的 Job。然而,運行中的 Job 將不會被終止,不會刪除 Job 或 它們的 Pod。為了清理那些 Job 和 Pod,需要列出該 Cron Job 創建的全部 Job,然后刪除它們:
$ kubectl get jobs NAME DESIRED SUCCESSFUL AGE hello-1201907962 1 1 11m hello-1202039034 1 1 8m ... $ kubectl delete jobs hello-1201907962 hello-1202039034 ... job "hello-1201907962" deleted job "hello-1202039034" deleted ...
一旦 Job 被刪除,由 Job 創建的 Pod 也會被刪除。注意,所有由名稱為 “hello” 的 Cron Job 創建的 Job 會以前綴字符串 “hello-” 進行命名。如果想要刪除當前 Namespace 中的所有 Job,可以通過命令 kubectl delete jobs --all 立刻刪除它們。
