理解Kubernetes中Job和CronJob是什么

Kubernetes Job和CronJob

首先介绍一下job和cronjob

在Kubernetes集群提供了Job和CronJob两种资源对象

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


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

apiVersion: batch/v1
kind: Job
metadata:
  name: job
spec:
  template:
    metadata:
      name: job
    spec:
      restartPolicy: Never
      containers:
      - name: job
        image: busybox
        command:
        - "bin/sh"
        - "-c"
        - "for i in 9 8 7 6 5 4 3 2 1;do echo $i;done"

[root@kubernetes-m mnt]# kubectl create -f job.yaml
job/job created

[root@kubernetes-m mnt]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job    1/1           27s        2m56s
#COMPLETIONS 任务状态
#DURATION 持续时间

可以在查看一下pod状态
[root@kubernetes-m mnt]# kubectl get pod
NAME        READY   STATUS      RESTARTS   AGE
job-6gng8   0/1     Completed   0          4m45s

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

还可以使用describe查看job的详细信息
[root@kubernetes-m mnt]# kubectl describe  job job 
---
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  5m17s  job-controller  Created pod: job-6gng8
  Normal  Completed         4m50s  job-controller  Job completed

还可以通过pod日志,查看pod运行状态
[root@kubernetes-m mnt]# kubectl logs job-6gng8 
9
8
7
6
5
4
3
2
1

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

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

CronJob演示

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

crontab的格式如下
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

* * * * *
分时日月周

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

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob
spec:
  schedule: "*/1 * * * *"     #这里需要添加一个时间调度的周期,和crontab调度是一样的,这也是主要和job任务的区别,同时这里也不需要添加执行的命令
  jobTemplate:            #cronjob实际上下面就是用的job配置,这里可以直接将上面job的配置复制过来即可
    spec:
      template:
        metadata:
          name: cronjob      #pod名称
        spec:
          restartPolicy: Never
          containers:
          - name: cronjob
            image: busybox
            command:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1 ;do echo $i;done"
            
[root@kubernetes-m mnt]# kubectl create -f cronjob.yaml 
cronjob.batch/cronjob created


创建完毕后可以通过下面的方式进行查看
[root@kubernetes-m mnt]# kubectl get cronjob
NAME      SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob   */1 * * * *   False     0        <none>          8s

[root@kubernetes-m mnt]# kubectl logs cronjob-1636508880-mvhrp 
9
8
7
6
5
4
3
2
1

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

[root@kubernetes-m mnt]# kubectl get pod -A
NAMESPACE     NAME                                   READY   STATUS      RESTARTS   AGE
default       cronjob-1636508880-mvhrp               0/1     Completed   0          2m54s
default       cronjob-1636508940-m7lhq               0/1     Completed   0          114s
default       cronjob-1636509000-k4hxl               0/1     Completed   0          54s
----

可以看到过了三分钟执行了三个pod
我们需要给cronjob设置一个历史记录限制,否则jobs会一直增加(1.14版本默认只保留3个)

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


[root@kubernetes-m mnt]# kubectl get pod --watch
NAME                       READY   STATUS              RESTARTS   AGE
cronjob-1636509180-nqf26   0/1     Completed           0          2m8s
cronjob-1636509240-4x7kl   0/1     Completed           0          68s
cronjob-1636509300-ptvrb   0/1     ContainerCreating   0          8s
cronjob-1636509300-ptvrb   0/1     Completed           0          14s
cronjob-1636509360-wktgh   0/1     Pending             0          0s
cronjob-1636509360-wktgh   0/1     Pending             0          0s
cronjob-1636509360-wktgh   0/1     ContainerCreating   0          0s


说明一点,我们直接删除get cronjobs就可以


posted @ 2021-12-17 10:39  Layzer  阅读(115)  评论(0)    收藏  举报