CronJob
控制器是 Kubernetes 中用于周期性执行任务的一种控制器,它基于 Job
控制器来创建和管理作业。以下是 CronJob
的一些关键特点:
-
周期性调度:
CronJob
允许您定义一个基于时间的调度,类似于 Linux 的cron
工具,来周期性地执行任务。 -
时间点触发:
CronJob
根据指定的时间表(cron 表达式)触发,可以精确到分钟。 -
一次性或重复执行:尽管
CronJob
主要用于重复性任务,但它也可以配置为仅执行一次。 -
立即执行:如果需要,可以在创建
CronJob
之后立即启动第一个作业。 -
并行性控制:可以设置
CronJob
的并行性策略,决定是否允许多个 Job 实例并行运行,或者在新实例启动前完成上一个实例。 -
成功和失败处理:
CronJob
可以配置成功和失败的工作节(job history limit)限制,以控制保留成功和失败的 Job 记录的数量。 -
暂停和恢复:
CronJob
支持暂停和恢复功能,允许您临时停止或恢复周期性任务的执行。 -
时区处理:
CronJob
允许您指定时区,以确保任务在特定地理区域的特定时间执行。 -
灵活的 cron 表达式:支持复杂的 cron 表达式,以满足不同的时间调度需求。
CronJob的资源清单
---
apiVersion: batch/v1beta1 # 版本号
kind: CronJob # 类型
metadata: # 元数据name: # rs名称namespace: # 所属命名空间labels: # 标签controller: cronjob
spec: # 详情描述schedule: # cron格式的作业调度运行时间点,用于控制任务在什么时间执行concurrencyPolicy: # 并发执行策略,用于定义前一次作业运行尚未完成时是否以及如何运行后一次的作业failedJobHistoryLimit: # 为失败的任务执行保留的历史记录数,默认为1successfulJobHistoryLimit: # 为成功的任务执行保留的历史记录数,默认为3startingDeadlineSeconds: # 启动作业错误的超时时长jobTemplate: # job控制器模板,用于为cronjob控制器生成job对象;下面其实就是job的定义spec:completions: 1parallelism: 1activeDeadlineSeconds: 30backoffLimit: 6manualSelector: truetemplate:metadata:labels:app: counter-podspec:restartPolicy: Nevercontainers:- name: counterimage: busybox:1.30command: ["bin/sh", "-c", "for i in 9 8 7 6 5 4 3 2 1; do echo $i; sleep 20; done"]
schedule
schedule
是一个 cron 表达式,用于定义 CronJob
的执行计划。cron 表达式由五个字段组成,分别表示分钟、小时、日期(一个月中的哪一天)、月份和星期几。每个字段可以包含以下几种类型的值:
-
具体值:例如
1
或15
。 -
逗号分隔的多个值:例如
1,15
表示第 1 分钟和第 15 分钟。 -
范围:使用连字符
-
表示,例如1-3
表示从第 1 分钟到第 3 分钟。 -
通配符:使用星号
*
表示匹配任意值。 -
步长:使用斜杠
/
表示,例如*/15
表示从 0 开始每 15 分钟。
cron 表达式的字段含义如下:
-
分钟:0 到 59
-
小时:0 到 23
-
日期:1 到 31
-
月份:1 到 12 或 JAN 到 DEC
-
星期:0 到 6(0 表示星期天)或 SUN 到 SAT
测试:
---
apiVersion: batch/v1
kind: CronJob
metadata:name: pc-cronjobnamespace: test
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:restartPolicy: Nevercontainers:- name: counterimage: busybox:1.30command: ["bin/sh", "-c", "for i in 9 8 7 6 5 4 3 2 1; do echo $i; sleep 3; done"]
- 查看cronjob:
cronjob每分钟执行一次,当job执行时会启动一个pod,pod启动完成job结束当前任务
[root@k8s-master ~]# kubectl get cronjob -n test -w
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
pc-cronjob */1 * * * * False 0 <none> 0s
pc-cronjob */1 * * * * False 1 0s 38s
kubectl get job -n test -w
pc-cronjob */1 * * * * False 0 30s 68s
pc-cronjob */1 * * * * False 1 0s 98s
pc-cronjob */1 * * * * False 0 30s 2m8s
- 查看job:
[root@k8s-master ~]# kubectl get job -n test -wNAME COMPLETIONS DURATION AGE
pc-cronjob-28956119 0/1 20s 20s
pc-cronjob-28956119 1/1 30s 30s
pc-cronjob-28956120 0/1 0s
pc-cronjob-28956120 0/1 0s 0s
pc-cronjob-28956120 1/1 30s 30s
- 查看pod:
可以看的pod创建之后,会结束当前任务,等待一分钟之后再次启动pod
^C[root@k8s-master ~]# kubectl get pods -n test -w
NAME READY STATUS RESTARTS AGE
pc-daemonset-9vwvd 1/1 Running 0 52m
pc-daemonset-drdt5 1/1 Running 0 52m
pc-cronjob-28956119-n7cxf 0/1 Pending 0 0s
pc-cronjob-28956119-n7cxf 0/1 Pending 0 0s
pc-cronjob-28956119-n7cxf 0/1 ContainerCreating 0 0s
pc-cronjob-28956119-n7cxf 0/1 ContainerCreating 0 2s
pc-cronjob-28956119-n7cxf 1/1 Running 0 2s
pc-cronjob-28956119-n7cxf 0/1 Completed 0 30s
pc-cronjob-28956119-n7cxf 0/1 Completed 0 30s
pc-cronjob-28956120-4q5sv 0/1 Pending 0 0s
pc-cronjob-28956120-4q5sv 0/1 Pending 0 0s
pc-cronjob-28956120-4q5sv 0/1 ContainerCreating 0 0s
pc-cronjob-28956120-4q5sv 0/1 ContainerCreating 0 1s
pc-cronjob-28956120-4q5sv 1/1 Running 0 2s
pc-cronjob-28956120-4q5sv 0/1 Completed 0 30s
pc-cronjob-28956120-4q5sv 0/1 Completed 0 30s