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

視頻教程連接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

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鐘

jobs任務(wù)輸出

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
jobs之pod狀態(tài)

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ù)量

jobs創(chuàng)建并發(fā)任務(wù)

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

jobs批量運(yùn)行并發(fā)任務(wù)

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ù)

Jobs并發(fā)運(yùn)行任務(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ù)

并發(fā)運(yùn)行多任務(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ā)送郵件
Cronjob

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ù)列表

運(yùn)行cronjobs任務(wù)

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

校驗(yàn)cronjobs

當(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í)

返回kubernetes系列教程目錄

如果覺(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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)本節(jié)內(nèi)容之前,希望你已經(jīng)對(duì)Pod和ReplicaSet有了基本的了解。具體請(qǐng)參考這兩篇文章:Kubernete...
    伊凡的一天閱讀 3,517評(píng)論 0 2
  • 前言 Pod的分類 自助式pod 只要pod退出了,此類型的pod不會(huì)被重建,該pod沒(méi)有管理者,死亡后不會(huì)被拉起...
    小波同學(xué)閱讀 747評(píng)論 0 0
  • job 在 kubernetes 中主要用來(lái)處理離線任務(wù),job 直接管理 pod,可以創(chuàng)建一個(gè)或多個(gè) pod 并...
    田飛雨閱讀 399評(píng)論 0 2
  • kubernetes 簡(jiǎn)介 一個(gè)迅速過(guò)一遍kubernetes 非常不錯(cuò)的資源:基于Kubernetes構(gòu)建Doc...
    bradyjoestar閱讀 15,354評(píng)論 2 7
  • 一、 軌跡與循跡 1)軌跡 軌跡,其實(shí)是戶外自助游的GPS導(dǎo)航,驢友們稱之為【軌跡】。它記錄了驢友們的運(yùn)動(dòng)路線,時(shí)...
    rui_liu閱讀 1,056評(píng)論 0 2

友情鏈接更多精彩內(nèi)容