Kubernetes任务调用Job与CronJob及源码分析

推荐阅读:膜拜!阿里内部都在强推的K8S(kubernetes)学习指南 , 不能再详细了
在使用job中 , 我会结合源码进行一定的讲解 , 我们也可以从源码中一窥究竟 , 一些细节k8s是如何处理的 , 从而感受k8s的魅力 。
Kubernetes任务调用Job与CronJob及源码分析文章插图
JobJob的基本使用Job主要是用来任务调用 , 可以一个或多个 Pod , 并确保指定数量的 Pod 可以成功执行到进程正常结束 。
创建一个Job:
apiVersion: batch/v1kind: Jobmetadata:name: pispec:template:spec:containers:- name: piimage: perlcommand: ["perl","-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4这个Job会创建一个容器 , 然后执行命令进行π的计算 ,
然后我们创建这个pod:
$ kubectl create -f job.yaml$ kubectl describe jobs/piName:piNamespace:defaultSelector:controller-uid=cf78ebe4-07f9-4234-b8f9-2fe92df352eaLabels:controller-uid=cf78ebe4-07f9-4234-b8f9-2fe92df352eajob-name=piAnnotations:Parallelism:1Completions:1...Pods Statuses:0 Running / 1 Succeeded / 0 FailedPod Template:Labels:controller-uid=cf78ebe4-07f9-4234-b8f9-2fe92df352eajob-name=piContainers:pi:Image:resouer/ubuntu-bc...Events:TypeReasonAgeFromMessage-------------------------NormalSuccessfulCreate29mjob-controllerCreated pod: pi-g9fs4NormalCompleted27mjob-controllerJob completed可以看到创建对象后 , Pod模板中 , 被自动加上了一个controller-uid=< 一个随机字符串 > 这样的 Label 。 而这个 Job 对象本身 , 则被自动加上了这个 Label 对应的 Selector , 从而 保证了 Job 与它所管理的 Pod 之间的匹配关系 。 这个uid避免了不同Job对象的Pod不会重合 。
$ kubectl get podNAMEREADYSTATUSRESTARTSAGEpi-g9fs40/1Completed033m$ kubectl describe pod pi-g9fs4...Events:TypeReasonAgeFromMessage-------------------------NormalScheduled35mdefault-schedulerSuccessfully assigned default/pi-g9fs4 to 192.168.13.130NormalPulling35mkubelet, 192.168.13.130Pulling image "resouer/ubuntu-bc"NormalPulled35mkubelet, 192.168.13.130Successfully pulled image "resouer/ubuntu-bc"NormalCreated35mkubelet, 192.168.13.130Created container piNormalStarted35mkubelet, 192.168.13.130Started container pi我们可以看到Pod在创建好运行完毕之后会进入到Completed状态 。 上面的yaml定义中restartPolicy=Never也保证了这个Pod只会运行一次 。
如果创建的Pod运行失败了 , 那么Job Controller会不断创建一个新的Pod:
$ kubectl get podsNAMEREADYSTATUSRESTARTSAGEpi-55h890/1ContainerCreating02spi-tqbcz0/1Error05s参数说明spec.backoffLimit
我们在上面的字段中定义了为4 , 表示重试次数为4 。
restartPolicy
在运行过程中 , 可能发生各种系统问题导致的Pod运行失败 , 如果设置restartPolicy为OnFailure , 那么在运行中发生的失败后Job Controller会重启Pod里面的容器 , 而不是创建新的Pod 。
还可以设置为Never , 表示容器运行失败之后不会重启 。
spec.activeDeadlineSeconds
表示最长运行 时间 , 单位是秒 。 如:
spec: backoffLimit: 5 activeDeadlineSeconds: 100这样设置之后会进入pastActiveDeadline进行校验job.Spec.ActiveDeadlineSeconds是不是为空 , 不是空的话 , 会比较Pod的运行时间duration是否大于job.Spec.ActiveDeadlineSeconds设置的值 , 如果大于 , 那么会标记Pod终止的原因是DeadlineExceeded 。