创建定时任务工作负载CronJob

更新时间:2025-04-21 03:56:13

CronJob是一种特殊的工作负载,它并不直接管理任何Pod,而是按照指定的策略定时重复创建多个独立的Job实例并监测它们的状态。它适用于周期性以及重复性的操作,例如执行备份操作或者发送邮件。通过本文,您可了解控制台或kubectl创建CronJob的方式。

创建CronJob

通过控制台创建
通过kubectl创建
  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. 高级配置向导页面中,您可配置CronJob的定时与Job配置。在本示例中,将定时规则设置为每2分钟执行一次,其余选项保持默认。然后,单击最下方的创建

    image.png

    配置卡片

    配置项

    说明

    定时任务

    定时规则

    您可以按小时、按天、按星期、按月,或者使用Cron表达式设置定时规则。

    关于更多Cron表达式说明,请参见Cron Expressions

    并发策略

    当前Job未完成时,是否可以创建新Job。

    • Forbid:跳过当次的新Job创建,适用于Job有明确运行顺序或互相依赖的场景。

    • Allow:允许并发运行,直接创建新Job,适用于Job之间不互相影响的场景。

    • Replace:终止当前Job并创建新Job,适用于需要最新执行结果的场景。

    任务记录

    CronJob保留的成功与失败的Job实例数量,以避免过多历史记录占用资源。

    • 保留成功的任务数:保留多少最新的成功Job实例。

    • 保留失败的任务数:保留多少最新的失败Job实例。

    任务设置

    成功运行的Pod

    jobTemplate.spec.completions,指定进入完成状态的Pod数量。

    并行运行的Pod

    jobTemplate.spec.parallelism,同时运行的Pod数量。

    超时时间

    jobTemplate.spec.activeDeadlineSeconds,单个Job的最大运行时间。Job运行时间超过此值后立即停止,不论是否完成。适用于有强制时效性要求或可能陷入无限循环的任务。默认值为600,单位秒(s)。

    重启次数

    jobTemplate.spec.backoffLimit:Pod失败后的最大重试次数,是所有Pod失败次数的总和。默认值为6

    重启策略

    jobTemplate.spec.template.spec.restartPolicy,Pod失败后的重启策略。

    • 不重启:Pod中的容器异常退出后,尝试原地重启Pod(不新建 Pod)。重启不计入spec.backoffLimit

    • 失败时:Pod失败后,创建新Pod进行替换。

    标签和注解

    Pod标签

    为该工作负载所属的每个Pod添加标签(Label)。集群中包括工作负载、Service在内的各种资源会通过标签与Pod进行匹配。ACKPod默认添加格式为app:(应用名称)的标签。

    Pod注解

    为该工作负载所属的每个Pod添加注解(Annotation)。ACK中的部分功能会使用到注解,您可在使用这些功能时再编辑。

  7. 创建完成后,您可在控制台中看到按2分钟为间隔创建的Job。

    image.png

重要

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

  1. 复制下方的YAML文件,并保存到cronjob.yaml中。CronJobjobTemplate.spec部分格式与Jobspec相同,下方使用了创建任务工作负载Job中的Job示例。

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: example-cronjob
      labels:
        app: cronjob
    spec:
      schedule: "*/2 * * * *" # 每2分钟运行一次
      concurrencyPolicy: Forbid # 禁止并发执行
      successfulJobsHistoryLimit: 3 # 保留最近3个成功完成的 Job
      failedJobsHistoryLimit: 2     # 保留最近2个失败的 Job
      jobTemplate:
        spec:
          completions: 1 # 两个Pod完成后停止Job
          parallelism: 1 # 同时只运行一个Pod
          template:
            spec:
              containers:
              - name: counter
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
                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. 执行以下命令创建CronJob。

    kubectl apply -f cronjob.yaml

    预期输出:

    cronjob.batch/example-cronjob created
  3. 等待约10分钟后,执行以下命令查看Job执行情况。

    kubectl get job

    预期输出:

    NAME                       STATUS     COMPLETIONS   DURATION   AGE
    example-cronjob-2901**22   Complete   2/2           31s        5m13s
    example-cronjob-2901**23   Complete   2/2           31s        3m13s
    example-cronjob-2901**24   Complete   2/2           26s        73s

相关文档

  • 本页导读 (1)
  • 创建CronJob
  • 相关文档