kubernetes - 如何确保 kubernetes cronjob 在失败时不会重新启动
问题描述
我有一个向客户发送电子邮件的 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
解决方案
事实证明,您必须设置 a backoffLimit: 0
in combination with restartPolicy: Never
in combination with 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 ...
推荐阅读
- java - Android Studio 循环遍历绑定中的元素
- docker - 使用多个命令在 Cloud Build 上构建 Terraform
- r - 如何将字符日期转换为 R 中的日期格式?
- android - Android Sceneform 使用垂直平面检测墙壁
- reactjs - 如何使用功能组件在 AntDesign 中添加和删除选项卡?
- airflow - 气流:从另一个操作员调用一个操作员
- python - 使用 Agg 后端时无法添加轴
- java - 将字符串覆盖到模型类型
- node.js - 无法使用 nginx 为 linux 服务器打开 hygieia UI
- wordpress - 减轻移动/平板电脑上的 Wordpress 后台