kubernetes系列教程(十三)一次性任務Job和周期任務
- 2020 年 1 月 23 日
- 筆記
1. Jobs讓單次任務跑起來
1.1 Jobs簡介
Windows下可以通過批處理腳本完成批處理任務,腳本運行完畢後任務即可終止,從而實現批處理任務運行工作,類似的任務如何在kubernetes中運行呢?答案是Jobs,Jobs是kubernetes中實現一次性計劃任務的Pod控制器—JobController,通過控制Pod來執行任務,其特點為:
- 創建Pod運行特定任務,確保任務運行完成
- 任務運行期間節點異常時會自動重新創建Pod
- 支援並發創建Pod任務數和指定任務數

Jobs任務運行方式有如下三種:
- 運行單個Jobs任務,一般運行一個pod,pod運行結束任務運行完成;
- 運行特定數量的任務,通過completion指定總計運行任務;
- 並發運行任務,通過parallelism指定並發數
1.2 運行單個Jobs任務
1、 定義一個jobs任務,通過在command中運行特定一個腳本,將當前的時間列印100次
apiVersion: batch/v1 kind: Job metadata: name: jobs-demo labels: controller: jobs spec: parallelism: 1 #並發數,默認為1,即創建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 100`;do echo ${date} && sleep 1;done" restartPolicy: Never #設置為Never,jobs任務運行完畢即可完成
2、 運行Jobs任務
[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、 此時jobs控制器創建了一個pod容器運行任務,此時處於Running狀態,任務處在運行過程中,如果運行完畢則會變為completed狀態
[root@node-1 happylau]# kubectl get pods |grep job job-demo-ssrk7 1/1 Running 0 97s
4、查看jobs日誌日誌數據,可以看到當前jobs創建的任務是持續在終端中列印數字,且每次列印暫停1s鍾

5、再次查看jobs的任務,可以看到任務已經completions,運行時長為103s,對應的pod狀態處於completed狀態
[root@node-1 ~]# kubectl get jobs NAME COMPLETIONS DURATION AGE job-demo 1/1 103s 5m12s

1.3 Jobs運行多個任務
Jobs控制器提供了兩個控制並發數的參數:completions和parallelism,completions表示需要運行任務數的總數,parallelism表示並發運行的個數,如設置為1則會依次運行任務,前面任務運行再運行後面的任務,如下以創建5個任務數為例演示Jobs控制器實現並發數的機制。
1、 定義計算圓周率的Jobs任務
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、運行jobs任務,並用kubectl get jobs –watch查看jobs創建過程,可以看到pod任務是依次運行,直至達到completions所定義的數量

3、Jobs任務都已運行完畢,查看Jobs列表可以看到任務都處於Completed狀態,查看pod日誌可以看到Pi圓周率計算的結果

1.4 Jobs運行並發任務
Jobs控制器支援運行並發任務,並發任務即Jobs控制器一次運行多個Pod執行任務處理,如下以一次性運行3個Pod並發數為例演示通過Jobs控制器實現並發任務
1、定義Jobs任務,設置3個並發數任務
apiVersion: batch/v1 kind: Job metadata: name: jobs-demo labels: controller: jobs spec: parallelism: 3 #運行並發數為3,一次性創建3個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、運行Jobs任務並查看,Jobs控制器同時創建了3個並發任務

3、通過上面的演示可知,通過parallelism指定並發數量,Jobs控制器會創建出多個Pod副本並運行直至任務completed,同時parallelism可以配合completions一起使用,通過並發創建特定數量的任務,如下以單次運行3個並發任務實現9個任務的Jobs任務
apiVersion: batch/v1 kind: Job metadata: name: jobs-demo labels: controller: jobs spec: parallelism: 3 #並發任務為3 completions: 9 #任務數為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、運行Jobs任務並觀察創建過程,在describe jobs的詳情events日誌中可以看到一共創建了9個任務,每3個任務創建時間一樣,即並發創建的任務

總結:通過前面的例子解析可得知,Jobs能在kubernetes中實現類似Windows下批處理或Linux下shell任務的功能,通過運行特定任務數+並發數控制創建Pod任務。需要注意一點的是,Jobs控制器和Deployments副本控制器不一樣,其不支援修改Jobs的yaml文件,如果有需要修改則需要提前將Jobs任務刪除,然後再將修改後的yaml提交任務。
2. CronJobs周期性運轉
2.1 CronJobs簡介
CronJobs用於實現類似Linux下的cronjob周期性計劃任務,CronJobs控制器通過時間線創建Jobs任務,從而完成任務的執行處理,其具有如下特點:
- 實現周期性計劃任務
- 調用Jobs控制器創建任務
- CronJobs任務名稱小於52個字元
- 應用場景如:定期備份,周期性發送郵件

CronJobs可通過schedule指定任務運行的周期,其使用參數和cronjob類似,分別使用:分時日月星5個參數表示周期性,其中*表示任意時間點,/表示每隔多久,-表示範圍
- 分鐘 範圍為0-59
- 小時 範圍為0-23
- 日期 範圍為1-31
- 月份 範圍為1-12
- 星期 範圍為0-7,其中0和7表示星期日
舉例子說明:
1、 /1 * * * 表示每隔1分鐘運行任務
2、 1 0 * * 6-7 表示每周六日的0點01分運行任務
2.2 運行Cronjobs任務
CronJobs任務是編寫和Deployments類似,需啊喲一個schedule定期任務調度周期,通過jobTemplate定義生成Jobs任務的模版,定義一個任務為例:
1、 定義一個CronJobs任務,每隔5分鐘運行一個任務
apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob-demo labels: jobgroup: cronjob-demo spec: schedule: "*/5 * * * *" #調度任務周期 jobTemplate: #創建Jobs任務模版 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、 運行CronJobs並查看任務列表

3、校驗CronJobs任務運行的情況,可以看到CronJobs任務調用Jobs控制器創建Pod,Pod創建周期和schedule中定義的周期一致

當然,CronJobs中通過Jobs的模版也可以定義運行任務的數量和並發數,實現計劃時間範圍內並發運行多個任務的需求。
寫在最後
文章總結了在kubernetes集群中運行Jobs批處理任務和CronJobs兩種控制器的功能使用,適用於特定場景下任務,Jobs任務執行完畢即completed,CronJobs周期性調用Jobs控制器完成任務的創建執行。
參考文章
不錯的部落格:https://draveness.me/kubernetes-job-cronjob
運行Jobs任務:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
計劃任務ConJobs:https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
自動運行任務:https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
TKE創建Jobs任務:https://cloud.tencent.com/document/product/457/31708
TKE創建CronJobs:https://cloud.tencent.com/document/product/457/31709
關於作者 劉海平(HappyLau )雲計算高級顧問 目前在騰訊雲從事公有雲相關工作,曾就職於酷狗,EasyStack,擁有多年公有雲+私有雲計算架構設計,運維,交付相關經驗,參與了酷狗,南方電網,國泰君安等大型私有雲平台建設,精通Linux,Kubernetes,OpenStack,Ceph等開源技術,在雲計算領域具有豐富實戰經驗,擁有紅帽RHCA/RHCE和OpenStack/Linux授課經驗