40. Kubernetes深入Pod控制器-CronJob控制器

释放双眼,带上耳机,听听看~!

CronJob控制器介绍

CronJob控制器用于管理Job控制器资源的运行时间,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以控制Job控制器的运行时间以及运行周期,类似与Linux中的Crontab。

  • 在未来某时间点内运行作业一次
  • 在指定的时间点重复运行作业

Crontab对象支持使用的时间格式类似与Crontab,略有不同的是,CronJob控制器在指定的时间点时, ?* 的意义相同,都表示任何可用的有效值。

应用场景:数据备份、定时任务处理等。

创建CronJob对象

CronJob控制器的spec字段可以嵌套以下字段。

  • jobTemplate <Object>:Job控制器模版,用于为Crontab控制器生成Job对象,必选字段。
  • schedule<string>:Cron格式的作业调度运行时间点,必选字段。
  • concurrencyPolicy<string>:并发执行策略,可用值Allow(允许)、Forbid(禁止)、Replace(替换),用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业。
  • failedJobHistoryLimit<integer>:为失败的任务执行保留的历史记录数,默认为1。
  • successfulJobsHistoryLimit<integer>:为成功的任务执行保留的历史记录数,默认为3.
  • startingDeadlineSeconds<integer>:因各种原因缺乏执行作业的时间点所导致的启动作业错误的超时时长,会被记入错误历史记录。
  • suspend<boolean>:是否挂起后续的任务执行,默认为false,对运行中的作业不会产生影响。

下面是一个定义资源清单文件中的CronJob资源对象示例:
每隔两分钟运行一次由jobTemplate定义的任务,每次并发处理任务的Pod是两个,如果容器异常退出,则重启容器,Job任务输出当前时间后再输出Hello from the Kubernetes cluster;,然后再沉睡60s后任务执行成功。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: busybox-cronjob
  labels:
    app: cronjob
spec:
  schedule: "*/2 * * * *"
  concurrencyPolicy: Allow
  failedJobsHistoryLimit: 10
  successfulJobsHistoryLimit: 5
  jobTemplate:
    metadata:
      name: busybox-job
      labels:
        app: job
    spec:
      parallelism: 2
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: busybox
            image: busybox:latest
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster; sleep 60

创建cronjob控制器

kubectl apply -f busybox-cronjob.yaml

查看Cronjob

kubectl get cronjobs busybox-cronjob -o wide
NAME              SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE   CONTAINERS   IMAGES           SELECTOR
busybox-cronjob   */2 * * * *   False     0        <none>          2s    busybox      busybox:latest   <none>

两分钟后,cronjob控制器开始创建job控制器

kubectl get cronjobs busybox-cronjob -o wide --watch
NAME              SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE   CONTAINERS   IMAGES           SELECTOR
busybox-cronjob   */2 * * * *   False     0        <none>          19s   busybox      busybox:latest   <none>

busybox-cronjob   */2 * * * *   False     1        3s              74s   busybox      busybox:latest   <none>

查看jobs状态

kubectl get jobs -o wide
NAME                         COMPLETIONS   DURATION   AGE    CONTAINERS   IMAGES           SELECTOR
busybox-cronjob-1590723240   2/1 of 2      90s        116s   busybox      busybox:latest   controller-uid=8b3837a8-901f-41ff-8c17-0295da8998ec

Jobs控制器也开始创建Pod进行任务处理

查看Pod状态

kubectl get pods -o wide | grep busybox-cronjob
busybox-cronjob-1590723240-kmrxr                 0/1     Completed   0          3m45s   10.244.3.244   k8s-node01   <none>           <none>
busybox-cronjob-1590723240-v8p5s                 0/1     Completed   0          3m45s   10.244.3.243   k8s-node01   <none>           <none>

查看Pod日志

kubectl logs pods/busybox-cronjob-1590723240-kmrxr
Fri May 29 03:34:32 UTC 2020
Hello from the Kubernetes cluster

每个两分钟运行一次任务,CronJob则根据JobTemplate创建一个Job控制器,然后Job控制器创建两个Pod去执行任务,几个周期后,就会创建多个Job控制器也N个执行任务的Pod。

如下,已经创建了4个Job控制器

