「Kubernetes Objects」- CronJob(学习笔记)

  CREATED BY JENKINSBOT

CronJob 类似于 Linux 中的 crontab,用于定义定时任务。每个 CronJob 对象相当于 crontab 中的一行配置。

定义 CronJob 对象

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

注意事项

关于 Kubernetes CronJob 调度(重要)

所有 CronJob 调度时间都是基于 kube-controller-manager 的时区。也就是说如果 kube-controller-manager 的时区设置不正确,将无法正确进行调度,尤其是对于在特定时间运行的任务(对于周期性任务没有影响,比如每分钟运行)。

在默认情况下,kube-controller-manager 使用 UTC 时间:

# kubectl exec -n kube-system kube-controller-manager-k8s-master1 -- date
Mon Sep  7 01:36:39 UTC 2020

因此定时任务 00 01 * * * 将在我们的早上 9:00 执行,对于我们来说这是错误的。

如果想要定时任务正确执行,需要设置 kube-controller-manager 的时区,需要修改 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件:

-- 在 volumes 中,添加如下内容

  - hostPath:
      path: /etc/localtime
    name: etc-localtime

-- 在 volumeMounts 中,添加如下内容:

    - mountPath: /etc/localtime
      name: etc-localtime
      readOnly: true

再次检查 kube-controller-manager 时间:

# kubectl exec -n kube-system kube-controller-manager-k8s-master1 -- date
Mon Sep  7 09:52:53 CST 2020

另外,其他几个 Static Pod(etcd kube-apisrever kube-scheduler)的时区也是 UTC 时间,可以考虑一起修改。

关于 CronJob 名称长度

CronJob 的名字不能超过 52 字符,因为 CronJob controller 创建 Job 时会追加 11 个字符,而 Job 名称最长为 63 字符。

关于 CronJob 使用限制

CronJob 高级的地方在于,可以通过某些项可以控制定时任务执行时的行为。

对于 concurrencyPolicy 属性,如果设置为 Forbid,当定时任务开始新的调度,如果之前的定时任务没有执行完,则此次将标记为 Missed

对于 startingDeadlineSeconds 属性,用于统计特定时间内 Missed 定时任务数量。如果在 startingDeadlineSeconds 指定的时间内,超过 100 个 Missed 任务,将不再创建新的作业,并产生如下错误信息:

Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.

如果不设置 startingDeadlineSeconds 属性,并将 concurrencyPolicy 设置为 Forbid,可以保证每个周期内执行一次。

相关文档

Running Automated Tasks with a CronJob | Kubernetes v1.18

参考文献

kubernetes/Concepts/CronJob
Kubernetes v1.8/CronJob