如何在 N 小时内运行一次 Kubernetes 作业?



Kubernetes 文档提到CronJob支持以下用例:

一次在指定时间点

但是,我没有看到任何如何做到这一点的例子。具体来说,我希望开始一项工作,每N小时运行一次。

根据文档,CronJob 使用常见的 Cron 格式的调度:

以下是一些示例:

schedule: "1 2-14 * * 0-1,5-6" (first minute of every hour from 2am to 2pm UTC on Sun,Mon,Fri,Sat)
schedule: "*/1 * * * *" (every minute)

CronJobs也有一些限制:

cron 作业在其每个执行时间内大约创建一个作业对象一次 附表。我们说"关于"是因为在某些情况下 可能会创建两个作业,也可以不创建任何作业。我们试图 使这些罕见,但不要完全阻止它们。因此,工作 应该是幂等的

如果startingDeadlineSeconds设置为较大的值或未设置( 默认值(,如果concurrencyPolicy设置为Allow,则作业将 始终至少运行一次。

如果 CronJob 控制器未运行或 中断了一段时间,从 CronJob 的开始时间到 开始时间加上startingDeadlineSeconds,或者如果跨度覆盖 多个开始时间和concurrencyPolicy不允许并发。 例如,假设 cron 作业设置为正好在08:30:00并且其startingDeadlineSeconds设置为10,如果 CronJob 控制器恰好从08:29:00下降到08:42:00,作业将 不开始。startingDeadlineSeconds如果稍后开始是 总比不开始好。

Cronjob只负责创建与其匹配的作业 计划,作业反过来负责管理 它所代表的豆荚。

另一个重要的事情是 Kubernetes 只使用UTC。确保在创建计划时考虑到这一点。

要仅运行一次作业,您可以在管理员计算机或主节点上使用kubectl create -f job.yaml启动的at命令。

echo "kubectl create -f job.yaml" | at midnight 

它就像一个常规的 CronJob 对象,但使用 cronjob 表达式在特定时间点运行的格式:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
namespace: kube-system
spec:
schedule: "7 7 7 7 6"
restartPolicy: OnFailure
jobTemplate:
...

例如,这将运行"2018 年 7 月 7 日星期六 07:07"。

下一次出现将在 2029 年,因此您有足够的时间删除 cronJob 对象。也就是说,如果您不将其删除,它将创建一个新工作,据我所知,没有办法避免这种情况。

最新更新