k8s 中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"

查看运行日志

#kubectl describe jobs job-demo
Name:           job-demo
Namespace:      default
Selector:       controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
Labels:         controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
                job-name=job-demo
Pods Statuses:  1 Running / 0 Succeeded / 2 Failed
Pod Template:
  Labels:  controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
           job-name=job-demo
  Containers:
   counter:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      bin/bash
      -c
      for i in 9 8 7 6 5 4 3 2 1; do echo $i; done
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From            Message
  ----    ------            ----  ----            -------
  Normal  SuccessfulCreate  60s   job-controller  Created pod: job-demo-d26wx
  Normal  SuccessfulCreate  42s   job-controller  Created pod: job-demo-tm896
  Normal  SuccessfulCreate  2s    job-controller  Created pod: job-demo-wpbcs

https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/   官网

注意JobRestartPolicy仅支持NeverOnFailure两种,不支持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列要运行的命令

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

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

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

查看cronjob

# kubectl get cronjob hello
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        51s             3m25s

# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
hello-1606739520-d67pb   0/1     Completed   0          87s
hello-1606739580-cpfbp   0/1     Completed   0          27s

# kubectl logs hello-1606739580-cpfbp
Mon Nov 30 12:33:25 UTC 2020
Hello from the Kubernetes cluster

https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/     使用 CronJob 运行自动化任务

当然,也可以用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

 

posted @ 2020-11-30 20:23  凡人半睁眼  阅读(1053)  评论(0编辑  收藏  举报