我們?nèi)粘9ぷ髦薪?jīng)常遇到一些需要進(jìn)行數(shù)據(jù)處理和分析的需求,當(dāng)然也會(huì)有按時(shí)間來進(jìn)行調(diào)度的工作,在我們的kubernetes集群中為我們提供了Job和CronJob兩種資源對象來應(yīng)對我們的這種需求崖堤。
Job負(fù)責(zé)處理任務(wù)漓拾,即僅執(zhí)行一次的任務(wù),他保證處理任務(wù)的一個(gè)或多個(gè)pod成功結(jié)束术浪。而cronJob則是在Job上加上了時(shí)間調(diào)度芝此。
Job
我們用Job這個(gè)資源對象來創(chuàng)建一個(gè)任務(wù)憋肖,我們定一個(gè)Job來執(zhí)行一個(gè)倒計(jì)時(shí)的任務(wù),定義YAML文件:
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
matchLabels:
name: job
template:
labels:
name: job
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僅支持Nerver和onFailure兩種婚苹,不支持Always岸更。我們知道Job就相當(dāng)于來執(zhí)行一個(gè)批處理任務(wù),執(zhí)行完就結(jié)束租副,如果支持Always的話就會(huì)進(jìn)入死循環(huán)坐慰。
然后來創(chuàng)建該Job,保存為job-demo.yaml:
$ kubectl create -f ./job.yaml
job "job-demo" created
然后我們可以查看當(dāng)前的Job資源對象:
$ kubectl get jobs
注意查看我們的Pod的狀態(tài)用僧,同樣我們可以通過kubectl logs來查看當(dāng)前任務(wù)的執(zhí)行結(jié)果结胀。
CronJob
CronJob其實(shí)就是在Job的基礎(chǔ)上加上了時(shí)間調(diào)度,我們可以:在給定的時(shí)間點(diǎn)運(yùn)行一個(gè)任務(wù)责循,也可以周期性的在給定時(shí)間點(diǎn)運(yùn)行糟港。這個(gè)實(shí)際上和我們linux的crontab就非常類似了。
一個(gè)CronJob對象其實(shí)就對應(yīng)cronJob文件的一行院仿,他根據(jù)配置時(shí)間格式周期性的運(yùn)行一個(gè)Job秸抚,格式和crontab也是一樣的。
crontab的格式如下:
分 時(shí) 日 月 星期 要運(yùn)行的命令
第1列分鐘0~59
第2列小時(shí)0~23)
第3列日1~31
第4列月1~12
第5列星期0~7(0和7表示星期天)
第6列要運(yùn)行的命令
現(xiàn)在歹垫,我們用CronJob來管理我們上面的Job任務(wù)剥汤,
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字段必須填寫的排惨,用來指定任務(wù)運(yùn)行的周期吭敢,格式和crontab一樣,另一個(gè)字段是.spec.jobTemplate暮芭,用來指定需要運(yùn)行的任務(wù)鹿驼,格式當(dāng)然和Job是一致的。還有一些值得關(guān)注的字段辕宏,.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit畜晰,表示歷史限制,是可選字段瑞筐。他們制定了可以保留多少完成和失敗的Job凄鼻,默認(rèn)沒有限制,所以成功和失敗的Job都會(huì)保留聚假。然而块蚌,當(dāng)運(yùn)行一個(gè)CronJob時(shí),Job很快就對極了很多魔策,所以一般推薦是指這兩個(gè)字段值匈子。如果設(shè)置限制值為0,那么相關(guān)類型的Job完成后將不會(huì)被保留闯袒。
接下來我們來創(chuàng)建這個(gè)cronjob
$ kubectl create -f cronjob-demo.yaml
cronjob "cronjob-demo" created
當(dāng)然虎敦,也可以用kubectl run來創(chuàng)建一個(gè)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
這將會(huì)終止正在創(chuàng)建的 Job政敢。然而其徙,運(yùn)行中的 Job 將不會(huì)被終止,不會(huì)刪除 Job 或 它們的 Pod喷户。為了清理那些 Job 和 Pod唾那,需要列出該 Cron Job 創(chuàng)建的全部 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 創(chuàng)建的 Pod 也會(huì)被刪除闹获。注意期犬,所有由名稱為 “hello” 的 Cron Job 創(chuàng)建的 Job 會(huì)以前綴字符串 “hello-” 進(jìn)行命名。如果想要?jiǎng)h除當(dāng)前 Namespace 中的所有 Job避诽,可以通過命令 kubectl delete jobs –all 立刻刪除它們龟虎。