gpt4 book ai didi

kubernetes - 如何每2分钟运行一次cron,但在特定时间的第5分钟开始运行cron?

转载 作者:行者123 更新时间:2023-12-02 12:28:51 26 4
gpt4 key购买 nike

基本上,我的cron每2分钟更新一次数据库。但是我需要运行另一个cron,它每24小时更新一次数据库。我需要确保第二个cron(每天)运行时没有比赛条件,即两个cron不能同时运行并重叠。这需要使用作业在Kubernetes集群中实现。
我的解决方案是每2分钟运行第一个cron,但在第二个cron运行(每天)时延迟5分钟。
任何其他解决方案均受到欢迎。

最佳答案

我尝试考虑的可能性很小,但事情可能会出错,主要是因为您有一项工作需要每2分钟运行一次,并且假设由于某种原因您的日常工作比您预期的要花费更多的时间,而新的2分钟工作将开始,这不会发生。

最好的解决方案是在代码级别解决此问题。您可以在应用程序中创建一个锁,以防止这些作业同时运行。

如果您真的无法在代码中提出解决此问题的解决方案,那么Kubernetes上有一种机制可以阻止从同一cronjob启动新作业。您可以设置标记spec.concurrencyPolicy: Forbid,以便如果您的作业开始时间超过2分钟,则新作业将被跳过。这不是全局标志,仅针对每个cronjob。

您可以使用spec.initContainers汇总这种可能性,并找到在同一个cronjob中运行两个任务的方法。

spec.initContainers是在应用程序容器之前运行的专用容器。

这是一个例子:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
concurrencyPolicy: Forbid
schedule: "*/2 * * * *"
jobTemplate:
spec:
template:
spec:
initContainers
- name: hello1
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
containers:
- name: hello2
image: busybox
args:
- /bin/sh
- -c
- DATE=`date +"%H:%M"`; if [[ $DATE == "00:00" ]]; then date; echo Hello from the Kubernetes cluster; fi
restartPolicy: OnFailure

此 list 定义了一个cronJob,它将每2分钟运行一次,并将启动一个initContainer(您的2分钟工作),并且还将每2分钟运行另一个容器。问题是,在第二个容器中,我们有一个shell脚本检查它是否是午夜(忽略秒,因为我们不确定何时开始)。

您可能需要调整代码的这一部分:
DATE=`date +"%H:%M"; if [[ $DATE == "00:00" ]

假设您的第一个容器要花一分钟以上的时间执行,它将是00:01,而第二个作业将永远不会执行。

让我知道这些信息和解决方案是否对您有所帮助。

关于kubernetes - 如何每2分钟运行一次cron,但在特定时间的第5分钟开始运行cron?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60771984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com