1

我有一个不断重启的 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 $2 \" --namespace=\" $1}' | xargs kubectl delete pod > /dev/null"
          serviceAccountName: pod-read-and-delete
          restartPolicy: Never

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

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

4

2 回答 2

1

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

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

于 2022-02-22T15:20:06.573 回答
1

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

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

这在此 GitHub 问题中进行了讨论:尽管 RestartPolicy: Never #20255,但仍不断重新创建作业


如果没有处于失败状态的 Pod,您的kubectl命令将导致退出代码123(任何调用以非零状态退出)。这会导致作业失败,并不断重新启动。

您可以通过强制kubectl命令以退出代码0退出来解决此问题。添加|| exit 0到它的末尾:

kubectl get pods --all-namespaces --field-selector=status.phase=Failed | awk '{print $2 \" --namespace=\" $1}' | xargs kubectl delete pod > /dev/null || exit 0
于 2022-02-23T08:56:56.437 回答