Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod专门用来做备份任务,备份结束pod就可以终止了,不需要重启,将Pod对象置于"Completed"(完成)状态。
若容器中的进程因错误而终止,则需要按照重启策略配置确定是否重启,对于Job这个类型的控制器来说,需不需要重建pod就看任务是否完成,完成就不需要重建,没有完成就需要重建pod。
Job控制器的Pod对象的状态转换如下图所示:

适用场景
Job 常用于并行地处理一组独立但相关的 work item。如发送邮件,渲染帧,转码文件和扫描NoSql数据库中的key。
相关配置字段:
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
completions: 6 # job结束需要成功运行的Pod个数,即状态为Completed的pod数
parallelism: 3 # 同时运行3个pod, 这个值不会超过completions的值
backoffLimit: 6 # 如果job失败,则重试几次
template:
spec:
restartPolicy: Never
containers:
- name: my-container-job
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c']
args: ['echo "this is my-job";sleep 60; echo "this is my-job too"']
更新资源清单文件
kubectl apply -f job.yaml
刚创建完资源,查看Job状态
kubectl get Job

刚创建完资源,查看Job控制器创建的pod的状态
kubectl get pods | grep my-job

1分钟后,看某个pod的日志
kubectl logs my-job-s9m5s

动态查看pod状态
kubectl get pods -w | grep my-job

继续观察Job控制器创建的pod
最终 状态都为完成

加上 “.spec.ttlSecondsAfterFinished” 字段后,任务完成后指定秒数后自动删除job和关联的pod
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
completions: 6
parallelism: 3
backoffLimit: 6
ttlSecondsAfterFinished: 3 # 加上它,等3秒后资源自动删除
template:
spec:
restartPolicy: Never
containers:
- name: my-container-job
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c']
args: ['echo "this is my-job";sleep 5; echo "this is my-job too"']
更新资源清单文件
kubectl apply -f job.yaml
时间到了自动删除pod和job


CronJob跟Job完成的工作是一样的,只不过CronJob添加了定时任务能力。可以指定时间,实现周期性运行。Job,CronJob 与 Deployment,DaemonSet 显著区别在于不需要持续在后台运行。
Deployment主要用于管理无状态的应用(kubernetes集群有一些 pod,某一个pod出现故障,删除之后会重新启动一个pod,那么kubernetes这个集群中pod数量就正常了,更多关注的是群体,这就是无状态应用)。
vim cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: my-cron-job
spec:
schedule: "*/1 * * * *" # 1分钟执行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: my-container-cron-job
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo my-container-cron-job
restartPolicy: OnFailure
更新资源清单文件
kubectl apply -f cronjob.yaml
查看刚才创建的cronJob
kubectl get cronjob

从命令的结果可以看出,CronJob还没有调度或运行任何Job。观察大概一分钟,等待CronJob创建
kubectl get jobs --watch
现在可以看到由 my-cron-job 这个cronjob调度的一个正在运行的job

kubectl get cronjob
可以看到 my-cron-job 这个CronJob成功地在 LAST SCHEDULE中指定的时间点调度了一个作业。当前有1个活动作业,这意味着该作业已经完成或失败

kubectl get jobs
每60秒建一个job

kubectl get pods | grep my-cron-job
每60秒执行一个pod

查看pod执行日志
kubectl logs my-cron-job-28540151-4vhlm
