CronJob

什么是 CronJob

在 k8s 中,CronJob 是一种用于定期执行任务的资源对象。它基于 Cron 表达式,允许您在指定的时间间隔内自动运行容器化的任务。

CronJob 可以定义以下属性:

  • schedule:指定任务执行的时间表,使用标准的 Cron 表达式语法。例如,“0 * * * *” 表示每小时执行一次任务。
  • jobTemplate:定义要执行的任务的模板,通常是一个 Pod 模板。这个模板包含了任务所需的容器镜像、命令、环境变量等配置。
  • concurrencyPolicy:指定任务并发策略,默认为 AllowAllow 表示允许并发执行任务,Forbid 表示禁止并发执行任务,新任务将会被跳过,Replace 表示如果任务正在执行,则会终止当前任务并启动新任务。
  • successfulJobsHistoryLimitfailedJobsHistoryLimit:指定保留成功和失败任务历史记录的数量。

当 CronJob 被创建后,它将按照指定的时间表自动创建和调度 Job 对象。每个 Job 对象代表了一次任务的执行。k8s 将确保根据时间表创建和执行任务,并在任务完成后终止和清理相关的 Job 和 Pod。

CronJob 提供了一种简便的方式来周期性地运行容器化任务,例如定时备份、数据清理、定期报告等。它减少了手动执行任务的工作量,并提供了可靠的任务调度和执行机制。

CronJob 特点

在现代的云原生应用中,定时任务是一个非常重要的组成部分。k8s 提供了一种称为 CronJob 的机制,可以让我们方便地定义和管理定时任务。

CronJob 管理基于时间的 job,即:

  • 在给定时间点只运行一次
  • 周期性地在给定时间点运行

一个 CronJob 对象类似于 crontab(cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 cron。

典型的用法如下所示:

  • 在给定的时间点调度 Job 运行
  • 创建周期性运行的 Job,例如:数据库备份、发送邮件。

CronJob 表达式由五个字段组成,分别代表分钟、小时、日、月、周几。每个字段可以是以下任何值:

  • 单个数字:例如5表示第5分钟或5月份。
  • 逗号分隔的数字列表:例如5,15,25表示第5、15和25分钟。
  • 连续的数字范围:例如10-15表示从第10分钟到第15分钟。
  • 星号(*):表示匹配该字段的所有值。例如在分钟字段上使用星号表示每分钟执行任务。
  • 斜杠(/):表示步长值。例如在分钟字段上使用"*/3"表示每隔3分钟执行一次任务。

CronJob 表达式示例:

  • 每小时执行:0 * * * *
  • 每天晚上10点执行:0 22 * * *
  • 每周一早上6点执行:0 6 * * 1
  • 每2分钟运行一次任务 : */2 * * * *

示例

cronjob 类似于 Linux 的 crontab, cronjob 简写为 cj,查看 cronjob 任务。

查看所有 cronjob,默认是 default 空间下

kubectl get cj 或 kubectl get cronjob
[root@k8s-master k8s]# kubectl get cj
No resources found in default namespace.
[root@k8s-master k8s]# kubectl get cronjob
No resources found in default namespace.

CronJob 的基本属性:

CronJob Spec

  • .spec.schedule:调度,必需字段,指定任务运行周期,格式同 Cron

  • .spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务,格式同 Job

  • .spec.startingDeadlineSeconds :启动 Job 的期限(秒级别),该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败的。如果没有指定,则没有期限

  • .spec.concurrencyPolicy:并发策略,该字段也是可选的。它指定了如何处理被 Cron Job 创建的 Job 的并发执行。只允许指定下面策略中的一种:

    • Allow(默认):允许并发运行 Job
    • Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个
    • Replace:取消当前正在运行的 Job,用一个新的来替换

    注意,当前策略只能应用于同一个 Cron Job 创建的 Job。如果存在多个 Cron Job,它们创建的 Job 之间总是允许并发运行。

  • .spec.suspend :挂起,该字段也是可选的。如果设置为 true,后续所有执行都会被挂起。它对已经开始执行的 Job 不起作用。默认值为 false

  • .spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit :历史限制,是可选的字段。它们指定了可以保留多少完成和失败的 Job。默认情况下,它们分别设置为 31。设置限制的值为 0,相关类型的 Job 完成后将不会被保留。

下面编写一个案例进行测试

  1. 编辑 yaml 文件my-cj.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"       # 每一分钟执行一次任务
  # 描述自己的定时任务具体内容
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: hello
              image: busybox
              args:
                - /bin/sh
                - -c
                - date; echo yigongsui cronjob logs
          restartPolicy: OnFailure
  1. 执行 yaml 文件,创建 cronjob
[root@k8s-master k8s]# vi my-cj.yaml
[root@k8s-master k8s]# kubectl apply -f my-cj.yaml 
cronjob.batch/hello created
  1. 查看 cronjob 和 pod
[root@k8s-master k8s]# kubectl get cj
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        29s             34s
[root@k8s-master k8s]# kubectl get pod
NAME                   READY   STATUS      RESTARTS   AGE
hello-28524538-hrckz   0/1     Completed   0          32s
  1. 过一分钟,再次查看 pod
[root@k8s-master k8s]# kubectl get pod
NAME                   READY   STATUS              RESTARTS   AGE
hello-28524538-hrckz   0/1     Completed           0          63s
hello-28524539-bhkbl   0/1     ContainerCreating   0          3s

发现又生成了一个 pod

  1. 查看日志:
[root@k8s-master k8s]# kubectl logs hello-28524539-bhkbl
Tue Mar 26 16:59:16 UTC 2024
yigongsui cronjob logs

日志正常输出

  1. 过了3分钟以上以后查看 pod 和 job
[root@k8s-master k8s]# kubectl get job
NAME             COMPLETIONS   DURATION   AGE
hello-28524542   1/1           19s        2m26s
hello-28524543   1/1           18s        86s
hello-28524544   1/1           19s        26s
[root@k8s-master k8s]# kubectl get pod
NAME                   READY   STATUS      RESTARTS   AGE
hello-28524542-ncqvk   0/1     Completed   0          2m30s
hello-28524543-m8gdf   0/1     Completed   0          90s
hello-28524544-2vcqt   0/1     Completed   0          30s

可以看到只有3个 job 和 pod,这是新版本的特性,定时任务启动的 job 和 pod 只会保留3个

  1. 删除这个 cronjob,查看 job 和 pod
[root@k8s-master k8s]# kubectl delete -f my-cj.yaml
cronjob.batch "hello" deleted
[root@k8s-master k8s]# kubectl get job
No resources found in default namespace.
[root@k8s-master k8s]# kubectl get pod
No resources found in default namespace.

可以看到 job 和 pod 也全部删除了

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