CronJob 创建基于时隔重复调度的Jobs,CronJob 用于执行周期性的动作,例如备份、报告生成等。CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。

为 CronJob 资源创建清单时,请确保所提供的名称是一个合法的DNS域名。 名称不能超过 52 个字符。 这是因为 CronJob 控制器将自动在提供的 Job 名称后附加 11 个字符,并且存在一个限制, 即 Job 名称的最大长度不能超过 63 个字符。

Cron 时间表语法

分-时-天-月-周

# ┌───────────── 分钟 (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:表示上次调度运行至此刻的时长

Logo

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

更多推荐