全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:创建任务工作负载Job

更新时间:Apr 21, 2025

Job是用于一次性任务的工作负载,因此也被称为“任务工作负载”,它保证处理任务的多个Pod运行到成功完成。本文介绍Job的特点,以及如何通过控制台或kubectl创建Job。

Job介绍

Deployment、StatefulSet与DaemonSet的目标都是保证一定数量的Pod持续运行,而Job的目标是让一定数量的Pod运行到完成状态。您可通过spec.completionsspec.parallelism指定Pod完成数量与并行数量。

适用场景

completions配置

parallelism配置

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

通过控制台创建

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 任务

  3. 任务页面,单击使用镜像创建

  4. 应用基本信息配置向导页面,设置应用的基本信息。然后单击下一步,进入容器配置向导页面。

  5. 基本配置区域的镜像名称中输入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选择保持默认勾选,则集群已拥有公网访问能力。如果未选择,请参见为集群开启访问公网的能力

    image.png

  6. 高级配置向导页面中,您可配置Job的completionsparallelism配置,将成功运行的Pod数设置为2,它们的功能请参见上方的Job介绍。然后,单击最下方的创建

    image.png

    配置卡片

    配置项

    说明

    任务设置

    成功运行的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中的部分功能会使用到注解,您可在使用这些功能时再编辑。

  7. 在创建Job后,您可在控制台的Job日志中看到两个Pod输出了相同的内容。

    image

通过kubectl创建

重要

创建工作负载前,请确保已通过kubectl连接到集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  1. 复制下方的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
  2. 执行以下命令创建Job。

    kubectl apply -f job.yaml

    预期输出:

    job.batch/example-job created
  3. 等待约15秒后,执行以下命令查询Job状态。

    kubectl get job example-job

    预期输出如下,说明一个Pod已完成,Job仍处于Running状态。

    NAME          STATUS    COMPLETIONS   DURATION   AGE
    example-job   Running   1/2           16s        16s
  4. Job创建后约40秒,执行以下命令查询Job状态。

    kubectl get job example-job

    预期输出如下,说明Job已完成。

    NAME          STATUS     COMPLETIONS   DURATION   AGE
    example-job   Complete   2/2           27s        37s
  5. 执行以下命令查看Job日志。

    kubectl logs -l job-name=example-job

    预期输出:

    starting...
    1
    2
    3
    4
    5
    finished
    starting...
    1
    2
    3
    4
    5
    finished

相关文档