不断重新创建 K8s Job

K8s Job being constantly recreated

我有一个不断重启的 cronjob,尽管它的 RestartPolicy 设置为 Never:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cron-zombie-pod-killer
spec:
  schedule: "*/9 * * * *"
  successfulJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          name: cron-zombie-pod-killer
        spec:
          containers:
            - name: cron-zombie-pod-killer
              image: bitnami/kubectl
              command:
                - "/bin/sh"
              args:
                - "-c"
                - "kubectl get pods --all-namespaces --field-selector=status.phase=Failed | awk '{print  \" --namespace=\" }' | xargs kubectl delete pod > /dev/null"
          serviceAccountName: pod-read-and-delete
          restartPolicy: Never

我希望它每 9 分钟 运行,但事实并非如此。 发生的事情是,当有 pods 需要清理时(因此,当有 smth 需要为 pod 做时)它通常会 运行。一旦一切都清理干净,它就会不断地重新启动 -> 失败 -> 启动,等等,每秒循环一次。

我需要做些什么来告诉 k8s 工作已经成功,即使没有什么可做的(没有 pods 清理)?是什么导致作业在重启和失败时循环?

...Once everything is cleared up, it keeps restarting -> failing -> starting, etc. in a loop every second.

当您的第一个命令 returns 没有 pod 时,尾随命令(例如 awk、xargs)失败并且 returns non-zero 退出代码。这样的退出代码被控制器感知到作业失败,因此启动一个新的 pod 到 re-run 作业。当没有 pod 返回时,您应该以零退出。

这是设计使然。 restartPolicy 未应用于 CronJob,但应用于它创建的 Pod。

如果 restartPolicy 设置为 Never,如果之前失败,它将创建新的 pods。将其设置为 OnFailure 会导致 Pod 重新启动,并阻止新的 Pods.

这个 GitHub 问题中讨论了这个问题:Job being constanly recreated despite RestartPolicy: Never #20255


如果没有 Pods,您的 kubectl 命令会导致退出代码 123(任何调用以 non-zero 状态退出) 失败 状态。这会导致作业失败,并不断重启。

您可以通过强制 kubectl 命令以退出代码 0 退出来解决这个问题。在其末尾添加|| exit 0

kubectl get pods --all-namespaces --field-selector=status.phase=Failed | awk '{print  \" --namespace=\" }' | xargs kubectl delete pod > /dev/null || exit 0