- Job:
-
容器按照持续运行的时间可分为两类,服务类容器,和工作类容器
-
服务类容器通常持续提供服务,需要一直运行,比如HTTP,Server,Daemon等,
-
工作类容器则是一次性任务,比如批处理程序,完成后容器就退出
-
kubernetes的Deployment,ReplicaSet和DaemonSet都用于管理服务类容器,对于工作类容器,使用Job
-
myjob.yam配置解析
- batch/v1是当前Job的apiVersion
- 指明当前资源的类型为Job
- restartPolicy指定什么情况下需要重启容器,对于Job,只能设置为Never或者OnFailure,对于其他controller,比如Deployment,可以设置为Always
- 通过kubectl apply -f myjob.yml启动Job
-
通过kubectl get job 查看Job的状态
-
desired和successful都为1,表示按照预期启动了一个pod,并且已经成功执行,通过kubectl get pod 查看pod的状态
-
因为pod执行完毕后容器已经退出,需要用–show-all才能看到Completed状态的Pod
-
通过kubectl logs可以查看Pod的标准输出
-
-
Pod失败的情况
-
修改myjob.yml,故意引入一个错误
-
先删除之前的job
-
运行新的job并查看状态
-
当前successful的Pod数量为0,查看Pod的状态
-
可以看到有多个Pod,状态均为不正常,通过kubectl describe pod查看某个pod的启动日志
-
日志显示没有可执行程序
-
为什么kubectl get pod会看到多个失败的pod?
- 当第一个pod启动时,容器失败退出,根据restartPolicy:Never,此容器失败不会被重启,但Job desired的pod是1,目前successful为0,不满足,所以job controller会启动新的Pod,直到successful为1,对于这上面的例子而言,successful永远也到不了1,所以Job controller会一直创建新的Pod,为了终止这个行为,只能删除Job
-
将restartPolicy设置为OnFailure,修改myjob。yml后重新启动
- Job的successful的pod的数量还是0,再看Pod的状态
- 这里只有一个Pod,不过restarts为3,而且不断增加,说明OnFailure生效,容器失败后会自动重启
-
Job的并行性
-
如果希望能同时运行多个Pod,提高Pod的执行效率,可以通过parallelism设置
-
将并行的Pod数量设置为2,可以看到job一共启动了两个Pod,而且age相同
-
通过completions设置Job成功完成Pod的总数
-
上面配置的含义是:每次运行两个Pod,直到总共有6个Pod成功完成
-
desired和successful均为6,符合预期,如果不指定completions和parallelism,默认值都为1
-
对于批处理程序,每个副本Pod都会从任务池中读取任务并执行,副本越多,执行时间就越短,效率就越高,这种场景可以使用Job来实现
-
-
定时Job
-
linux中有cron程序定时执行任务,kubernetes的CronJob提供了类似的功能,可以定时执行Job,
-
配置解读
-
batch/v2alpha1是当前CronJob的apiVersion
-
指明当前资源的类型为CronJob
-
schedule指定什么时候运行Job,其格式与Linux cron一致,这里的*/1 * * * *的含义是每一分钟启动一次
-
jobTemplate定义Job的模板,格式与前面的Job一致
-
通过kubectl apply创建CronJob,然后失败
-
是因为kubernetes默认没有enable CronJob功能,需要在kube-apiserver中加入这个功能,修改kube-apiserver的配置文件/etc/kubernetes/manifests/kubeapiserver.yaml
-
kube-apiserver本身也是一个pod,在启动参数中加上–runtime-config=batch/v2alpha1=true即可,然后重启kubelet服务:systemctl restart kubelet.service。kubelet会重启kube-apiserver Pod,通过kubectl api-versions确认kube-apiserver现在已经支持batch/v2alpha1
-
再次创建CronJob
-
通过kubectl get cronjob查看CronJob的状态
-
等待几分钟,查看job的状态
-
可以看到每隔一分钟就会启动一个Job,执行kubectl logs查看某个Job的运行日志
-
-
-
-