Kubernetes CronJob将来运行一次

时间:2018-06-21 16:12:05

标签: cron kubernetes kubernetes-cronjob

Kubernetes CronJob docs提到CronJob支持以下用例:

  
      
  • 在指定的时间点
  •   

但是,我没有看到任何示例/说明如何实现此目标。具体来说,我希望开始在 N 小时内运行一次的工作。任何版本的Kubernetes都支持吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据documentation,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开始   并且如果CronJob将其startingDeadlineSeconds设置为10   控制器恰好从08:29:00降到08:42:00,作业将   无法启动。如果稍后开始,请设置更长的startingDeadlineSeconds   总比根本不开始要好。

     

Cronjob仅负责创建与其匹配的作业   时间表,而工作又负责管理   它代表的豆荚。

另一个重要的事情是Kubernetes仅使用 UTC 。创建时间表时,请确保考虑到这一点。

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

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