如何在一定次数的重试后失败(cron)工作?

时间:2018-01-29 16:37:11

标签: kubernetes

我们设置了一个Kubernetes网络抓取cron作业集群。所有这些似乎都很顺利,直到cron作业开始失败(例如,当站点结构发生变化而我们的刮板不再起作用时)。它看起来像是偶尔会有一些失败的cron作业将继续重试到它带来我们的集群的程度。运行kubectl get cronjobs(在群集发生故障之前)将显示运行失败作业的作业太多。

我尝试按照here所述的说明关于pod退避失败政策的已知问题;但是,这似乎不起作用。

以下是我们的参考配置:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scrape-al
spec:
  schedule: '*/15 * * * *'
  concurrencyPolicy: Allow
  failedJobsHistoryLimit: 0
  successfulJobsHistoryLimit: 0
  jobTemplate:
    metadata:
      labels:
        app: scrape
        scrape: al
    spec:
      template:
        spec:
          containers:
            - name: scrape-al
              image: 'govhawk/openstates:1.3.1-beta'
              command:
                - /opt/openstates/openstates/pupa-scrape.sh
              args:
                - al bills --scrape
          restartPolicy: Never
      backoffLimit: 3

理想情况下,我们希望在N次重试后终止一个cron作业(例如kubectl delete cronjob my-cron-job失败5次后my-cron-job之类的事情。任何想法或建议将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:8)

您可以告诉您的工作停止使用backoffLimit重试。

  

指定标记此作业失败前的重试次数。

在你的情况下

spec:
  template:
    spec:
      containers:
        - name: scrape-al
          image: 'govhawk/openstates:1.3.1-beta'
          command:
            - /opt/openstates/openstates/pupa-scrape.sh
          args:
            - al bills --scrape
      restartPolicy: Never
  backoffLimit: 3

您将3设为作业的backoffLimit。这意味着当CronJob创建一个Job时,如果失败,它将重试3次。这可以控制Job,而不是CronJob

当作业失败时,将再次创建另一个作业作为预定时间段。

你想要: 如果我没有错,您希望停止安排新作业,当您的预定作业失败5次时。正确?

<强>答案: 在这种情况下,这是不可能的

可能的解决方案: 你需要suspend CronJob,而不是停止安排新的Job。

Suspend: true

您可以手动执行此操作。如果您不想手动执行此操作,则需要设置一个观察器,它将监视您的CronJob状态,并在必要时更新CronJob以暂停。