視頻教程連接:kubernetes快速入門
1. Jobs讓單次任務(wù)跑起來(lái)
1.1 Jobs簡(jiǎn)介
Windows下可以通過(guò)批處理腳本完成批處理任務(wù),腳本運(yùn)行完畢后任務(wù)即可終止,從而實(shí)現(xiàn)批處理任務(wù)運(yùn)行工作,類似的任務(wù)如何在kubernetes中運(yùn)行呢?答案是Jobs,Jobs是kubernetes中實(shí)現(xiàn)一次性計(jì)劃任務(wù)的Pod控制器—JobController,通過(guò)控制Pod來(lái)執(zhí)行任務(wù),其特點(diǎn)為:
- 創(chuàng)建Pod運(yùn)行特定任務(wù),確保任務(wù)運(yùn)行完成
- 任務(wù)運(yùn)行期間節(jié)點(diǎn)異常時(shí)會(huì)自動(dòng)重新創(chuàng)建Pod
- 支持并發(fā)創(chuàng)建Pod任務(wù)數(shù)和指定任務(wù)數(shù)

Jobs任務(wù)運(yùn)行方式有如下三種:
- 運(yùn)行單個(gè)Jobs任務(wù),一般運(yùn)行一個(gè)pod,pod運(yùn)行結(jié)束任務(wù)運(yùn)行完成;
- 運(yùn)行特定數(shù)量的任務(wù),通過(guò)completion指定總計(jì)運(yùn)行任務(wù);
- 并發(fā)運(yùn)行任務(wù),通過(guò)parallelism指定并發(fā)數(shù)
1.2 運(yùn)行單個(gè)Jobs任務(wù)
1、 定義一個(gè)jobs任務(wù),通過(guò)在command中運(yùn)行特定一個(gè)腳本,將當(dāng)前的時(shí)間打印100次
apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 1 #并發(fā)數(shù),默認(rèn)為1,即創(chuàng)建pod副本的數(shù)量
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:
- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "for i in `seq 0 100`;do echo ${date} && sleep 1;done"
restartPolicy: Never #設(shè)置為Never,jobs任務(wù)運(yùn)行完畢即可完成
2、 運(yùn)行Jobs任務(wù)
[root@node-1 happylau]# kubectl apply -f job-demo.yaml
job.batch/job-demo created
[root@node-1 happylau]# kubectl get jobs job-demo
NAME COMPLETIONS DURATION AGE
job-demo 0/1 41s 41s
3、 此時(shí)jobs控制器創(chuàng)建了一個(gè)pod容器運(yùn)行任務(wù),此時(shí)處于Running狀態(tài),任務(wù)處在運(yùn)行過(guò)程中,如果運(yùn)行完畢則會(huì)變?yōu)閏ompleted狀態(tài)
[root@node-1 happylau]# kubectl get pods |grep job
job-demo-ssrk7 1/1 Running 0 97s
4、查看jobs日志日志數(shù)據(jù),可以看到當(dāng)前jobs創(chuàng)建的任務(wù)是持續(xù)在終端中打印數(shù)字,且每次打印暫停1s鐘

5、再次查看jobs的任務(wù),可以看到任務(wù)已經(jīng)completions,運(yùn)行時(shí)長(zhǎng)為103s,對(duì)應(yīng)的pod狀態(tài)處于completed狀態(tài)
[root@node-1 ~]# kubectl get jobs
NAME COMPLETIONS DURATION AGE
job-demo 1/1 103s 5m12s

1.3 Jobs運(yùn)行多個(gè)任務(wù)
Jobs控制器提供了兩個(gè)控制并發(fā)數(shù)的參數(shù):completions和parallelism,completions表示需要運(yùn)行任務(wù)數(shù)的總數(shù),parallelism表示并發(fā)運(yùn)行的個(gè)數(shù),如設(shè)置為1則會(huì)依次運(yùn)行任務(wù),前面任務(wù)運(yùn)行再運(yùn)行后面的任務(wù),如下以創(chuàng)建5個(gè)任務(wù)數(shù)為例演示Jobs控制器實(shí)現(xiàn)并發(fā)數(shù)的機(jī)制。
1、 定義計(jì)算圓周率的Jobs任務(wù)
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(100)"]
restartPolicy: Never
parallelism: 1
completions: 5
2、運(yùn)行jobs任務(wù),并用kubectl get jobs --watch查看jobs創(chuàng)建過(guò)程,可以看到pod任務(wù)是依次運(yùn)行,直至達(dá)到completions所定義的數(shù)量

