k8s入门到实战(十)—— CronJob详细介绍及使用示例
k8s从入门到实战篇章(第十篇)—— 详细介绍k8s中CronJob的基本概念以及使用
CronJob
什么是 CronJob
在 k8s 中,CronJob 是一种用于定期执行任务的资源对象。它基于 Cron 表达式,允许您在指定的时间间隔内自动运行容器化的任务。
CronJob 可以定义以下属性:
schedule
:指定任务执行的时间表,使用标准的 Cron 表达式语法。例如,“0 * * * *” 表示每小时执行一次任务。jobTemplate
:定义要执行的任务的模板,通常是一个 Pod 模板。这个模板包含了任务所需的容器镜像、命令、环境变量等配置。concurrencyPolicy
:指定任务并发策略,默认为Allow
。Allow
表示允许并发执行任务,Forbid
表示禁止并发执行任务,新任务将会被跳过,Replace
表示如果任务正在执行,则会终止当前任务并启动新任务。successfulJobsHistoryLimit
和failedJobsHistoryLimit
:指定保留成功和失败任务历史记录的数量。
当 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
(默认):允许并发运行 JobForbid
:禁止并发运行,如果前一个还没有完成,则直接跳过下一个Replace
:取消当前正在运行的 Job,用一个新的来替换
注意,当前策略只能应用于同一个 Cron Job 创建的 Job。如果存在多个 Cron Job,它们创建的 Job 之间总是允许并发运行。
-
.spec.suspend
:挂起,该字段也是可选的。如果设置为true
,后续所有执行都会被挂起。它对已经开始执行的 Job 不起作用。默认值为false
。 -
.spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
:历史限制,是可选的字段。它们指定了可以保留多少完成和失败的 Job。默认情况下,它们分别设置为3
和1
。设置限制的值为0
,相关类型的 Job 完成后将不会被保留。
下面编写一个案例进行测试
- 编辑 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
- 执行 yaml 文件,创建 cronjob
[root@k8s-master k8s]# vi my-cj.yaml
[root@k8s-master k8s]# kubectl apply -f my-cj.yaml
cronjob.batch/hello created
- 查看 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
- 过一分钟,再次查看 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
- 查看日志:
[root@k8s-master k8s]# kubectl logs hello-28524539-bhkbl
Tue Mar 26 16:59:16 UTC 2024
yigongsui cronjob logs
日志正常输出
- 过了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个
- 删除这个 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 也全部删除了
更多推荐
所有评论(0)