[英]How to ensure kubernetes cronjob does not restart on failure
我有一個向客戶發送電子郵件的cronjob。 它偶爾因各種原因而失敗。 我不希望它重新啟動,但它仍然可以。
我在GKE上運行Kubernetes。 為了讓它停止,我必須刪除CronJob,然后殺死它手動創建的所有pod。
由於顯而易見的原因,這很糟糕。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
creationTimestamp: 2018-06-21T14:48:46Z
name: dailytasks
namespace: default
resourceVersion: "20390223"
selfLink: [redacted]
uid: [redacted]
spec:
concurrencyPolicy: Forbid
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- kubernetes/daily_tasks.sh
env:
- name: DB_HOST
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
envFrom:
- secretRef:
name: my-secrets
image: [redacted]
imagePullPolicy: IfNotPresent
name: dailytasks
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Never
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
schedule: 0 14 * * *
successfulJobsHistoryLimit: 3
suspend: true
status:
active:
- apiVersion: batch
kind: Job
name: dailytasks-1533218400
namespace: default
resourceVersion: "20383182"
uid: [redacted]
lastScheduleTime: 2018-08-02T14:00:00Z
事實證明,你必須設置一個backoffLimit: 0
與restartPolicy: Never
結合使用restartPolicy: Never
與concurrencyPolicy: Forbid
結合使用concurrencyPolicy: Forbid
。
backoffLimit表示在被視為失敗之前它將重試的次數。 默認值為6。
concurrencyPolicy設置為Forbid
意味着它將運行0或1次,但不會更多。
restartPolicy設置為Never
表示失敗時不會重啟。
你需要做所有這3件事,或者你的cronjob可能會運行多次。
spec:
concurrencyPolicy: Forbid
failedJobsHistoryLimit: 1
jobTemplate:
metadata:
creationTimestamp: null
spec:
[ADD THIS -->]backoffLimit: 0
template:
... MORE STUFF ...
kubernetes cronjob資源有一個字段, suspend
其規格。
默認情況下不能這樣做,但是如果你想確保它不運行,你可以更新發送電子郵件的腳本並讓它修補cronjob資源以添加suspend: true
如果失敗則返回suspend: true
像這樣的東西
kubectl patch cronjob <name> -p '{"spec": { "suspend": true }}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.