3、Jobs任務(wù)都已運(yùn)行完畢,查看Jobs列表可以看到任務(wù)都處于Completed狀態(tài),查看pod日志可以看到Pi圓周率計(jì)算的結(jié)果

1.4 Jobs運(yùn)行并發(fā)任務(wù)
Jobs控制器支持運(yùn)行并發(fā)任務(wù),并發(fā)任務(wù)即Jobs控制器一次運(yùn)行多個(gè)Pod執(zhí)行任務(wù)處理,如下以一次性運(yùn)行3個(gè)Pod并發(fā)數(shù)為例演示通過(guò)Jobs控制器實(shí)現(xiàn)并發(fā)任務(wù)
1、定義Jobs任務(wù),設(shè)置3個(gè)并發(fā)數(shù)任務(wù)
apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 3 #運(yùn)行并發(fā)數(shù)為3,一次性創(chuàng)建3個(gè)pod
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:
- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "for i in `seq 0 10`;do echo `date` && sleep 1;done"
restartPolicy: Never
2、運(yùn)行Jobs任務(wù)并查看,Jobs控制器同時(shí)創(chuàng)建了3個(gè)并發(fā)任務(wù)

3、通過(guò)上面的演示可知,通過(guò)parallelism指定并發(fā)數(shù)量,Jobs控制器會(huì)創(chuàng)建出多個(gè)Pod副本并運(yùn)行直至任務(wù)completed,同時(shí)parallelism可以配合completions一起使用,通過(guò)并發(fā)創(chuàng)建特定數(shù)量的任務(wù),如下以單次運(yùn)行3個(gè)并發(fā)任務(wù)實(shí)現(xiàn)9個(gè)任務(wù)的Jobs任務(wù)
apiVersion: batch/v1
kind: Job
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
parallelism: 3 #并發(fā)任務(wù)為3
completions: 9 #任務(wù)數(shù)為9
template:
metadata:
name: jobs-demo
labels:
controller: jobs
spec:
containers:
- name: echo-time
image: centos:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "for i in `seq 0 10`;do echo `date` && sleep 1;done"
restartPolicy: Never
4、運(yùn)行Jobs任務(wù)并觀察創(chuàng)建過(guò)程,在describe jobs的詳情events日志中可以看到一共創(chuàng)建了9個(gè)任務(wù),每3個(gè)任務(wù)創(chuàng)建時(shí)間一樣,即并發(fā)創(chuàng)建的任務(wù)

總結(jié):通過(guò)前面的例子解析可得知,Jobs能在kubernetes中實(shí)現(xiàn)類似Windows下批處理或Linux下shell任務(wù)的功能,通過(guò)運(yùn)行特定任務(wù)數(shù)+并發(fā)數(shù)控制創(chuàng)建Pod任務(wù)。需要注意一點(diǎn)的是,Jobs控制器和Deployments副本控制器不一樣,其不支持修改Jobs的yaml文件,如果有需要修改則需要提前將Jobs任務(wù)刪除,然后再將修改后的yaml提交任務(wù)。
2. CronJobs周期性運(yùn)轉(zhuǎn)
2.1 CronJobs簡(jiǎn)介
CronJobs用于實(shí)現(xiàn)類似Linux下的cronjob周期性計(jì)劃任務(wù),CronJobs控制器通過(guò)時(shí)間線創(chuàng)建Jobs任務(wù),從而完成任務(wù)的執(zhí)行處理,其具有如下特點(diǎn):
- 實(shí)現(xiàn)周期性計(jì)劃任務(wù)
- 調(diào)用Jobs控制器創(chuàng)建任務(wù)
- CronJobs任務(wù)名稱小于52個(gè)字符
- 應(yīng)用場(chǎng)景如:定期備份,周期性發(fā)送郵件

