job 控制器

在K8S集群中还有一种叫做job工作负载的对象,基于某一特定的任务运行,当运行任务的容器完成工作后,就会成功退出。

Cronjob的任务就是在job的基础上增加了时间调度,可以在给定的时间点运行一个任务,并且也可以定期的运行。

Job控制器可以执行三种类型的操作:

  1. 一次性任务:通常只会去启动一个pod(除非pod失败),一旦pod成功终止,job任务就完成了。
  2. 串行式任务:连续的、多次执行某一任务。当上一次任务执行完毕,接着执行下一个任务,直至所有的任务执行完毕,可以通过spec.completions属性指定执行次数。

(3)并发式任务:同一时间并发多次执行任务,可以通过spec.parallelism指定并发数量,也可以配合spec.completions属性来指定总任务的执行次数。

1.一次性任务执行

[root@master ~]# vi testjobv1.yaml

apiVersion: batch/v1          #表示API的使用版本,Job位于batch/v1中,v1表示K8S API的稳定版本

kind: Job                     #创建的资源对象类型

metadata:                     #资源对象的元数据

  name: testjobv1             #当前的资源对象名称

spec:

  ttlSecondsAfterFinished: 30      #执行job任务后,等待30s中将执行玩的pod删除

  template:                    #pod模板,需要创建一个pod,pod在启动之后,要执行一串命令

    spec:

      restartPolicy: Never    #容器的重启策略

      containers:

      - name: testjobcontainer

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['echo "start Job!"; sleep 30; echo "Job Done!"']

[root@master ~]# kubectl  apply -f testjobv1.yaml    //创建pod

job.batch/testjobv1 created

[root@master ~]# kubectl  get job      //获取任务列表

NAME        COMPLETIONS   DURATION   AGE

testjobv1   1/1           33s        53s

[root@master ~]# kubectl  get pod -o wide     //获取pod状态

NAME                              READY   STATUS      RESTARTS       AGE     IP            NODE      NOMINATED NODE   READINESS GATES

testjobv1--1-hf5bk                0/1     Completed   0              71s     10.244.1.66   worker2   <none>           <none>

[root@master ~]# kubectl  logs testjobv1--1-hf5bk

start Job!

Job Done!

注意:Job执行完毕后,不会被自动删除,保留pod的好处是方便后期查看日志,或者在出现问题的时候及时了解pod所处的状态。但是缺点在于,如果执行的次数越来越多,并且不删除,这种垃圾式的job会越来越多,人工删除会越来越麻烦,我们可以采取修改yaml文件增加参数信息的方式来将job执行完毕后,等待一段时间进行删除。增加参数:ttlSecondsAfterFinished

在k8s中这个功能默认是关闭的状态,需要我们手动的开启,修改的组件包括 apiserver、controller和scheduler。我们需要直接修改/etc/kubernetes/manifests/kube-apiserver.yaml,加入- --feature-gates=TTLAfterFinished=true参数即可。

2.串行式任务

[root@master ~]# vi testjobv2.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: testjobv2

spec:

  completions: 5

  template:

    spec:

      restartPolicy: Never

      containers:

      - name: testjobv2

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['echo "start Job!"; sleep 30; echo "Job Done!"']

[root@master ~]# kubectl  get pod -o wide    //从结果可知现在增加completions参数后任务已经执行了5次

testjobv2--1-8lrqv                0/1     Completed   0              96s     10.244.1.70   worker2   <none>           <none>

testjobv2--1-cm4px                0/1     Completed   0              2m40s   10.244.1.68   worker2   <none>           <none>

testjobv2--1-hcbdh                0/1     Completed   0              65s     10.244.1.71   worker2   <none>           <none>

testjobv2--1-lgtgd                0/1     Completed   0              34s     10.244.1.72   worker2   <none>           <none>

testjobv2--1-whsf7                0/1     Completed   0              2m7s    10.244.1.69   worker2   <none>           <none>

[root@master ~]# kubectl  get job

NAME        COMPLETIONS   DURATION   AGE

testjobv2   5/5           2m38s      3m39s

3.并行式任务

[root@master ~]# vi testjobv3.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: testjobv3

spec:

  completions: 10

  parallelism: 5

  template:

    spec:

      restartPolicy: Never

      containers:

      - name: testjobv3

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['echo "start Job!"; sleep 30; echo "Job Done!"']

