k8s:Job 和 Cronjob 的使用

Job 和 Cronjob 的使用

资源对象:Job,在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的 Kubernetes 集群中为我们提供了Job 和CronJob两种资源对象来应对我们的这种需求。Job 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod 成功结束。而CronJob则就是在Job 上加上了时间调度。

Job

Job官方文档
我们用 Job 这个资源对象来创建一个任务,定一个Job 来执行一个倒计时的任务。

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
    name: job-demo
    spec:
      restartPolicy: Never
      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"
[root@master ~]# kubectl  logs job-demo-vqgxx 
9
8
7
6
5
4
3
2
1
[root@master ~]# kubectl  get pods
job-demo-vqgxx                            0/1     Completed   0          4m7s

注意Job 的RestartPolicy 仅支持Never和OnFailure 两种,不支持Always ,我们知道Job 就相当于来执行一个批处理任务,执行完就结束了,如果支持 Always 的话是不是就陷入了死循环了?

CronJob

CronJob其实就是在Job 的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job ,格式和crontab也是一样的。

crontab的格式如下:
分 时 日 月 星期 要运行的命令
第1列分钟0~59
第2列小时0~23)
第3列日1~31
第4列月1~12
第5列星期0~7(0和7表示星期天)
第6列要运行的命令

apiVersion: batch/v1beta1
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"
[root@master ~]# kubectl logs cronjob-demo-1615193640-ddst8 
9
8
7
6
5
4
3
2
1
[root@master ~]# kubectl  get pods
NAME                                      READY   STATUS      RESTARTS   AGE
cronjob-demo-1615193640-ddst8             0/1     Completed   0          65s
cronjob-demo-1615193700-m7hkj             0/1     Completed   0          5s

[root@master ~]# kubectl  get cronjobs.batch cronjob-demo 
NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-demo   */1 * * * *   False     1        13s             4m49s

命令结果的显示:
SCHEDULE:是指其调度的时间点
SUSPEND:表示后续任务是否处于挂起状态,即暂停任务的调度和运行
ACTIVE:表示活动状态的Job对象的数量
LAST SCHEDULE:表示上次调度运行至此刻的时长

这里的 Kind是CronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate , 用来指定需要运行的任务,格式当然和Job 是一致的。还有一些值得关注的段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job ,默认没有限制,所有成功和失败的Job 都会被保留。然而,当运行一个Cron Job时,Job 可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job 完成后将不会被保留。

一旦 Job 被删除,由 Job 创建的 Pod 也会被删除。注意,所有由名称为“hello” 的 Cron Job 创建的 Job 会以前缀字符串 “hello-” 进行命名。如果想要删除当前 Namespace 中的所有 Job,可以通过命令 kubectl delete jobs --all 立刻删除它们。

你可能感兴趣的:(k8s,linux,docker,运维,容器,k8s)