kubernetes系列教程(十三)一次性任務Job和周期任務

  • 2020 年 1 月 23 日
  • 筆記

1. Jobs讓單次任務跑起來

1.1 Jobs簡介

Windows下可以通過批處理腳本完成批處理任務,腳本運行完畢後任務即可終止,從而實現批處理任務運行工作,類似的任務如何在kubernetes中運行呢?答案是Jobs,Jobs是kubernetes中實現一次性計劃任務的Pod控制器—JobController,通過控制Pod來執行任務,其特點為:

  • 創建Pod運行特定任務,確保任務運行完成
  • 任務運行期間節點異常時會自動重新創建Pod
  • 支持並發創建Pod任務數和指定任務數
jobs

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鍾

jobs任務輸出

5、再次查看jobs的任務,可以看到任務已經completions,運行時長為103s,對應的pod狀態處於completed狀態

[root@node-1 ~]# kubectl get jobs  NAME       COMPLETIONS   DURATION   AGE  job-demo   1/1           103s       5m12s
jobs之pod狀態

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所定義的數量

jobs創建並發任務

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

jobs批量運行並發任務

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個並發任務

Jobs並發運行任務

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個字符
  • 應用場景如:定期備份,周期性發送郵件
Cronjob

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並查看任務列表

運行cronjobs任務

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

校驗cronjobs

當然,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授課經驗