让我们看一下以下 Kubernetes Cronjob
apiVersion: batch/v1
kind: CronJob
metadata:
name: sleep-cronjob
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
backoffLimit: 0 # Avoid two executions
template:
spec:
containers:
- name: sleep
image: busybox
command: ["sh", "-c", "sleep 120"] # 2 minutes
restartPolicy: Never
terminationGracePeriodSeconds: 300 # 5 minutes
它每 5 分钟运行一次作业,并且 Pod 休眠 2 分钟。
如果在睡眠期间我执行
kubectl delete pod <POD_NAME>
来正常终止,它将起作用,它将等待指定的 terminationGracePeriodSeconds
,在这种情况下,它将允许 pod 成功完成其工作。
但是,Kubernetes 作业将被标记为
1 Failed
,原因为 BackoffLimitExceeded
。
我已经尝试了作业配置activeDeadlineSeconds,但仍然收到错误。
我是否缺少 CronJob/Job 的配置或其他内容来防止出现这种情况?
您无法在 pod 上指定 activeDeadlineSeconds,因为它定义了作业允许的最大执行时间,而不是重试行为。正如您可以看到文档:
请注意,作业的 .spec.activeDeadlineSeconds 优先于 它的.spec.backoffLimit。因此,正在重试一个或多个的作业 失败的 Pod 一旦到达时间就不会部署额外的 Pod activeDeadlineSeconds 指定的限制,即使 backoffLimit 是 还没有达到。
https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup
backoffLimit: 0 和 restartPolicy: Never 会生成错误,当您使用 kubectl delete pod
您可以将 restartPolicy 设置为 OnFailure 并删除 backoffLimit 行,使其默认为 6 次尝试,以防止出现此错误,或者设置为正数,这样就不会失败。
https://bobcares.com/blog/kubernetes-deployment-backofflimit/