在 k8s 中,CronJob 是一种用于定期执行任务的资源对象。它基于 Cron 表达式,允许您在指定的时间间隔内自动运行容器化的任务。
CronJob 可以定义以下属性:
schedule
:指定任务执行的时间表,使用标准的 Cron 表达式语法。例如,“0 * * * *” 表示每小时执行一次任务。jobTemplate
:定义要执行的任务的模板,通常是一个 Pod 模板。这个模板包含了任务所需的容器镜像、命令、环境变量等配置。concurrencyPolicy
:指定任务并发策略,默认为 Allow
。Allow
表示允许并发执行任务,Forbid
表示禁止并发执行任务,新任务将会被跳过,Replace
表示如果任务正在执行,则会终止当前任务并启动新任务。successfulJobsHistoryLimit
和 failedJobsHistoryLimit
:指定保留成功和失败任务历史记录的数量。当 CronJob 被创建后,它将按照指定的时间表自动创建和调度 Job 对象。每个 Job 对象代表了一次任务的执行。k8s 将确保根据时间表创建和执行任务,并在任务完成后终止和清理相关的 Job 和 Pod。
CronJob 提供了一种简便的方式来周期性地运行容器化任务,例如定时备份、数据清理、定期报告等。它减少了手动执行任务的工作量,并提供了可靠的任务调度和执行机制。
在现代的云原生应用中,定时任务是一个非常重要的组成部分。k8s 提供了一种称为 CronJob 的机制,可以让我们方便地定义和管理定时任务。
CronJob 管理基于时间的 job,即:
一个 CronJob 对象类似于 crontab(cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 cron。
典型的用法如下所示:
CronJob 表达式由五个字段组成,分别代表分钟、小时、日、月、周几。每个字段可以是以下任何值:
CronJob 表达式示例:
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
(默认):允许并发运行 JobForbid
:禁止并发运行,如果前一个还没有完成,则直接跳过下一个Replace
:取消当前正在运行的 Job,用一个新的来替换注意,当前策略只能应用于同一个 Cron Job 创建的 Job。如果存在多个 Cron Job,它们创建的 Job 之间总是允许并发运行。
.spec.suspend
:挂起,该字段也是可选的。如果设置为 true
,后续所有执行都会被挂起。它对已经开始执行的 Job 不起作用。默认值为 false
。
.spec.successfulJobsHistoryLimit
和 .spec.failedJobsHistoryLimit
:历史限制,是可选的字段。它们指定了可以保留多少完成和失败的 Job。默认情况下,它们分别设置为 3
和 1
。设置限制的值为 0
,相关类型的 Job 完成后将不会被保留。
下面编写一个案例进行测试
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
[root@k8s-master k8s]# vi my-cj.yaml
[root@k8s-master k8s]# kubectl apply -f my-cj.yaml
cronjob.batch/hello created
[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
[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
[root@k8s-master k8s]# kubectl logs hello-28524539-bhkbl
Tue Mar 26 16:59:16 UTC 2024
yigongsui cronjob logs
日志正常输出
[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个
[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 也全部删除了