不断重新创建 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
我有一个不断重启的 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