如何避免 Kubernetes 作业在优雅终止后出现失败状态

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

让我们看一下以下 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 的配置或其他内容来防止出现这种情况?

kubernetes kubernetes-jobs
1个回答
0
投票

您无法在 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 删除 pod 时,Kubernetes 会认为它是一个失败的 pod,因为它不会重新启动。由于 backoffLimit 设置为 0,作业控制器将此解释为达到退避限制并将作业标记为失败。

您可以将 restartPolicy 设置为 OnFailure 并删除 backoffLimit 行,使其默认为 6 次尝试,以防止出现此错误,或者设置为正数,这样就不会失败。

https://bobcares.com/blog/kubernetes-deployment-backofflimit/

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