Kubernetes常用资源对象-Job/CronJob

文章目录

今天我们来给大家介绍另外⼀类资源对象:Job,我们在日常的工作中经常都会遇到⼀些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的⼯作,Kubernetes 集群中为我们提供了 Job 和 CronJob 两种资源对象来应对这种需求。

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

例如:每天晚上12点定时对数据库进行备份。

1、Job

话不多说我们还是通过示例的方式进行演示,我们用 Job 这个资源对象来创建⼀个倒计时任务,定义 YAML 文件如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    metadata:
      name: job-demo
    spec:
      restartPolicy: Never # 不重启Policy
      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"

我们可以通过kubectl apply -f job-demo.yaml 命令创建Job,创建完成之后我们可以通过kubectl get jobs或者kubectl get pods 命令查看该Job的状态,10秒钟后我们发现Job的状态已经变成Completed了,说明Job执行完成之后就退出了;当然我们也可以通过 kubectl logs job-demo-brvhk 命令查看到Job的执行日志。

img

注:如果是数据库备份Job、我们可以把数据库备份的脚本写在command里面就可以执行了。

Job 的 RestartPolicy 仅支持Never 和 OnFailure 两种,不支持 Always ,我们知道 Job 就相当于来执行⼀个批处理任务,执行完就结束了,如果支持 Always 的话就陷入死循环了。当然,restartPolicy的具体使用方法,我们也可以去k8s的官方文档里面查看详细用法,这里就不再多介绍了:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.17/#job-v1-batch

2、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/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  successfulJobsHistorylimit: 10 # 保留最新的10个成功Job
  failedJobsHistorylimit: 10 # 保留最新的10个失败Job
  schedule: "*/1 * * * *" # 时间调度周期1分钟
  jobTemplate:
    spec:
      template:
        metadata:
          name: cronjob-demo
        spec:
          restartPolicy: 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"

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

然后我们就可以通过 kubectl create -f cronjob-demo.yaml 命令来创建CronJob,当然,也可以使用 kubectl run 来创建⼀个 CronJob :

kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"

img

img

从下面这张图我们可以清楚的看到 CronJob 每个一分钟执行一次:

img

⼀旦我们不再需要 Cron Job,简单地可以使用 kubectl delete cronjob cronjob-demo 命令删除它,删除一个CronJob对象会连带删除其创建的所有Job和Pod。⼀旦 CronJob 被删除,由 CronJob 创建的 Pod 也会被删除。如果想要删除当前 Namespace 中的所有 Job,可以通过命令kubectl delete jobs –all 立刻删除它们:

img

推荐文章