我有一个在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官方文档中的例子,对其进行了一些小的修改,以说明在不同场景下的真实情况。
我可以确认,当 backoffLimit
设置为 0
和 restartPolicy
到 Never
万事如意,不重试. 请注意,您的每一次运行 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次额外的重试.
我希望这能帮助消除任何可能的困惑,关于运行的 cronJobs
在 kubernetes.
如果你对只运行一次的东西比较感兴趣,而不是定期运行,可以看看简单的 工作内容 而不是 CronJob
.
也可以考虑改变你的 Cron 配置,如果你仍然想定期运行这个特定的作业,但比方说24小时运行一次,而不是每分钟运行一次。