Kubernetes集群提供了JobCronJob两种资源对象

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

一、Job演示

这里使用job资源对象创建一个任务,用于倒计时:

[root@k8s-01 ~]# cat 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

[root@k8s-01 ~]# kubectl create -f job.yaml
job.batch/job-demo created

[root@k8s-01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-demo   1/1           14s        48s

#COMPLETIONS 任务状态
#DURATION 持续时间

查看一下Pod状态

[root@k8s-01 ~]# kubectl get pod
NAME                        READY   STATUS      RESTARTS   AGE
job-demo-h4vl4              0/1     Completed   0          73s

#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态

describe查看job的详细信息

[root@k8s-01 ~]# kubectl describe job job-demo 
Name:           job-demo
Namespace:      default
Selector:       controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
Labels:         controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
                job-name=job-demo
Annotations:    <none>
Parallelism:    1
Completions:    1
Start Time:     Wed, 13 May 2020 14:00:36 +0800
Completed At:   Wed, 13 May 2020 14:00:50 +0800
Duration:       14s
Pods Statuses:  0 Running / 1 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
           job-name=job-demo
  Containers:
   counter:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      bin/sh
      -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  3m31s  job-controller  Created pod: job-demo-h4vl4

还可以通过pod日志,查看pod运行状态:

[root@k8s-01 ~]# kubectl get pod
NAME                        READY   STATUS      RESTARTS   AGE
job-demo-h4vl4              0/1     Completed   0          4m41s

[root@k8s-01 ~]# kubectl logs job-demo-h4vl4 
9
8
7
6
5
4
3
2
1

只有job执行完毕后,STATUS的状态才为Complete,没有执行完毕的状态为Running。

注意:Job Pod类型中的RestartPolicy (pod重启策略)仅支持Never和OnFailure两种,不支持Always,Job就相当于来执行一批处理任务,执行完就结束,如果支持Always(一直重启,直到pod健康)就会陷入死循环

二、CronJob演示

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

接下来创建一个每隔2分钟打印数字的定时任务

[root@k8s-01 ~]# cat cronjob.yaml 
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/2 * * * *"     #这里需要添加一个时间调度的周期,和crontab调度是一样的,这也是主要和job任务的区别,同时这里也不需要添加执行的命令
  jobTemplate:            #cronjob实际上下面就是用的job配置,这里可以直接将上面job的配置复制过来即可
    spec:
      template:
        metadata:
          name: cronjob-demo      #pod名称
        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@k8s-01 ~]# kubectl create -f cronjob.yaml 
cronjob.batch/cronjob-demo created

创建完毕后可以通过下面的方式进行查看

[root@k8s-01 ~]# kubectl get cronjob
NAME           SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob-demo   */2 * * * *   False     1        19s             4m47s

[root@k8s-01 ~]# kubectl get pod
NAME                            READY   STATUS      RESTARTS   AGE
cronjob-demo-1589350440-2s6v5   0/1     Completed   0          4m19s
cronjob-demo-1589350560-5xfkg   0/1     Completed   0          2m18s
cronjob-demo-1589350680-lsbcd   0/1     Completed   0          18s

[root@k8s-01 ~]# kubectl get job
NAME                      COMPLETIONS   DURATION   AGE
cronjob-demo-1589350440   1/1           4s         4m26s
cronjob-demo-1589350560   1/1           12s        2m25s
cronjob-demo-1589350680   1/1           13s        25s

可以看到,每2分钟执行一次job,执行完毕job后状态会进行保留。通过get jobs和get pod都可以看到。

我们需要给cronjob设置一个历史记录限制,否则jobs会一直增加(1.14版本默认只保留3个)

在spec下面添加如下2条内容,自定义历史记录限制
successfulJobsHistoryLimit: 5   #成功保留次数
failedJobsHistoryLimit: 10      #失败保留次数

参考文章:
https://k.i4t.com/kubernetes_job.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