专栏名称: 狗厂
目录
相关文章推荐
美股投资网  ·  美国证监会裁员风暴来袭!750人离职,华尔街 ... ·  5 小时前  
ST价值  ·  陈庆桃专栏 | ... ·  23 小时前  
北美留学生观察  ·  马斯克将听取对华开战简报?特朗普紧急辟谣 ·  昨天  
姚尧  ·  3月19日股市前瞻 ·  4 天前  
51好读  ›  专栏  ›  狗厂

Job和CronJob 的使用方法

狗厂  · 掘金  ·  · 2018-06-11 10:41

正文

上节课我们学习了 Pod 自动伸缩的方法,我们使用到了 HPA 这个资源对象,我们在后面的课程中还会和大家接触到 HPA 的。今天我们来给大家介绍另外一类资源对象:Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的 Kubernetes 集群中为我们提供了 Job CronJob 两种资源对象来应对我们的这种需求。

  • Job 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束
  • CronJob 则就是在 Job 上加上了时间调度。

Job

我们用 Job 这个资源对象来创建一个任务,我们定一个 Job 来执行一个倒计时的任务,定义 YAML 文件:

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"

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

然后来创建该 Job ,保存为 job-demo.yaml

$ kubectl create -f job.yaml
job "job-demo" created

然后我们可以查看当前的 Job 资源对象:

$ kubectl get jobs
NAME       DESIRED   SUCCESSFUL   AGE
job-demo   1         1            1m

注意查看我们的 Pod 的状态,同样我们可以通过 kubectl logs 来查看当前任务的执行结果。

$ kubectl get pods
NAME                  READY     STATUS             RESTARTS   AGE
job-demo-p6zst        0/1       Completed          0          14h
$ kubectl logs job-demo-p6zst
9
8
7
6
5
4
3
2
1

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列要运行的命令

现在,我们用 CronJob 来管理我们上面的 Job 任务,

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  successfulJobsHistoryLimit: 10
  failedJobsHistoryLimit: 10
  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"

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







请到「今天看啥」查看全文