实验环境:

在这里插入图片描述
按照图示部署好了K8s集群,一个Master,两个worker nodes。

什么时候需要job或cronjob:

deployment能够保证pod的守护进程进程运行,如果有些时候并不希望守护进行一直运行(例如一次性测试),所以希望一种控制器控制pod完成一些一次性的作业,完成后不用重启。这种情况下就可以实验job或者cronjob来完成。

一、job

步骤1: 获取创建job的yaml文件模板

kubectl create job job1 --image=busybox --dry-run=client -o yaml > job1.yaml

[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - image: busybox
        name: job1
        resources: {}
      restartPolicy: Never
status: {}

步骤2: 修改job的yaml文件,执行设定一次性任务(显示时间)

[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - command:
        - sh
        - -c
        - data ; sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      restartPolicy: Never
status: {}

应用并查看job:

[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   0/1           10s        10s
[root@vms201 jobs]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           12s        20s

可以看到,在10s前,任务栏为0/1表示没有完成,10s后,任务栏为1/1,表示任务已经完成了。

可以查看pod进行检查:

[root@vms201 jobs]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-vz5c6   0/1     Completed   0          104s

可以看到,其状态为Completed,表示pod运行完了,并没有重启。

步骤3: 删除job

[root@vms201 jobs]# kubectl delete jobs.batch job1
job.batch "job1" deleted

步骤4: 设置job选项

修改job的yaml文件:

[root@vms201 jobs]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  backoffLimit: 2
  completions: 6
  parallelism: 2
  template:
    metadata:
      creationTimestamp: null
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - command:
        - sh
        - -c
        - data ; sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      restartPolicy: Never
status: {}

spec下选项解析:

  1. parallelism: N 一次性运行N个pod;
  2. completions: M job结束需要成功运行的Pod个数,即状态为Completed的pod数;
  3. backoffLimit: N 如果job失败,则重试几次。

这里parallelism的值指的是一次性运行几个pod,这个值不会超过completions的值。

job的restart策略:

  1. Nerver 只要任务没有完成,则是新创建pod运行,直到job完成会产生多个pod;
  2. OnFailure 只要pod没有完成,则会重启pod,直到job完成。

运行job:

[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get jobs.batch job1
NAME   COMPLETIONS   DURATION   AGE
job1   6/6           35s        50s
[root@vms201 jobs]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-86qj7   0/1     Completed   0          2m12s
job1-bsrxk   0/1     Completed   0          2m36s
job1-h946w   0/1     Completed   0          2m25s
job1-kfjdc   0/1     Completed   0          2m24s
job1-ql5mh   0/1     Completed   0          2m13s
job1-vncdl   0/1     Completed   0          2m36s

job一共需要以2个pod同时创建(AGE字段)的方式来部署6个pod来完成任务,现在已经完成了任务。

步骤5: 测试job运行错误时的处理情况

删除现有的job,并修改yaml文件的sleep为sleepx,由于容器内没有sleepx的命令,会执行出错。

[root@vms201 jobs]# kubectl delete -f job1.yaml
job.batch "job1" deleted

执行修改后的job,并查看情况:

[root@vms201 jobs]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@vms201 jobs]# kubectl get jobs.batch job1
NAME   COMPLETIONS   DURATION   AGE
job1   0/6           44s        44s
[root@vms201 jobs]# kubectl describe jobs.batch job1
Name:           job1
Namespace:      job
Selector:       controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
Labels:         controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
                job-name=job1
Annotations:    <none>
Parallelism:    2
Completions:    6
Start Time:     Thu, 08 Jul 2021 23:40:45 +0800
Pods Statuses:  0 Running / 0 Succeeded / 4 Failed
Pod Template:
  Labels:  controller-uid=9b911e32-2673-4411-b997-9e82732b7fc2
           job-name=job1
  Containers:
   job1:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      sh
      -c
      data ; sleepx 10
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type     Reason                Age   From            Message
  ----     ------                ----  ----            -------
  Normal   SuccessfulCreate      70s   job-controller  Created pod: job1-56z6z
  Normal   SuccessfulCreate      70s   job-controller  Created pod: job1-7d2k6
  Normal   SuccessfulCreate      69s   job-controller  Created pod: job1-s9cnf
  Normal   SuccessfulCreate      69s   job-controller  Created pod: job1-lc6mj
  Normal   SuccessfulDelete      68s   job-controller  Deleted pod: job1-lc6mj
  Warning  BackoffLimitExceeded  68s   job-controller  Job has reached the specified backoff limit

可以在describe信息中看到:Job has reached the specified backoff limit的提示,因为我们在yaml文件中设置了backoffLimit: 2,说明尝试2次任务失败,则放弃尝试。

注意:backoffLimit设置的值和describe统计的数量并匹配。

练习: 计算圆周率的后的200位

编辑pod的yaml文件:

[root@vms201 jobs]# cat job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: pi
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - command:
        - sh
        - -c
        - perl -Mbignum=bpi -wle 'print bpi(200)'
        image: perl
        imagePullPolicy: IfNotPresent
        name: pi
      restartPolicy: Never
status: {}

创建job,并查看:

[root@vms201 jobs]# kubectl create -f job2.yaml
job.batch/pi created
[root@vms201 jobs]# kubectl get pods
NAME       READY   STATUS      RESTARTS   AGE
pi-qrnt2   0/1     Completed   0          4s
[root@vms201 jobs]# kubectl get jobs.batch pi
NAME   COMPLETIONS   DURATION   AGE
pi     1/1           1s         3m56s

查看容器内部的输出信息,可以看到计算出了圆周率小数点后200位

[root@vms201 jobs]# kubectl logs pi-qrnt2 
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303820

二、cronjob(cg)

cronjob类似于Linux的crontab,可以定期调度pod完成一次性的工作。

步骤1: 获取cronjob的yaml文件并编辑

获取yaml文件模板:

kubectl create cronjob mycj --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- sh -c "date ; sleep 10" >cj1

其中 --schedule="*/1 * * * *"对应了分时天月周。*表示不在乎此内容,而*/1则表示每x,这里表示的是每一分钟调度一次。

编辑cj1文件:

[root@vms201 jobs]# cat cj1
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: mycj
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: mycj
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          terminationGracePeriodSeconds: 0
          containers:
          - command:
            - sh
            - -c
            - date ; sleep 10
            image: busybox
            imagePullPolicy: IfNotPresent
            name: mycj
            resources: {}
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'
status: {}

此cronjob的含义是每个一分钟执行一次job,job中的容器打印当前日期并sleep 10s。

步骤2: 运行cronjob并查看执行过程

[root@vms201 jobs]# kubectl apply -f cj1
cronjob.batch/mycj created
[root@vms201 jobs]# watch -n .5 'kubectl get pods'
Every 0.5s: kubectl get pods                                                                                                          Fri Jul  9 00:36:15 2021

NAME                  READY   STATUS      RESTARTS   AGE
mycj-27096034-9mjx5   0/1     Completed   0          2m15s
mycj-27096035-w9wpv   0/1     Completed   0          75s
mycj-27096036-bbcm4   0/1     Completed   0          15s

可以看到,现在已经执行了3次job,均已经完成。

步骤3: 限制每个pod的运行时间

删除原有的cronjob:

[root@vms201 jobs]# kubectl delete cj mycj
cronjob.batch "mycj" deleted

修改cronjob的yaml文件,在spec下加入activeDeadlineSeconds: 5即可,也就是现在每个pod的运行时间不能超过5s,完成后会被删除。

创建job并查看信息:可以看到pod执行完成任务后即被删除:

[root@vms201 jobs]# kubectl apply -f cj1
cronjob.batch/mycj created
[root@vms201 jobs]# watch -n .5 'kubectl get pods'
Every 0.5s: kubectl get pods                                          Fri Jul  9 00:46:28 2021

No resources found in job namespace.

参考资料:
《老段CKA课程》

Logo

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

更多推荐