K8S之Job和CronJob控制器
使用Job和CronJob资源,用于管理Pod对象运行一次性或者周期性定时任务
Job
概念
Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod专门用来做备份任务,备份结束pod就可以终止了,不需要重启,将Pod对象置于"Completed"(完成)状态。
若容器中的进程因错误而终止,则需要按照重启策略配置确定是否重启,对于Job这个类型的控制器来说,需不需要重建pod就看任务是否完成,完成就不需要重建,没有完成就需要重建pod。
Job控制器的Pod对象的状态转换如下图所示:
适用场景
- 单个任务:只启一个pod,pod成功,job正常结束;
- 并行任务同时指定成功个数:可通过字段 .spec.completions 指定成功个数,.spec.parallelism(指定并行运行的任务数)。当成功个数达到 指定的 .spec.completions 个,任务结束;
适用场景
Job 常用于并行地处理一组独立但相关的 work item。如发送邮件,渲染帧,转码文件和扫描NoSql数据库中的key。
相关配置字段:
- .spec.completions:完成该Job需要执行成功的Pod数,默认为1;
- .spec.parallelism:能够同时运行的Pod数,默认为1,如果设置为0,则job会暂定;
- .spec.backoffLimit:允许执行失败的Pod数,默认值是6。(ps. 0表示不允许Pod执行失败。如果Pod是restartPolicy为Nerver,则失败后会创建新的Pod,如果是OnFailed,则会重启Pod。)不管是哪种情况,只要Pod失败一次就计算一次,而不是等整个Pod失败后再计算一个。当失败的次数达到该限制时,整个Job随即结束,所有正在运行中的Pod都会被删除;
- .spec.activeDeadlineSeconds: Job的超时时间,一旦一个Job运行的时间超出该限制,则Job失败,所有运行中的Pod会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时;
- .spec.ttlSecondsAfterFinished:通过指定该参数可以实现自动删除job,以及级联的pod资源。如果设置为0,job会被立即删除。如果不指定,job则不会被自动删除。(默认情况下,job异常或者成功结束后,包括job启动的pod,都不会被清理掉,可以依据保存的job和pod,查看状态、日志,以及调试等。用户可手动删除 job 会级联删除对应的pod)。
使用案例
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
概念
CronJob跟Job完成的工作是一样的,只不过CronJob添加了定时任务能力。可以指定时间,实现周期性运行。Job,CronJob 与 Deployment,DaemonSet 显著区别在于不需要持续在后台运行。
Deployment主要用于管理无状态的应用(kubernetes集群有一些 pod,某一个pod出现故障,删除之后会重新启动一个pod,那么kubernetes这个集群中pod数量就正常了,更多关注的是群体,这就是无状态应用)。
适用场景
- 在给定的时间点调度Job运行。
- 创建周期性运行的Job,例如数据库备份、发送邮件
使用案例
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
更多推荐
所有评论(0)