Job是用于一次性任务的工作负载,因此也被称为“任务工作负载”,它保证处理任务的多个Pod运行到成功完成。本文介绍Job的特点,以及如何通过控制台或kubectl创建Job。
Job介绍
Deployment、StatefulSet与DaemonSet的目标都是保证一定数量的Pod持续运行,而Job的目标是让一定数量的Pod运行到完成状态。您可通过spec.completions
与spec.parallelism
指定Pod完成数量与并行数量。
适用场景 |
|
| Job行为 |
单次任务,例如数据库初始化。 | 1 | 1 | 同时只运行一个Pod直到完成。 |
多个Pod并行执行,但只需其中部分返回结果的场景。例如在同时多个可用区执行任务以提高可靠性,但只需其中一个返回结果。 | M(M<N) | N | 同时运行N个Pod,其中有M个完成后即停止。 |
计算资源受限,无法同时运行所有Pod的场景。 | N | M(M<N) | 同时运行M个Pod,直到N个Pod完成。 |
资源充足情况下的并行任务,例如并行的数据处理。 | N | N | 同时运行N个Pod,直到N个Pod完成。 |
创建Job
通过控制台创建
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在任务页面,单击使用镜像创建。
在应用基本信息配置向导页面,设置应用的基本信息。然后单击下一步,进入容器配置向导页面。
在基本配置区域的镜像名称中输入
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
,在生命周期区域的 中输入/bin/sh
,参数中输入["-c", "echo 'starting...'; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo $COUNTER; done; echo 'finished'; exit 0"]
,如下图所示。然后单击下一步,进入高级配置向导页面。重要拉取
registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
镜像前,您需要为集群开启公网访问能力。如果您在创建集群时,为专有网络配置SNAT选择保持默认勾选,则集群已拥有公网访问能力。如果未选择,请参见为集群开启访问公网的能力。在高级配置向导页面中,您可配置Job的
completions
与parallelism
配置,将成功运行的Pod数设置为2,它们的功能请参见上方的Job介绍。然后,单击最下方的创建。配置卡片
配置项
说明
任务设置
成功运行的Pod数
spec.completions
,指定进入完成状态的Pod数量。并行运行的Pod数
spec.parallelism
,同时运行的Pod数量。超时时间
spec.activeDeadlineSeconds
,Job的最大运行时间。Job运行时间超过此值后立即停止,不论是否完成。适用于有强制时效性要求或可能陷入无限循环的任务。默认值为600
,单位秒(s)。重启次数
spec.backoffLimit
:Pod失败后的最大重试次数,是该Job的所有Pod失败次数的总和。默认值为6
。重启策略
template.spec.restartPolicy
,Pod失败后的重启策略。不重启:Pod中的容器异常退出后,尝试原地重启Pod(不新建 Pod)。重启不计入
spec.backoffLimit
。失败时:Pod失败后,创建新Pod进行替换。
标签和注解
Pod标签
为该工作负载所属的每个Pod添加标签(Label)。集群中包括工作负载、Service在内的各种资源会通过标签与Pod进行匹配。ACK为Pod默认添加格式为
app:(应用名称)
的标签。Pod注解
为该工作负载所属的每个Pod添加注解(Annotation)。ACK中的部分功能会使用到注解,您可在使用这些功能时再编辑。
在创建Job后,您可在控制台的Job日志中看到两个Pod输出了相同的内容。
通过kubectl创建
创建工作负载前,请确保已通过kubectl连接到集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
复制下方的YAML文件,并保存到job.yaml中。
apiVersion: batch/v1 kind: Job metadata: name: example-job spec: completions: 2 # 两个Pod完成后停止Job parallelism: 1 # 同时只运行一个Pod template: spec: containers: - name: counter image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest command: - /bin/sh - -c - | echo "starting..."; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo "${COUNTER}"; done; echo "finished"; exit 0 restartPolicy: Never # 不重启Pod
执行以下命令创建Job。
kubectl apply -f job.yaml
预期输出:
job.batch/example-job created
等待约15秒后,执行以下命令查询Job状态。
kubectl get job example-job
预期输出如下,说明一个Pod已完成,Job仍处于
Running
状态。NAME STATUS COMPLETIONS DURATION AGE example-job Running 1/2 16s 16s
Job创建后约40秒,执行以下命令查询Job状态。
kubectl get job example-job
预期输出如下,说明Job已完成。
NAME STATUS COMPLETIONS DURATION AGE example-job Complete 2/2 27s 37s
执行以下命令查看Job日志。
kubectl logs -l job-name=example-job
预期输出:
starting... 1 2 3 4 5 finished starting... 1 2 3 4 5 finished
相关文档
CronJob会定时重复执行Job,适用于定时任务场景。更多信息请参见创建定时任务工作负载CronJob。
若创建工作负载时出现问题,请参见工作负载FAQ。
若Pod出现异常问题,请参见Pod异常问题排查。