避免在Kubernetes中为一个cron执行点运行多个cron作业 [英] Avoid multiple cron jobs running for one cron execution point in Kubernetes

查看:306
本文介绍了避免在Kubernetes中为一个cron执行点运行多个cron作业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题已解决,这是我的错误,我只是使用了错误的cron设置.我假设"* 2 * * *"每天仅在2点运行一次,但实际上它在每小时2点之后每分钟运行一次.因此Kubernetes的行为正确.

我总是在一个cron执行点上运行多个作业.但是似乎只有这些作业的运行时间很短.知道为什么会发生这种情况以及如何预防吗?我使用concurrencyPolicy: ForbidbackoffLimit: 0restartPolicy: Never.

I keep having multiple jobs running at one cron execution point. But it seems only if those jobs have a very short runtime. Any idea why this happens and how I can prevent it? I use concurrencyPolicy: Forbid, backoffLimit: 0 and restartPolicy: Never.

cron作业的示例,该作业本应每天运行一次,但仅在其计划运行时间之后运行多次:

Example for a cron job that is supposed to run once per day, but runs multiple times just after its scheduled run time:

job-1554346620                   1/1           11s        4h42m   
job-1554346680                   1/1           11s        4h41m                     
job-1554346740                   1/1           10s        4h40m 

相关配置:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: job
spec:
  schedule: "* 2 * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: job
              image: job_image:latest
              command: ["rake", "run_job"]
          restartPolicy: Never
          imagePullSecrets:
            - name: regcred
      backoffLimit: 0

推荐答案

在k8s上运行CronJobs的最常见问题是:

The most common problem of running CronJobs on k8s is:

产生许多消耗所有群集资源的Pod

spawning to many pods which consume all cluster resources

设置适当的CronJob限制非常重要

It is very important to set proper CronJob limitations

如果不确定自己需要什么,只需将以下示例作为模板:

If you are not sure what you need - just take this example as a template:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: my-first-conjob
  namespace: devenv-admitriev
spec:
  schedule: "*/10 * * * *" # MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
  successfulJobsHistoryLimit: 3 # how many completed jobs should be kept
  failedJobsHistoryLimit: 1 # how many failed jobs should be kept
  suspend: false # Here you can suspend cronjob without deliting it
  concurrencyPolicy: Forbid # Choose Forbid if you don't want concurrent executions of your Job

  # The amount of time that Kubernetes can miss and still start a job.
  # If Kubernetes missed too many job starts (100)
  # then Kubernetes logs an error and doesn’t start any future jobs.
  startingDeadlineSeconds: 300 # if a job hasn't started in this many seconds, skip
  jobTemplate:
    spec:
      parallelism: 1 # How many pods will be instantiated at once.
      completions: 1 # How many containers of the job are instantiated one after the other (sequentially) inside the pod.
      backoffLimit: 3 # Maximum pod restarts in case of failure
      activeDeadlineSeconds: 1800 # Limit the time for which a Job can continue to run
      template:
        spec:
          restartPolicy: Never # If you want to restart - use OnFailure
          terminationGracePeriodSeconds: 30
          containers:
          - name: my-first-conjob
            image: busybox
            command:
              - /bin/sh
            args:
              - -c
              - date; echo sleeping....; sleep 90s; echo exiting...;
            resources:
              requests:
                memory: '128Mi'
              limits:
                memory: '1Gi'

这篇关于避免在Kubernetes中为一个cron执行点运行多个cron作业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