kubectl get jobs -o wide
NAME                         COMPLETIONS   DURATION   AGE     CONTAINERS   IMAGES           SELECTOR
busybox-cronjob-1590723240   2/1 of 2      90s        6m34s   busybox      busybox:latest   controller-uid=8b3837a8-901f-41ff-8c17-0295da8998ec
busybox-cronjob-1590723360   2/1 of 2      88s        4m33s   busybox      busybox:latest   controller-uid=ea9b4a57-e799-4b29-87a1-bd00ce3a7316
busybox-cronjob-1590723480   2/1 of 2      85s        2m33s   busybox      busybox:latest   controller-uid=3a1158de-cffb-44d7-9117-72e5544c6a40
busybox-cronjob-1590723600   0/1 of 2      33s        33s     busybox      busybox:latest   controller-uid=501a7203-9aeb-4095-9539-38102fb7afea

创建了8个Pod,任务执行完成后的Pod则标记为Completed状态

kubectl get pods -o wide | grep busybox-cronjob
busybox-cronjob-1590723240-kmrxr                 0/1     Completed   0          7m27s   10.244.3.244   k8s-node01   <none>           <none>
busybox-cronjob-1590723240-v8p5s                 0/1     Completed   0          7m27s   10.244.3.243   k8s-node01   <none>           <none>
busybox-cronjob-1590723360-54ls8                 0/1     Completed   0          5m26s   10.244.3.245   k8s-node01   <none>           <none>
busybox-cronjob-1590723360-bggd9                 0/1     Completed   0          5m26s   10.244.3.246   k8s-node01   <none>           <none>
busybox-cronjob-1590723480-dwtj2                 0/1     Completed   0          3m26s   10.244.3.247   k8s-node01   <none>           <none>
busybox-cronjob-1590723480-xr65b                 0/1     Completed   0          3m26s   10.244.3.248   k8s-node01   <none>           <none>
busybox-cronjob-1590723600-ldgkk                 1/1     Running     0          86s     10.244.3.249   k8s-node01   <none>           <none>
busybox-cronjob-1590723600-wvs7r                 1/1     Running     0          86s     10.244.3.250   k8s-node01   <none>           <none>

CronJob的控制机制

CronJob控制器是一个更高级别的资源,它以Job控制器资源为管控对象,并借助它管理Pod资源对象。因此,要使用类似如下命令来查看某CronJob控制器创建的Job资源对象,其中的标签app=job是在创建资源配置清单中指定。

如下查看Job控制器的命令,最多只能列出5个成功的Job,这由我们清单中successfulJobsHistoryLimit属性控制,上面清单中我定义的属性值为5,所以下面显示了5个成功的Job和一个正在运行的Job。

kubectl get jobs -l app=job -o wide
NAME                         COMPLETIONS   DURATION   AGE     CONTAINERS   IMAGES           SELECTOR
busybox-cronjob-1590723480   2/1 of 2      85s        11m     busybox      busybox:latest   controller-uid=3a1158de-cffb-44d7-9117-72e5544c6a40
busybox-cronjob-1590723600   2/1 of 2      111s       9m12s   busybox      busybox:latest   controller-uid=501a7203-9aeb-4095-9539-38102fb7afea
busybox-cronjob-1590723720   2/1 of 2      94s        7m11s   busybox      busybox:latest   controller-uid=ebee6db9-2218-4b91-9567-f766ec426371
busybox-cronjob-1590723840   2/1 of 2      95s        5m11s   busybox      busybox:latest   controller-uid=58d5ff6d-f323-4091-a541-6f238674a3cd
busybox-cronjob-1590723960   2/1 of 2      96s        3m11s   busybox      busybox:latest   controller-uid=e59a8c75-e53c-48dc-9c90-e1490f86c9fd
busybox-cronjob-1590724080   0/1 of 2      70s        70s     busybox      busybox:latest   controller-uid=cd495a92-155c-42f1-b917-4d23ed684ce3

假如我们还是每隔两分钟执行一次任务,但是我们每次执行任务的时间却需要三分钟,也就是任务执行时间超出了任务间隔时间,这个时候则需要两个Job对象同时存在的场景,那么就需要我们在清单中定义concurrencyPolicy属性为Allow来支持多个Job并存,来允许无论是先运行的Job或者是后运行的Job都能够在同时运行,值为Forbid则用于禁止前后两个Job同时运行,如果前一个Job尚未运行结束,后一个则跳过;Replace用于让后一个Job取代前一个Job,即终止前一个并启动后一个Job。

Ops工具

39. Kubernetes深入Pod控制器-Job控制器

2020-6-16 11:50:30

Ops工具

41. Kubernetes深入Service-Service资源介绍

2020-6-22 10:25:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索