如何确保kubernetes cronjob在出现故障时不会重新启动

如何确保kubernetes cronjob在出现故障时不会重新启动,kubernetes,Kubernetes,我有一份向客户发送电子邮件的工作。由于各种原因,它偶尔会失败。我不希望它重新启动,但它仍然可以 我在GKE上运行Kubernetes。为了让它停止,我必须删除CronJob,然后手动杀死它创建的所有pod 这很糟糕,原因显而易见 apiVersion: batch/v1beta1 kind: CronJob metadata: creationTimestamp: 2018-06-21T14:48:46Z name: dailytasks namespace: default r

我有一份向客户发送电子邮件的工作。由于各种原因,它偶尔会失败。我不希望它重新启动,但它仍然可以

我在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

kubernetes cronjob资源在其规范中有一个字段

默认情况下,您无法执行此操作,但如果要确保它不运行,可以更新发送电子邮件的脚本,并让它修补cronjob资源,以便在失败时添加
suspend:true

像这样的

kubectl patch cronjob <name> -p '{"spec": { "suspend": true }}'
kubectl补丁cronjob-p'{“spec”:{“suspend”:true}

事实证明,您必须将
退避限制:0
重新启动策略:从不
并发策略:禁止
结合使用

退避限制表示它在被视为失败之前将重试的次数。默认值为6

并发策略设置为
禁止
意味着它将运行0或1次,但不会更多

restartPolicy设置为
Never
意味着它不会在出现故障时重新启动

您需要完成这三项工作,否则cronjob可能会运行不止一次

spec:
  concurrencyPolicy: Forbid
  failedJobsHistoryLimit: 1
  jobTemplate:
    metadata:
      creationTimestamp: null
    spec:
      [ADD THIS -->]backoffLimit: 0
      template: 
      ... MORE STUFF ...

次要注释,
backoffLimit
是重试次数,而不是尝试次数:我有完全相同的用例,但这不适用于我:(你能想到为什么吗?你使用的是什么kube版本?我发布的相关问题:确保你在正确的位置添加了标签,否则它将不起作用。我最初犯了错误,更正后,它起了作用。谢谢