一个Job会创建一个或多个Pod,并保证这些Pod成功终止。
一个简单的场景,创建一个Job以保证一个Pod可靠地执行完成。如果第一个Pod执行失败或者在未执行完成前被删除,Job将会启动一个新的Pod。
一个简单的案例
计算π的小数点后的2000位。该manifest以上传到了Github上,地址是:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi.yaml
1 | apiVersion: batch/v1 |
在该示例中,指定restartPolicy
的值为Never
。是否可以不指定呢?不可以,这个字段对Job来说是必须指定的,因为 Job 只支持Never
和OnFailure
,而restartPolicy
的默认值是Always
。
创建
执行命令:
1 | kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi.yaml |
过程:
任务类型
在介绍Job的任务类型之前,会先介绍两个相关的字段:
.spec.completions
:指定该Job所期待成功完成的Pod数量。只有成功运行完指定数量的Pod之后,Job才会变成完成状态。默认值为1。
.spec.parallelism
:指定Job在任何给定时间应运行的Pod的最大数目。默认值为1。
非并行Job
不需要指定上面的两个字段。
除非Pod发生故障,否则仅启动一个Pod。一旦该Pod成功终止,Job进入完成状态。
上面示例中的Job就是非并行Job。
固定完成计数的并行Job
必须为.spec.completions
指定一个非零的正值,比如N。只有1到N这个范围中的每个值都有一个成功的Pod时,Job才会进入完成状态。
.spec.parallelism
可以不指定。下面的示例中.spec.completions
为6,.spec.parallelism
为2. Github地址:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi-fixed.yaml
1 | apiVersion: batch/v1 |
该示例的执行过程如下:
每次最多有2个Pod在创建或者运行状态,只有这2个运行完成之后,后续的Pod才能创建。当有6个Pod成功终止后,Job完成。
具有工作队列的并行Job
不能指定.spec.completions
的值,同时需要为.spec.parallelism
指定一个非负整数N。Job会启动N个Pod, 当其中的一个Pod成功终止,其他的Pod也都终止时,Job进入完成状态。当一个Pod成功退出后,其他的Pod不应该继续为这个Job做任何工作或者任何输出,它们都应该进入退出的过程。
下面的示例中.spec.completions
没有指定,.spec.parallelism
为2. Github地址:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi-work.yaml
1 | apiVersion: batch/v1 |
该示例的执行过程如下:
清理
Job完成后,不会再创建其他Pod,但是Pod也不会被删除。因此可以查看已完成的容器的日志,检查是否有错误、警告或其他诊断输出。Job也会保留下来,但是通常情况下,系统是不需要这些已经完成了的Job。如果将它们保留在系统中会给API服务器带来压力。如何来清理这些Job?
如果Job是直接被CornJob管理,则可以通过指定CornJob的策略来进行清理。
手动删除。比如,上面的示例都可以通过
kubectl delete jobs pi
来清理。(该功能还处于alpha状态)使用TTL机制自动删除已完成或者失败了的Job。