首页 > 解决方案 > 如何确保 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

标签: kubernetes

解决方案


事实证明,您必须设置 a backoffLimit: 0in combination with restartPolicy: Neverin 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 ...

推荐阅读