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 对象。也就是说,如果您不将其删除,它将创建一个新工作,据我所知,没有办法避免这种情况。