kubernetes入門到實戰(十)守護和任務型控制器—(02)

1. Jobs讓單次任務跑起來

1.1 Jobs簡介

Windows下能夠經過批處理腳本完成批處理任務,腳本運行完畢後任務便可終止,從而實現批處理任務運行工做,相似的任務如何在kubernetes中運行呢?答案是Jobs,Jobs是kubernetes中實現一次性計劃任務的Pod控制器—JobController,經過控制Pod來執行任務,其特色爲:node

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

jobs

Jobs任務運行方式有以下三種:shell

  • 運行單個Jobs任務,通常運行一個pod,pod運行結束任務運行完成;
  • 運行特定數量的任務,經過completion指定總計運行任務;
  • 併發運行任務,經過parallelism指定併發數

1.2 運行單個Jobs任務

一、 定義一個jobs任務,經過在command中運行特定一個腳本,將當前的時間打印100次centos

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任務運行完畢便可完成

二、 運行Jobs任務api

[root@node-1 happycloudlab]# 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

三、 此時jobs控制器建立了一個pod容器運行任務,此時處於Running狀態,任務處在運行過程當中,若是運行完畢則會變爲completed狀態併發

[root@node-1 happycloudlab]# kubectl get pods  |grep job
job-demo-***k7                         1/1     Running   0          97s

四、查看jobs日誌日誌數據,能夠看到當前jobs建立的任務是持續在終端中打印數字,且每次打印暫停1s鍾app

jobs任務輸出

五、再次查看jobs的任務,能夠看到任務已經completions,運行時長爲103s,對應的pod狀態處於completed狀態ide

[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控制器實現併發數的機制。rest

一、 定義計算圓周率的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

二、運行jobs任務,並用kubectl get jobs --watch查看jobs建立過程,能夠看到pod任務是依次運行,直至達到completions所定義的數量code

jobs建立併發任務

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

jobs批量運行併發任務

1.4 Jobs運行併發任務

Jobs控制器支持運行併發任務,併發任務即Jobs控制器一次運行多個Pod執行任務處理,以下以一次性運行3個Pod併發數爲例演示經過Jobs控制器實現併發任務

一、定義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

二、運行Jobs任務並查看,Jobs控制器同時建立了3個併發任務

Jobs併發運行任務

三、經過上面的演示可知,經過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

四、運行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 0 * * 6-7 表示每週六日的0點01分運行任務

2.2 運行Cronjobs任務

CronJobs任務是編寫和Deployments相似,需啊喲一個schedule按期任務調度週期,經過jobTemplate定義生成Jobs任務的模版,定義一個任務爲例:

一、 定義一個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

二、 運行CronJobs並查看任務列表

運行cronjobs任務

三、校驗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

相關文章
相關標籤/搜索