基于 batch-job.yaml 创建一个新的描述文件 multi-completion-parallel-batch-job.yaml ,并添加 spec.completions 和 spec.parallelism 属性,指定需要成功运行完成 5 个 pod ,最多 2 个 pod 并行运行 : P115
... spec: # 必须确保 5 个 pod 运行完成 completions: 5 # 最多 2 个 pod 可以并行运行 parallelism: 2 ...
kubectl create -f multi-completion-parallel-batch-job.yaml: 根据描述文件创建指定的 Job
kubectl get pods: 查看运行的 pod ,可以发现共有两个 pod 正在运行。只要一个 pod 运行完成, Job 将运行下一个 pod ,直至 5 个 pod 都成功完成
NAME READY STATUS RESTARTS AGE multi-completion-parallel-batch-job-fpwv5 1/1 Running 0 37s multi-completion-parallel-batch-job-m4cqw 1/1 Running 0 37s 限制 Job pod 完成任务的时间 P116Pod.spec.activeDeadlineSeconds: 可以指定一个 pod 最长存活时间,超时则终止 pod 并标记 Job 失败,可以用来限制 pod 完成任务的时间
Job.spec.backoffLimit: 可以配置一个 Job 在被标记为失败前最多尝试的次数,默认为 6 次
安排 Job 定期运行或在将来运行一次 P116 创建一个 CronJob P116为了每 15 分钟运行一次前面的任务,我们需要创建以下 cronjob.yaml 描述文件:
# 遵循 batch/v1beta1 版本的 Kubernetes API apiVersion: batch/v1beta1 # 资源类型为 CronJob kind: CronJob metadata: # Job 的名称 name: batch-job-every-fifteen-minutes spec: # Cron 表达式表明当前任务在每天每小时的 0, 15, 30, 45 分运行 schedule: "0,15,30,45 * * * *" # 指定最迟必须在预定时间后 15 秒内开始运行,否则就标记为一次失败的 `Job` startingDeadlineSeconds: 15 # 创建 Job 使用的模版(可以发现和 batch-job.yaml 的 spec 部分基本一致) jobTemplate: spec: # 启动 pod 使用的模版 template: metadata: # 指定标签为 app=periodic-batch-job labels: app: periodic-batch-job spec: # Job 不能使用 Always 为默认的重启策略 restartPolicy: OnFailure containers: # 容器的名称 - name: main # 创建容器所使用的镜像 image: idealism/batch-jobkubectl get cronjobs: 可以查看所有的 CronJob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE batch-job-every-fifteen-minutes 0,15,30,45 * * * * False 0 <none> 8sCronJob 总是为计划中配置的每个执行创建一个 Job ,但可能会有以下两种问题:
同时创建两个 Job :保证任务是幂等的
没有创建 Job :保证下一个任务能运行完成错过的任何工作
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/kubernetes-in-action