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

vohkndzv  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(3)|浏览(112)

基本上我的cron是每2分钟更新一次数据库。但我需要运行另一个cron更新数据库每24小时。我需要确保没有竞争条件,而第二个cron(每天)正在运行,即两个cron不能一起运行和重叠。这需要在Kubernetes集群中使用作业实现。
我的解决方案是每2分钟运行一次第一个cron,但是当第二个cron运行时延迟5分钟(每天)。
任何替代解决方案都是受欢迎的。

olqngx59

olqngx591#

我试着思考一些可能性,但事情可能会出错,主要是因为你有一个需要每2分钟运行一次的工作,让我们假设你的日常工作出于任何原因需要比你预期的更多的时间,一个新的2分钟工作将开始,这不可能发生。
最好的解决方案是在代码级别解决这个问题。您可以在应用程序中创建一个锁,以防止这些作业同时运行。
如果你真的无法在代码中找到解决这个问题的方法,Kubernetes上有一种机制可以阻止同一个cronjob启动新的作业。您可以设置标记spec.concurrencyPolicy:禁止,因此如果您的作业启动时间超过2分钟,则将跳过新作业。这不是一个全局标志,这只是每个cronjob。
您可以使用spec.initContainers聚合这种可能性,并找到一种在同一cronjob中运行这两个任务的方法。
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

这个清单定义了一个cronJob,它将每2分钟运行一次,并将启动一个initContainer(你的2分钟作业),还将每2分钟运行第二个容器。问题是,在第二个容器中,我们有一个shell脚本检查是否是午夜(忽略了秒数,因为我们不能确定它何时开始)。
您可能需要调优这部分代码:

DATE=`date +"%H:%M"; if [[ $DATE == "00:00" ]

让我们假设你的第一个容器需要一分钟以上的时间来执行,它将是00:01,你的第二个作业将永远不会被执行。
让我知道这些信息和解决方案是否对您有帮助。

f8rj6qna

f8rj6qna2#

你可以使用cron来表示时间,比如 */2 * 和0 1 *,当你在任何偶数时刻开始运行代码时,它永远不会冲突。

tjjdgumg

tjjdgumg3#

时间表:“5/2 *",您可以在www.example.com获得配置https://crontab.guru/#5/2_*_*****也有一个特殊的小时。我还建议验证timezone和securityContext。下面是一个例子:

apiVersion: batch/v1
kind: CronJob
metadata:
  namespace: ns
  name: nameCronJob
spec:
  timeZone: "Europe/Rome"
  startingDeadlineSeconds: 1800
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  concurrencyPolicy: Forbid
  schedule: "5/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          securityContext:
            runAsUser: 1000
            runAsGroup: 2000
          restartPolicy: OnFailure
          imagePullSecrets:
          - name: regcred
          containers:
          - image: <repo>/<image>:<tag>
            imagePullPolicy: Always
            name: namejob_container
            command: ["/bin/bash","-c","script.sh"]

相关问题