使用 CronJob 运行自动化任务

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

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

    • 你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 如果你还没有集群,你可以通过 构建一 个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    要获知版本信息,请输入 kubectl version.

    • 你需要一个版本 >=1.8 且工作正常的 Kubernetes 集群。对于更早的版本( <1.8 ),你需要对 API 服务器设置 --runtime-config=batch/v2alpha1=true 来开启 batch/v2alpha1 API,(更多信息请查看 为你的集群开启或关闭 API 版本 ), 然后重启 API 服务器和控制管理器。

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

    想要运行示例的 CronJob,可以下载示例文件并执行命令:

    1. $ kubectl create -f ./cronjob.yaml
    2. cronjob "hello" created

    或者你也可以使用 kubectl run 来创建一个 CronJob 而不需要编写完整的配置:

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

    1. $ kubectl get cronjob hello
    2. hello */1 * * * * False 0 <none>

    就像你从命令返回结果看到的那样,CronJob 还没有调度或执行任何任务。大约需要一分钟任务才能创建好。

    1. $ kubectl get cronjob hello
    2. NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
    3. hello */1 * * * * False 0 Mon, 29 Aug 2016 14:34:00 -0700

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

    现在,找到最后一次调度任务创建的 Pod 并查看一个 Pod 的标准输出。请注意任务名称和 Pod 名称是不同的。

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

    1. cronjob "hello" deleted

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

    像 Kubernetes 的其他配置一样,CronJob 需要 apiVersionkind、 和 metadata 域。配置文件的一般信息,请参考 部署应用 和 .

    CronJob 配置也需要包括.spec.

    .spec.schedule.spec 需要的域。它使用了 格式串,例如 0 * * * * or @hourly ,做为它的任务被创建和执行的调度时间。

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

    任务模版

    .spec.jobTemplate是任务的模版,它是必须的。它和 Job的语法完全一样,除了它是嵌套的没有 和 kind。 编写任务的 .spec ,请参考 。

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

    CronJob 控制器会统计错过了多少次调度。如果错过了100次以上的调度,CronJob 就不再调度了。当没有设置 .spec.startingDeadlineSeconds 时,CronJob 控制器统计从status.lastScheduleTime到当前的调度错过次数。 例如一个 CronJob 期望每分钟执行一次,status.lastScheduleTime是 5:00am,但现在是 7:00am。那意味着120次调度被错过了,所以 CronJob 将不再被调度。 如果设置了 .spec.startingDeadlineSeconds 域(非空),CronJob 控制器统计从 .spec.startingDeadlineSeconds 到当前时间错过了多少次任务。 例如设置了 200,它会统计过去200秒内错过了多少次调度。在那种情况下,如果过去200秒内错过了超过100次的调度,CronJob 就不再调度。

    并发性规则

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

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

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

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

    任务历史限制