CronJobs可通過(guò)schedule指定任務(wù)運(yùn)行的周期,其使用參數(shù)和cronjob類似,分別使用:分時(shí)日月星5個(gè)參數(shù)表示周期性,其中*表示任意時(shí)間點(diǎn),/表示每隔多久,-表示范圍
- 分鐘 范圍為0-59
- 小時(shí) 范圍為0-23
- 日期 范圍為1-31
- 月份 范圍為1-12
- 星期 范圍為0-7,其中0和7表示星期日
舉例子說(shuō)明:
1、 /1 * * * 表示每隔1分鐘運(yùn)行任務(wù)
2、 1 0 * * 6-7 表示每周六日的0點(diǎn)01分運(yùn)行任務(wù)
2.2 運(yùn)行Cronjobs任務(wù)
CronJobs任務(wù)是編寫和Deployments類似,需啊喲一個(gè)schedule定期任務(wù)調(diào)度周期,通過(guò)jobTemplate定義生成Jobs任務(wù)的模版,定義一個(gè)任務(wù)為例:
1、 定義一個(gè)CronJobs任務(wù),每隔5分鐘運(yùn)行一個(gè)任務(wù)
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
labels:
jobgroup: cronjob-demo
spec:
schedule: "*/5 * * * *" #調(diào)度任務(wù)周期
jobTemplate: #創(chuàng)建Jobs任務(wù)模版
spec:
template:
spec:
containers:
- name: cronjob-demo
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- "for i in `seq 0 100`;do echo ${i} && sleep 1;done"
restartPolicy: Never
2、 運(yùn)行CronJobs并查看任務(wù)列表

3、校驗(yàn)CronJobs任務(wù)運(yùn)行的情況,可以看到CronJobs任務(wù)調(diào)用Jobs控制器創(chuàng)建Pod,Pod創(chuàng)建周期和schedule中定義的周期一致

當(dāng)然,CronJobs中通過(guò)Jobs的模版也可以定義運(yùn)行任務(wù)的數(shù)量和并發(fā)數(shù),實(shí)現(xiàn)計(jì)劃時(shí)間范圍內(nèi)并發(fā)運(yùn)行多個(gè)任務(wù)的需求。
寫在最后
文章總結(jié)了在kubernetes集群中運(yùn)行Jobs批處理任務(wù)和CronJobs兩種控制器的功能使用,適用于特定場(chǎng)景下任務(wù),Jobs任務(wù)執(zhí)行完畢即completed,CronJobs周期性調(diào)用Jobs控制器完成任務(wù)的創(chuàng)建執(zhí)行。
參考文章
不錯(cuò)的博客:https://draveness.me/kubernetes-job-cronjob
運(yùn)行Jobs任務(wù):https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
計(jì)劃任務(wù)ConJobs:https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
自動(dòng)運(yùn)行任務(wù):https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
TKE創(chuàng)建Jobs任務(wù):https://cloud.tencent.com/document/product/457/31708
TKE創(chuàng)建CronJobs:https://cloud.tencent.com/document/product/457/31709
當(dāng)你的才華撐不起你的野心時(shí),你就應(yīng)該靜下心來(lái)學(xué)習(xí)
如果覺(jué)得文章對(duì)您有幫助,請(qǐng)訂閱專欄,分享給有需要的朋友吧??
?
關(guān)于作者 劉海平(HappyLau )云計(jì)算高級(jí)顧問(wèn) 目前在騰訊云從事公有云相關(guān)工作,曾就職于酷狗,EasyStack,擁有多年公有云+私有云計(jì)算架構(gòu)設(shè)計(jì),運(yùn)維,交付相關(guān)經(jīng)驗(yàn),參與了酷狗,南方電網(wǎng),國(guó)泰君安等大型私有云平臺(tái)建設(shè),精通Linux,Kubernetes,OpenStack,Ceph等開(kāi)源技術(shù),在云計(jì)算領(lǐng)域具有豐富實(shí)戰(zhàn)經(jīng)驗(yàn),擁有紅帽RHCA/RHCE和OpenStack/Linux授課經(jīng)驗(yàn)