貔貅云原生

貔貅云原生

Job与Cron Job

34
0
0
2023-12-05
Job与Cron Job

Job 控制器

# job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    spec:
      restartPolicy: Never  # 只支持 Never 和 OnFailure 两种
      containers:
      - name: counter
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

Job 就是 Pod 的一种形式,用于执行一些临时任务的存在,Job 与 Pod 的不同之处在于,它不需要一直启动,当任务结束时,Job 就该处于完结状态。

在实例中 RestartPolicy 只支持 Never 和 OnFailure 两种,不支持 Always。

设置成 Never 重启策略的时候,Job 任务执行失败后会不断创建新的 Pod,但是不会一直创建下去,会根据 spec.backoffLimit 参数进行限制,默认为6,通过该字段可以定义重建 Pod 的次数,另外需要注意的是 Job 控制器重新创建 Pod 的间隔是呈指数增加的,即下一次重新创建 Pod 的动作会分别发生在 10s、20s、40s… 后。

但是如果我们设置的 restartPolicy: OnFailure 重启策略,则当 Job 任务执行失败后不会创建新的 Pod 出来,只会不断重启 Pod。

[root@kube01 job]# kubectl apply -f job.yaml
job.batch/job-demo created

[root@kube01 job]# kubectl get pod
NAME                     READY   STATUS      RESTARTS        AGE
job-demo-ck895           0/1     Completed   0               43s

[root@kube01 job]# kubectl logs -f job-demo-ck895
9
8
7
6
5
4
3
2
1

CronJob 控制器

# cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: hello
            image: busybox
            args:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

CronJob 比 Job 多了一个定是任务选项,实例中 */1 * * * * 是每分钟执行一次。
crontab 的格式为:分 时 日 月 星期 要运行的命令,跟 linux 定时任务格式一致

需要注意的是定时任务每分钟执行一次,Pod 列表里数据不删除的情况下会越来越多,所以需要设置 .spec.successfulJobsHistoryLimit(默认为3) 与 .spec.failedJobsHistoryLimit(默认为1),如果设置限制的值为 0,那么相关类型的 Job 完成后将不会被保留。