Job和 CronJob 的使用


一、Job 和CronJob

我们在日常生活中经常会遇到一些需要进行批量数据处理和分析的需求,当然也会按时间来进行调度的工作,在我们 Kubernetes 集群中为我们提供 Job 和 CronJob 两种资源对象来应对我们的这种需求。

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

然后我们可以查看Jobs

$ kubectl get jobs

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

CronJob

CronJob 其实就是在 Job 的基础上加上了时间调度,我们可以:在给定的时间点运行。这个实际上和我们 Linux 中的 crontab 就非常的类似了。

一个 CronJob 对象其实就对应中 crontab 文件中的一行,它根据配置的时间格式周期性的运行一个 Job ,格式和 crontab 也是一样。

crontab 的格式如下:
在这里插入图片描述
现在,我们用 CronJob 来管理我们上面的 Job 任务,

apiVersion: batch/v2alpha1
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"

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

接下来创建这个 CronJob

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

当然,我们也可以用 kubectl run 来创建一个 CronJob

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello     */1 * * * *   False     0         <none>
$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1202039034   1         1            49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
$ kubectl delete cronjob hello
cronjob "hello" deleted

一旦不再需要CronJob ,简单的可以使用 kubectl 删除:

$ kubectl delete cronjob hello
cronjob "hello" deleted

这将会终止正在创建的 Job ,然而,运行中的 Job 将不会被终止,不会删除 Job 或它们的 Pod ,为了清理那些 Job 和 Pod ,需要列出该 CronJob 创建的全部 Job ,然后删除他们。

$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1201907962   1         1            11m
hello-1202039034   1         1            8m
...

$ kubectl delete jobs hello-1201907962 hello-1202039034 ...
job "hello-1201907962" deleted
job "hello-1202039034" deleted
...

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值