今天我们来给大家介绍另外一个资源对象job,我们在日常工作中,经常遇到一些需要进行批量数据处理和分析的需求,当然也会按照时间来进行调度的工作,我们的kubernetes集群中为我们体统了job和cronjob两种资源对象应对我们的需求

job负责处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束,而cornjob则就是在job上加时间调度


 

[root@master1 ~]# kubectl   describe  job  job-demo
Name:           job-demo
Namespace:      default
Selector:       controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
Labels:         controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
                job-name=job-demo
Annotations:    <none>
Parallelism:    1
Completions:    1
Start Time:     Wed, 11 May 2022 04:57:22 -0400
Completed At:   Wed, 11 May 2022 04:57:58 -0400
Duration:       36s
Pods Statuses:  0 Running / 1 Succeeded / 0 Failed
Pod Template:
  Labels:  controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
           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 ;sleep 2;done 
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From            Message
  ----    ------            ----   ----            -------
  Normal  SuccessfulCreate  2m20s  job-controller  Created pod: job-demo-g6k6k
  Normal  Completed         104s   job-controller  Job completed

可以看到job对象在创建后,它的pod模板,被自动加上了一个controller-uid,一个随机字符串,这样的label标签,而这个job对象本身,则自动被加上了label对应的selector,从而保证了job与它所管理的pod之前的匹配关系,而job控制器之所以要使用这种携带了UID的label,就是为了避免不同job对象管理的pod发生重合。

 

[root@master1 ~]# cat  job-demo.yaml 
apiVersion: batch/v1
kind: Job
metadata:
    name: job-demo
spec:
   template: 
     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 ;sleep 2;done "

我们可以看到很多pod变成了comleted状态,这是因为容器的任务执行完成正常退出了,如果任务执行失败了,如果定义了restartPolicy=OnFailure,那么任务在执行失败后job控制器就会不断的尝试创建新的pod,当然这个尝试肯定不能无线进行下去,我们可以通过job对象的spec.backofflimit字段来定义重试次数,另外需要注意的是job控制器重新创建pod的间隔是呈指数增加的

如果我们定义的restartPolicy=Never 那么任务执行失败后,job控制器就不会尝试创新pod,它会不断尝试重启pod里的容器

上面我们这里的job任务对应pod在运行结束后,会变成completed状态,但是如果执行任务的pod因为某种原因一直没有结束怎么办?同样的我们可以在job对象通过设置字段spec.activeDeadlineSenconds来限制任务运行的最长时间

spec:

   activeDeadlineSeconds:100 

那么当我们的任务pod运行超多了100s后,这job的所有pod都会被终止,并且pod的终止原因会变成deadlineExceeded

除此之外,我们还可以通过设置spec.parallellism参数来进程并行控制,改参数定了一个job在任意时间最多可以多个pod同时运行,spec.completions参数可以定义job至少要完成的pod数目

CronJob

CronJob其实就是在Job的基础上加上了时间角度,我们可以在给定的时间点运行一个任务,也可以周期性的给定时间点运行,这个实际上和我们linux中的crontab就非诚类似了

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

crontab的格式为“ 分 时  日 月 周  comand”

分钟0-59   小时0-23  日 1-31  月 1-14  周  0-7  0和7表示星期天

现在我们用cronjob来管理我们job任务,定义如下所示的资源清单 

 

 稍微等一会就可以发现多了几个job资源对象,这个就是上面我们设置的cronjob资源对象,每一分钟执行一个新的job

一旦不需要cronjob我们可以使用kubectl 删除

kubectl delete  cronjob  cronjob-demo 正在创建的job不会立刻被删除

Logo

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

更多推荐