我有一個不斷重啟的 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)?是什么讓作業在重啟和失敗中回圈?
uj5u.com熱心網友回復:
這是設計使然。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
uj5u.com熱心網友回復:
...Once everything is cleared up, it keeps restarting -> failing -> starting, etc. in a loop every second.
當您的第一個命令沒有回傳 pod 時,尾隨命令(例如 awk、xargs)會失敗并回傳非零退出代碼。這樣的退出代碼被控制器感知到作業失敗,因此啟動一個新的 pod 以重新運行作業。當沒有回傳 pod 時,您應該以零退出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/432969.html
