使用 CronJob 运行自动化任务

    你可以利用 CronJob 执行基于时间调度的 。 这些自动化任务和 Linux 或者 Unix 系统的 Cron 任务类似。

    CronJob 在创建周期性以及重复性的任务时很有帮助,例如执行备份操作或者发送邮件。 CronJob 也可以在特定时间调度单个任务,例如你想调度低活跃周期的任务。

    CronJob 有一些限制和特点。 例如,在特定状况下,同一个 CronJob 可以创建多个任务。 因此,任务应该是幂等的。

    有关更多限制,请参考 。

    • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

      您的 Kubernetes 服务器版本必须不低于版本 v1.21. 要获知版本信息,请输入 kubectl version.

    CronJob 需要一个配置文件。 本例中 CronJob 的.spec 配置文件每分钟打印出当前时间和一个问好信息:

    执行以下命令以运行此 CronJob 示例:

    1. kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml

    输出类似于:

    1. cronjob.batch/hello created

    创建好 CronJob 后,使用下面的命令来获取其状态:

    1. kubectl get cronjob hello

    输出类似于:

    1. kubectl get jobs --watch
    1. NAME COMPLETIONS DURATION AGE
    2. hello-4111706356 0/1 0s
    3. hello-4111706356 1/1 5s 5s

    现在你已经看到了一个运行中的任务被 “hello” CronJob 调度。 你可以停止监视这个任务,然后再次查看 CronJob 就能看到它调度任务:

    1. kubectl get cronjob hello

    输出类似于:

    你应该能看到 hello CronJob 在 LAST SCHEDULE 声明的时间点成功地调度了一次任务。 目前有 0 个活跃的任务,这意味着任务执行完毕或者执行失败。

    现在,找到最后一次调度任务创建的 Pod 并查看一个 Pod 的标准输出。

    说明: Job 名称与 Pod 名称不同。

    1. # 在你的系统上将 "hello-4111706356" 替换为 Job 名称
    2. pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})

    查看 Pod 日志:

    1. kubectl logs $pods

    输出类似于:

    1. Fri Feb 22 11:02:09 UTC 2019

    当你不再需要 CronJob 时,可以用 kubectl delete cronjob <cronjob name> 删掉它:

    删除 CronJob 会清除它创建的所有任务和 Pod,并阻止它创建额外的任务。你可以查阅 垃圾收集

    像 Kubernetes 的其他配置一样,CronJob 需要 apiVersionkindmetadata 字段。 有关配置文件的一般信息,请参考 和 使用 kubectl 管理资源

    CronJob 配置也需要包括 。

    说明: 对 CronJob 的所有改动,特别是它的 .spec,只会影响将来的运行实例。

    该格式也包含了扩展的 “Vixie cron” 步长值。 FreeBSD 手册中解释如下:

    说明: 调度中的问号 (?) 和星号 * 含义相同,表示给定字段的任何可用值。

    任务模板

    .spec.jobTemplate是任务的模板,它是必需的。它和 Job 的语法完全一样, 只不过它是嵌套的,没有 apiVersion 和 。 有关如何编写一个任务的 .spec,请参考 。

    .spec.startingDeadlineSeconds 字段是可选的。 它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务。 不满足这种最后期限的任务会被统计为失败任务。如果此字段未设置,那任务就没有最后期限。

    如果 .spec.startingDeadlineSeconds 字段被设置(非空), CronJob 控制器将会计算从预期创建 Job 到当前时间的时间差。 如果时间差大于该限制,则跳过此次执行。

    例如,如果将其设置为 200,则 Job 控制器允许在实际调度之后最多 200 秒内创建 Job。

    并发性规则

    .spec.concurrencyPolicy 也是可选的。它声明了 CronJob 创建的任务执行时发生重叠如何处理。 spec 仅能声明下列规则中的一种:

    • Allow (默认):CronJob 允许并发任务执行。
    • Forbid: CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。

    请注意,并发性规则仅适用于相同 CronJob 创建的任务。如果有多个 CronJob,它们相应的任务总是允许并发执行的。

    .spec.suspend 字段也是可选的。如果设置为 true ,后续发生的执行都会被挂起。 这个设置对已经开始的执行不起作用。默认是 false

    注意: 在调度时间内挂起的执行都会被统计为错过的任务。当 .spec.suspendtrue 改为 false 时, 且没有,错过的任务会被立即调度。

    任务历史限制

    .spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit是可选的。 这两个字段指定应保留多少已完成和失败的任务。 默认设置分别为 3 和 1。设置为 0 代表相应类型的任务完成后不会保留。