CronJob 创建基于时隔重复调度的Jobs,CronJob 用于执行周期性的动作,例如备份、报告生成等。CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。
为 CronJob 资源创建清单时,请确保所提供的名称是一个合法的DNS域名。 名称不能超过 52 个字符。 这是因为 CronJob 控制器将自动在提供的 Job 名称后附加 11 个字符,并且存在一个限制, 即 Job 名称的最大长度不能超过 63 个字符。
分-时-天-月-周
- # ┌───────────── 分钟 (0 - 59)
- # │ ┌───────────── 小时 (0 - 23)
- # │ │ ┌───────────── 月的某天 (1 - 31)
- # │ │ │ ┌───────────── 月份 (1 - 12)
- # │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
- # │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
- # │ │ │ │ │
- # │ │ │ │ │
- # * * * * *
例如:下面这行指出必须在每个星期五的午夜以及每个月 13 号的午夜开始任务:
0 0 13 * 5
对于没有指定时区的 CronJob,kube-controller-manager 基于本地时区解释排期表
如果启用了 CronJobTimeZone,
启用该特性后,你可以将 spec.timeZone
设置为有效时区名称。 例如,设置 spec.timeZone: "Etc/UTC"
指示 Kubernetes 采用 UTC 来解释排期表。
从 Kubernetes v1.21 版本开始,CronJob 控制器的第二个版本被用作默认实现。 要禁用此默认 CronJob 控制器而使用原来的 CronJob 控制器,请在 kube-controller-manager 中设置特性门控 CronJobControllerV2
,将此标志设置为 false
1.命令行创建crontab
- kubectl run hello-crontab --schedule="*/2 * * * *" --restart= OnFailuer --image=nginx --image-pull-policy=IfNotPresent -- /bin/sh -c "date"
-
- 输出:
- Flag --schedule has been deprecated, has no effect and will be removed in the future.
- pod/hello-crontab created
2.通过yaml文件创建
- apiVersion: batch/v1
- kind: CronJob
- metadata:
- labels:
- run: hello
- name: hello-cronjob
- namespace: default
- spec:
- concurrencyPolicy: Allow
- failedJobsHistoryLimit: 1
- jobTemplate:
- metadata:
- spec:
- template:
- metadata:
- labels:
- run: hello
- spec:
- containers:
- - args:
- - /bin/sh
- - -c
- - date; echo Hello from the Kubernetes cluster
- image: registry.cn-beijing.aliyuncs.com/dotbalo/busybox
- imagePullPolicy: Always
- name: hello
- resources: {}
- restartPolicy: OnFailure
- securityContext: {}
- schedule: '*/1 * * * *'
- successfulJobsHistoryLimit: 3
- suspend: false
重点参数解析
- apiVersion: batch/v1beta1 #1.21+ batch/v1
- schedule:调度周期,和Linux一致,分别是分时日月周。
- restartPolicy:重启策略,和Pod一致,有Always,OnFailure,Never。
- concurrencyPolicy:并发调度策略。可选参数如下:
- Allow:允许同时运行多个任务。
- Forbid:不允许并发运行,如果之前的任务尚未完成,新的任务不会被创建。
- Replace:如果之前的任务尚未完成,新的任务会替换的之前的任务。
- suspend:如果设置为true,则暂停后续的任务,默认为false。
- successfulJobsHistoryLimit:保留多少已完成的任务,按需配置。
- failedJobsHistoryLimit:保留多少失败的任务。
- startingDeadlineSeconds 200 控制器会统计从 startingDeadlineSeconds 设置的值到现在而不是从上一个计划时间到现在错过了多少次 Job
结果
- [root@k8s-master1 crontab]# kubectl get cronjob
- NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
- hello-cronjob */1 * * * * False 0 <none> 11s
-
-
- [root@k8s-master1 crontab]# kubectl get job
- NAME COMPLETIONS DURATION AGE
- hello-cronjob-1662173580 1/1 4s 3m1s
- hello-cronjob-1662173640 1/1 4s 2m1s
- hello-cronjob-1662173700 1/1 3s 61s
- hello-cronjob-1662173760 0/1 0s 0s
-
-
- [root@k8s-master1 crontab]# kubectl get pod
- NAME READY STATUS RESTARTS AGE
- busybox 1/1 Running 4317 179d
- dapi-test-pod 0/1 Completed 0 137d
- hello-cronjob-1662173640-md8hf 0/1 Completed 0 3m2s
- hello-cronjob-1662173700-k7tpg 0/1 Completed 0 2m1s
- hello-cronjob-1662173760-lxnbj 0/1 Completed 0 61s
- hello-cronjob-1662173820-phtwj 0/1 ContainerCreating 0 1s
SCHEDULE:是指其调度的时间点
SUSPEND:表示后续任务是否处于挂起状态,即暂停任务的调度和运行
ACTIVE:表示活动状态的Job对象的数量
LAST SCHEDULE:表示上次调度运行至此刻的时长