Kubernetes CronJob

Posted by Vito on January 24, 2024

主要属性

CronJob.spec.schedule

1
2
3
4
5
6
7
8
9
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 月的某天 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系统上,7 也是星期日)
│ │ │ │ │                          或者是 sun,mon,tue,web,thu,fri,sat
│ │ │ │ │
│ │ │ │ │
* * * * *

CronJob.spec.concurrencyPolicy

  • Allow(默认):CronJob 允许并发任务执行。
  • Forbid: CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。
  • Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。

CronJob.spec.suspend

  • true,可以挂起针对 CronJob 执行的任务,不会影响 CronJob 已经开始的任务,后续发生的执行都会被挂起
  • false,默认值。

CronJob.spec.successfulJobsHistoryLimit

  • 保留多少已完成的任务

CronJob.spec.failedJobsHistoryLimit

  • 保留多少已失败的任务

CronJob.spec.timeZone

  • 特性状态: Kubernetes v1.27 [stable]
  • eg:spec.timeZone: "Asia/Shanghai"
  • 默认基于 kube-controller-manager 的时区
1
2
[root@k8s-master1 ~]# kubectl get pods -A | grep kube-controller-manager
kube-system      kube-controller-manager-k8s-master1.zhch.lan   1/1     Running     14 (2d8h ago)   12d

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@k8s-master1 test]# vim cj-test.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cj-test
spec:
  schedule: "*/2 * * * *" # 每两分钟执行一次
  concurrencyPolicy: Forbid # 不允许并发任务执行
  timeZone: "Asia/Shanghai"
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  suspend: false
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cj-test-c
            image: busybox:1.28
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@k8s-master1 test]# kubectl create -f cj-test.yaml 
cronjob.batch/cj-test created
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master1 test]# kubectl get cj
NAME      SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cj-test   */2 * * * *   False     0        105s            13m

[root@k8s-master1 test]# kubectl get po
NAME                     READY   STATUS      RESTARTS   AGE
cj-test-28391832-xm6ss   0/1     Completed   0          5m50s
cj-test-28391834-xxrmn   0/1     Completed   0          3m50s
cj-test-28391836-796qf   0/1     Completed   0          110s

[root@k8s-master1 test]# kubectl logs cj-test-28391834-xxrmn
Mon Dec 25 13:14:00 UTC 2023
Hello from the Kubernetes cluster