我如何确保我的cronjob工作不会在失败时重试?

问题描述 投票:0回答:1

我有一个在GKE上运行的Kubernetes Cronjob,运行Cucumber JVM测试。如果由于断言失败、某些资源不可用等原因导致Step失败,Cucumber会正确地抛出一个异常,导致Cronjob作业失败,Kubernetes pod的状态变为 ERROR. 这导致创建一个新的pod,试图再次运行相同的Cucumber测试,再次失败,再次重试。

我不希望这些重试发生。如果一个Cronjob作业失败了,我希望它保持在失败的状态,根本不重试。基于 这个我已经尝试过设置 backoffLimit: 0 结合 restartPolicy: Never 结合 concurrencyPolicy: Forbid但它仍然通过创建新的荚和再次运行测试重试。

我缺少什么?这是我的Cronjob的kube清单。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: quality-apatha
  namespace: default
  labels:
    app: quality-apatha
spec:
  schedule: "*/1 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      backoffLimit: 0
      template:
        spec:
          containers:
            - name: quality-apatha
              image: FOO-IMAGE-PATH
              imagePullPolicy: "Always"
              resources:
                limits:
                  cpu: 500m
                  memory: 512Mi
              env:
                - name: FOO
                  value: BAR
              volumeMounts:
                - name: FOO
                  mountPath: BAR
              args:
                - java
                - -cp
                - qe_java.job.jar:qe_java-1.0-SNAPSHOT-tests.jar
                - org.junit.runner.JUnitCore
                - com.liveramp.qe_java.RunCucumberTest
          restartPolicy: Never
          volumes:
            - name: FOO
              secret:
                secretName: BAR

有没有其他的Kubernetes Kind 我可以用它来停止重试?

谢谢你!我有一个在GKE上运行的Kubernetes Cronjob,运行Cucumber JVM测试。

kubernetes google-kubernetes-engine cucumber-jvm kubernetes-pod kubernetes-cronjob
1个回答
1
投票

为了让事情尽可能的简单,我使用了以下方法进行测试 这个 Kubernetes官方文档中的例子,对其进行了一些小的修改,以说明在不同场景下的真实情况。

我可以确认,当 backoffLimit 设置为 0restartPolicyNever 万事如意,不重试. 请注意,您的每一次运行 Job 在您的例子中,它被安排运行 每隔60秒 (schedule: "*/1 * * * *") 不考虑重试.

让我们仔细看一下下面的例子(基数 yaml 可航 此处):

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      backoffLimit: 0
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - non-existing-command
          restartPolicy: Never

它会产生新的cron作业 every 60 seconds 根据 schedule无论它是失败还是成功运行。在这个特殊的例子中,它被配置为失败,因为我们正试图运行 non-existing-command.

你可以通过运行检查发生了什么。

$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
hello-1587558720-pgqq9   0/1     Error               0          61s
hello-1587558780-gpzxl   0/1     ContainerCreating   0          1s

你可以看到有 无重试. 虽然第一个 Pod 失败,根据我们的规范,新的会在60秒后准时产生。我想再次强调一下。这不是重试。

另一方面,当我们修改了上面的例子,并设置了 backoffLimit: 3,我们可以观察到 重试. 如你所见,现在新的 Pods 创立 多于60秒. 这都是重试。

$ kubectl get pods
NAME                     READY   STATUS   RESTARTS   AGE
hello-1587565260-7db6j   0/1     Error    0          106s
hello-1587565260-tcqhv   0/1     Error    0          104s
hello-1587565260-vnbcl   0/1     Error    0          94s
hello-1587565320-7nc6z   0/1     Error    0          44s
hello-1587565320-l4p8r   0/1     Error    0          14s
hello-1587565320-mjnb6   0/1     Error    0          46s
hello-1587565320-wqbm2   0/1     Error    0          34s

上面我们可以看到的是 3次重试 (Pod 创作尝试),与 hello-1587565260 工作4次重试 (包括原有的 第一次尝试 不计入 backoffLimit: 3)与 hello-1587565320 工作.

正如你所看到的 工作 自己还是按照时间表运行。每隔60秒:

kubectl get jobs
NAME               COMPLETIONS   DURATION   AGE
hello-1587565260   0/1           2m12s      2m12s
hello-1587565320   0/1           72s        72s
hello-1587565380   0/1           11s        11s

然而,由于我们 backoffLimit 定在这个时候 3,每次 Pod 负责运行的工作失败。发生3次额外的重试.

我希望这能帮助消除任何可能的困惑,关于运行的 cronJobskubernetes.

如果你对只运行一次的东西比较感兴趣,而不是定期运行,可以看看简单的 工作内容 而不是 CronJob.

也可以考虑改变你的 Cron 配置,如果你仍然想定期运行这个特定的作业,但比方说24小时运行一次,而不是每分钟运行一次。

© www.soinside.com 2019 - 2024. All rights reserved.