前言容器分为在线业务两种——服务容器需要提供连续不间断的服务,容器需要一直运行离线业务——工作容器一般执行一次性任务,比如统计日志data等,操作完成后可以关闭容器更新历史batch/v1kind:Jobmetadata:name:job-testspec:template:metadata:name:job-testspec:containers:-name:test-jobimage:busyboxcommand:["echo","testjob!"]restartPolicy:Never参数restartPolicy只能由Never或onFailure启动[root@master01~]#kubectlapply-fjob.yamljob.batch/job-test创建运行状态[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-t2gbw0/1ContainerCreating012s[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-t2gbw0/1完成024s查看运行结果[root@master01~]#kubectllogsjob-test-t2gbwtestjob!作业执行失败如何处理?乱设置命令导致job无法成功启动command:["echo123","testjob!"]restartPolicy:Never当restartPolicy:Never时,可以看到k8s不断的打开新的pod但是不会一直打开。默认参数spec.backoffLimit:6willmakeblock[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-2zrt40/1ContainerCannotRun087sjob-test-5z8840/1ContainerCannotRun077sjob-test-cxgmm0/1ContainerCannotRun0107sjob-test-nt9gt0/1ContainerCannotRun057sjob-test-wxv7l0/1ContainerCreating017s当restartPolicy:OnFailure时,k8s不会开启新的pod,但会继续重启pods[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-bd6950/1CrashLoopBackOff43m15s如果作业没有报告错误,但它永远不会结束怎么办?参数spec.activeDeadlineSeconds:100将在100秒后关闭Job中的所有Pod。此时Pod关闭状态为reason:DeadlineExceededParallelJobcatjob.yamlapiVersion:batch/v1kind:Jobmetadata:name:job-testspec:parallelism:2......parallelism:2最多只允许两个Pod同时运行查看运行状态[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-6ttz90/1ContainerCreating08sjob-test-mknjc0/1ContainerCreating08s[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-6ttz90/1Completed068sjob-test-mknjc0/1Completed068s[root@master01~]#kubectlgetjobNAMECOMPLETIONSDURATIONAGEjob-test0/1of210s10s[root@master01~]#kubectlgetjobNAMECOMPLETIONSDURATIONAGEjob-test2/1of219s66s添加参数completionsapiVersion:batch/v1kind:Jobmetadata:name:job-testspec:parallelism:2completions:8参数completions:8表示至少有8个pod运行成功,如果没有8个成功,则按照restartPolicy策略进行处理,可以认为是一种检查机制查看运行状态[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-6xwpt0/1ContainerCreating08sjob-test-grk4q0/1ContainerCreating08s[root@master01~]#kubectlgetjobNAMECOMPLETIONSDURATIONAGEjob-test0/811s11s[root@master01~]#kubectlgetjobNAME完成持续时间AGEjob-test6/876s76s[root@master01~]#kubectlgetpodNAMEREADYSTATUSRESTARTSAGEjob-test-2jxqx0/1Completed028sjob-test-6xwpt0/1Completed090sjob-test-gndq70/1完成070sjob-test-grk4q0/1完成090sjob-test-n96k60/1完成070sjob-test-np4n70/1完成049sjob-test-scc9c0/1完成028sjob-test-zcnbp0/1已完成049s[root@master01~]#kubectlgetjobNAMECOMPLETIONSDURATIONAGEjob-test8/882s91sCronJobCronJob会定时c重新创建一个作业对象catcronjob.yamlapiVersion:batch/v1beta1kind:CronJobmetadata:name:hellospec:schedule:"*/1****"jobTemplate:spec:template:spec:containers:-name:helloimage:busyboxcommand:["echo","testcronjob!"]restartPolicy:OnFailure查看运行结果[root@master01~]#kubectlgetcronjobNAMESCHEDULESUSPENDACTIVELASTSCHEDULEAGEhello*/1****False067s3m45s[root@master01~]#kubectlgetjobsNAMECOMPLETIONSDURATIONAGEhello-15953194801/127s3m23shello-15953195401/119s2m23shello-15953196001/124s83shello-15953196600/122s22s[root@masterADYlget~]1595319480-2kl8h0/1完成03m21shello-1595319540-gwthv0/1Completed02m21shello-1595319600-545480/1Completed081shello-1595319660-8xqn60/1ContainerCreating020s可以看出上面提到的Job对象是定时运行的。结论Job/CronJob控制器可以进行离线业务处理,不需要长时间运行一个Pod。由此类控制器管理的Pod不向外界提供连续的在线服务。任务完成后,容器会关闭,可以用于一些定时的数据处理任务。联系我微信公众号:zuolinux_com
