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完成。 | 
本文示例使用的镜像为公网镜像,拉取时集群或节点需具备公网访问能力:
- 为集群开启访问公网的能力(推荐):为集群所在的VPC创建公网NAT网关,集群中的所有资源均可访问公网。 
- 为节点分配固定公网IP:拥有公网IP的节点可拉取公网镜像,但需要为部署工作负载的每个节点都分配公网IP。 
创建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异常问题排查。