[root@master ~]# kubectl  get pod -o wide  |grep testjobv3

testjobv3--1-4dcpb                0/1     Completed   0                2m24s   10.244.2.57   worker1   <none>           <none>

......

注意:一开始会同时创建5个pod同时运行,然后等待某一个pod运行结束之后,继续创建后续的pod,保持5个pod同时处于running的状态,直到达到设置的执行总数10次为止。

4.Job的异常处理

在job任务中,只能定义restartPolicy的值为Never或OnFailure其中一种。

(1)设置OnFailure时的状态

[root@master ~]# vi testjobv4.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: testjobv4

spec:

  backoffLimit: 6    #重启次数的上限,默认次数就是6次

  template:

    spec:

      restartPolicy: OnFailure

      containers:

      - name: testjobv4

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['This is erro command!!!']

[root@master ~]# kubectl  apply -f testjobv4.yaml

job.batch/testjobv4 created

[root@master ~]# kubectl  get pod -o wide  |grep testjobv4

testjobv4--1-xnh2g                0/1     CrashLoopBackOff   4 (67s ago)    2m44s   10.244.1.78   worker2   <none>           <none>

//执行完毕创建后,Pod的创建状态一直处于error或者是CrashLoopBackOff,在此期间Pod会不断的重启,RESTART的值一直在不断地增加,

Pod会以递增延迟的方式尝试重新启动(10s,20s,40s...)上限时间为6分钟,当延迟的时间增加到6分钟后,要再次等待6分钟才会重启,在我们的模板文件中设定了重启的次数上限,默认为6次,如果6次以内没有出现失败,则会重新计数,但是如果达到了重启次数的上限,则这个job对应的容器将会被终止删除。

[root@master ~]# kubectl  get pod -o wide  |grep testjobv4

*这个结果什么也没有了,pod到达重启上限后被删除*

(2)设置Never时的状态

[root@master ~]# vi testjobv5.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: testjobv5

spec:

  backoffLimit: 6    #重启次数的上限,默认次数就是6次

  template:

    spec:

      restartPolicy: Never

      containers:

      - name: testjobv5

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['This is erro command!!!']

[root@master ~]# kubectl  apply -f testjobv5.yaml

job.batch/testjobv5 created

[root@master ~]# kubectl  get pod

testjobv5--1-5m7pj                0/1     Error       0              2s

testjobv5--1-dcwnp                0/1     Error       0              52s

testjobv5--1-kf2hn                0/1     Error       0              42s

testjobv5--1-t22f7                0/1     Error       0              53s

//从以上结果可知,pod不会重新启动,因为设置了never并且job任务并没有执行成功,所以job会不停的新建pod,直到pod执行成功。

在这个过程中和onfailure相同的是,Never也会增加启动延迟的时间,同样也是由backoffLimit来控制重启的上限次数,在经过6次重启之后(等于7次启动),pod还是失败的状态那么此时就不会在启新的pod了。

(3)不明显异常处理

除了可以发现的异常现象之外,job在执行的过程中,还一种难以发觉的异常情况,比如任务陷入了死循环卡死不动,看起来是正常状态但是执行任务没有任何结果。

对于这类异常情况job也提供了spec.activeDeadlineSeconds属性,指定任务的上限时间(以秒为单位),如果超过上限时间,任务将被强制终止并删除。

[root@master ~]# vi testjobv6.yaml

apiVersion: batch/v1

kind: Job

metadata:

  name: testjobv6

spec:

  activeDeadlineSeconds: 10

  template:

    spec:

      restartPolicy: Never

      containers:

      - name: testjobv6

        image: busybox

        imagePullPolicy: IfNotPresent

        command: ['sh','-c']

        args: ['echo "Hello weizhihua"; sleep 3600']

[root@master ~]# kubectl  apply -f testjobv6.yaml

job.batch/testjobv6 created

[root@master ~]# kubectl  get pod

NAME                              READY   STATUS      RESTARTS       AGE

testjobv6--1-frrm7                1/1     Terminating   0              23s

//我们因为由运行时间限制10秒钟,所以在最开始的十秒钟内,Pod是处于运行的状态,10秒钟后Pod就被终止掉了,直到后面被删除(不管重启策略设置的值是OnFailure还是Never)

[root@master ~]# kubectl  get pod |grep testjov6

*此处以为空*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值