赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。