更新时间:2025-07-17 GMT+08:00
分享

创建定时任务(CronJob)

定时任务(CronJob)是Kubernetes中用于定期执行任务的一种工作负载,类似于Linux系统的crontab,使用Cron格式进行编写, 并周期性地在给定的调度时间执行Job。

CronJob适用于多种场景,帮助您自动化和管理任务,确保任务按时执行,减轻人工管理的负担。例如:

  • 定期备份:可以使用CronJob定期执行备份任务,例如数据库备份、文件系统备份等。
  • 数据同步:定期从主节点同步数据到从节点或云存储。
  • 日志清理:定期清理旧的日志文件,避免占用过多存储空间。
  • 定期报告:生成和发送定期报告,如系统状态报告、性能报告等。
  • 维护任务:执行定期的系统维护任务,如清理缓存、更新组件等。
  • 定期任务调度:在特定时间点或周期内执行特定任务,如定期重启服务、执行健康检查等。

前提条件

  • 在创建工作负载前,您需要存在一个可用集群。若没有可用集群 ,请参照购买Standard/Turbo集群中内容创建。
  • 工作负载需要运行在节点上,因此集群中需要包含可用节点。如果集群中无可用节点,请参见创建节点进行创建。

通过控制台创建

  1. 登录CCE控制台
  2. 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”
  3. 填写工作负载的基本信息

    参数

    说明

    负载类型

    选择定时任务CronJob。关于不同工作负载类型的介绍请参见工作负载概述

    负载名称

    填写工作负载的名称。请输入1到52个字符的字符串,可以包含小写英文字母、数字和中划线(-),并以小写英文字母开头,小写英文字母或数字结尾。

    命名空间

    选择工作负载的命名空间,默认为default。您可以单击后面的“创建命名空间”,命名空间的详细介绍请参见创建命名空间

    容器运行时

    CCE Standard集群默认使用普通运行时,CCE Turbo集群可以使用普通运行时或安全运行时。具体区别请参见安全运行时与普通运行时

  4. 填写工作负载的容器配置

    • 容器信息:Pod中可以配置多个容器,您可以单击右侧“添加容器”为Pod配置多个容器。

      单个Pod内如果配置了多个容器,请确保每个容器中使用的端口不冲突 ,否则工作负载将会部署失败。

      • 基本信息:配置容器的基本信息。

        参数

        说明

        容器名称

        为容器命名。

        更新策略

        镜像更新/拉取策略。可以勾选“总是拉取镜像”,表示每次都从镜像仓库拉取镜像;如不勾选则优使用节点已有的镜像,如果没有这个镜像再从镜像仓库拉取。

        镜像名称

        单击后方“选择镜像”,选择容器使用的镜像。

        • 容器镜像服务 共享版:提供简单易用、安全可靠的镜像管理功能。
          • 我的镜像:可选择您上传的私有镜像。关于上传镜像的操作详情请参见客户端上传镜像
          • 镜像中心:可选择SWR提供的公共镜像。关于镜像中心的说明请参见镜像中心
          • 共享镜像:可选择由其他账号共享的镜像。关于共享镜像的操作详情请参见共享私有镜像
        • 容器镜像服务 企业版:提供企业级的独享安全托管服务,支持镜像加签、镜像安全扫描,保障数据安全。
          • 所属实例:选择企业版仓库实例,您需要提前购买一个企业版仓库,详情请参见购买仓库
          • 域名:企业版仓库支持配置多个自定义域名,您可以选择采用默认域名或自定义域名。关于自定义域名的操作详情请参见域名管理

        如果需要使用第三方镜像,可直接输入镜像地址,但需同时保证使用的镜像访问凭证可访问镜像仓库,详情请参见使用第三方镜像

        如果使用SWR容器镜像服务企业版镜像,需同时保证使用的镜像访问凭证可访问SWR企业版镜像仓库,详情请参见使用SWR企业版镜像仓库镜像

        镜像版本

        选择需要部署的镜像版本。

        CPU配额

        • 申请:容器需要使用的最小CPU值,默认0.25Core。
        • 限制:允许容器使用的CPU最大值,防止占用过多资源。

        如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格

        内存配额

        • 申请:容器需要使用的内存最小值,默认512MiB。
        • 限制:允许容器使用的内存最大值。如果超过,容器会被终止。

        如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格

        GPU配额(可选)

        当集群中包含GPU节点时,才能设置GPU配额,且集群中需安装CCE AI套件(NVIDIA GPU)插件。

        • 不使用:表示不使用GPU。
        • GPU 整卡:单个容器独享GPU。
        • GPU 虚拟化:容器需要使用的GPU百分比,例如设置为10%,表示该容器需使用GPU资源的10%。

        关于如何在集群中使用GPU,请参见使用Kubernetes默认GPU调度

        NPU配额(可选)

        使用NPU芯片的数量,必须为整数,且必须安装CCE AI套件(Ascend NPU)插件后才能使用。

        关于如何在集群中使用NPU,请参见NPU整卡调度

        特权容器(可选)

        特权容器是指容器里面的程序具有一定的特权。

        若选中,容器将获得超级权限,例如可以操作宿主机上面的网络设备、修改内核参数等。

        初始化容器(可选)

        选择容器是否作为初始化(Init)容器。初始化(Init)容器不支持设置健康检查。

        Init容器是一种特殊容器,可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器,同时Pod中也可以有一个或多个先于应用容器启动的Init容器,当所有的Init 容器运行完成时,Pod中的应用容器才会启动并运行。详细说明请参见Init 容器

        容器启动项(可选)

        为容器添加启动项参数,详情请参见Pod参数。CCE当前支持以下容器启动项参数:

        • stdin:为容器开启标准输入,允许从外部源(如终端或其他输入流)接收输入。
        • tty:为容器分配一个虚拟终端,允许您像在本地终端中一样向容器发送命令。

          一般需要同时开启stdin,表示将终端(tty)绑定到容器的标准输入(stdin)上,可以支持类似于kubectl exec -i -t命令的交互式操作,但区别在于该参数在Pod启动时就已经配置完成。

      • 生命周期(可选):在容器的生命周期的特定阶段配置需要执行的操作,例如启动命令、启动后处理和停止前处理,详情请参见设置容器生命周期
      • 环境变量(可选):支持通过键值对的形式为容器运行环境设置变量,可用于把外部信息传递给Pod中运行的容器,可以在应用部署后灵活修改,详情请参见设置环境变量
    • 镜像访问凭证:用于访问镜像仓库的凭证,默认取值为default-secret,使用default-secret可访问SWR共享版镜像仓库的镜像。default-secret详细说明请参见default-secret
    • GPU显卡(可选):默认为不限制。当集群中存在GPU节点时,工作负载实例可以调度到指定GPU显卡类型的节点上。

  5. 填写定时规则

    参数

    说明

    并发策略

    支持如下三种模式。
    • Forbid:在前一个任务未完成时,不创建新任务。
    • Allow:定时任务不断新建Job,会抢占集群资源。
    • Replace:已到新任务创建时间点,但前一个任务还未完成,新的任务会取代前一个任务。

    定时规则

    指定新建定时任务在何时执行,YAML中的定时规则通过CRON表达式实现。

    • 以固定周期执行定时任务,支持的周期单位为分钟、小时、日、月。例如,每30分钟执行一次任务,对应的CRON表达式为“*/30 * * * *”,执行时间将从单位范围内的0值开始计算,如00:00:0000:30:0001:00:00...
    • 以固定时间(按月)执行定时任务。例如,在每个月1日的0时0分执行任务,对应的CRON表达式为“0 0 1 */1 *”,执行时间为****-01-01 00:00:00****-02-01 00:00:00...
    • 以固定时间(按周)执行定时任务。例如,在每周一的0时0分执行任务,对应的CRON表达式为“0 0 * * 1”,执行时间为****-**-01 周一 00:00:00****-**-08 周一 00:00:00...
    • 自定义CRON表达式:关于CRON表达式的用法,可参考CRON
    说明:
    • 以固定时间(按月)执行定时任务时,在某月的天数不存在的情况下,任务将不会在该月执行。例如设置天数为30,而2月份没有30号,任务将跳过该月份,在3月30号继续执行。
    • 由于CRON表达式的定义,这里的固定周期并非严格意义的周期。将从0开始按周期对其时间单位范围(例如单位为分钟时,则范围为0~59)进行划分,无法整除时最后一个周期会被重置。因此仅在周期能够平均划分其时间单位范围时,才能表示准确的周期。

      举个例子,周期单位为小时,因为“/2、/3、/4、/6、/8和/12”可将24小时整除,所以可以表示准确的周期;而使用其他周期时,在新的一天开始时,最后一个周期将会被重置。比如CRON式为“* */12 * * *”时为准确的周期,每天的执行时间为00:00:0012:00:00;而CRON式为“* */13 * * *”时,每天的执行时间为00:00:0013:00:00,在第二天0时,虽然没到13个小时的周期还是会被刷新。

    时区

    可以指定定时规则应用的时区。如果未指定,将默认为控制节点所在的时区。

    任务记录

    可以设置保留执行成功或执行失败的任务个数,设置为0表示不保留。

  6. (可选)填写工作负载中的高级配置

    参数

    说明

    标签与注解

    以键值对形式为工作负载Pod添加标签或注解,填写完成后需单击“确认添加”。关于标签与注解的作用及配置说明,请参见设置标签与注解

    网络配置

    • Pod入/出口带宽限速:支持为Pod设置入/出口带宽限速,详情请参见为Pod配置QoS
    • 是否开启指定容器网络配置:仅支持该功能的集群显示该选项,开启指定容器网络配置,工作负载使用指定的容器网络配置中的容器子网跟安全组来创建,详情请参见使用容器网络配置为命名空间/工作负载绑定子网及安全组
    • 指定容器网络配置名:只支持选择关联资源类型为工作负载类型的自定义容器网络配置。
    • IPv6共享带宽:仅支持该功能的集群显示该选项,开启后可为Pod的IPv6双栈网卡绑定共享带宽,详情请参见为IPv6双栈网卡的Pod配置共享带宽

  7. 单击右下角“创建工作负载”,查看工作负载状态为“已启动”。

使用kubectl创建CronJob

CronJob的配置参数如下所示:

  • .spec.schedule指定任务运行时间与周期,参数格式请参见Cron,例如“0 * * * * ”“@hourly”
  • .spec.jobTemplate指定需要运行的任务,格式与使用kubectl创建Job相同。
  • .spec.startingDeadlineSeconds指定任务开始的截止期限。
  • .spec.concurrencyPolicy指定任务的并发策略,支持Allow、Forbid和Replace三个选项。
    • Allow(默认):允许并发运行Job。
    • Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个。
    • Replace:取消当前正在运行的Job,用一个新的来替换。

下面是一个CronJob的示例,保存在cronjob.yaml文件中。

在v1.21及以上集群中,CronJob的apiVersion为batch/v1

在v1.21以下集群中,CronJob的apiVersion为batch/v1beta1

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"  # 表示每分钟执行一次任务
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
          imagePullSecrets:
            - name: default-secret

运行该任务,如下:

  1. 创建CronJob。

    kubectl create -f cronjob.yaml

    命令行终端显示如下信息:

    cronjob.batch/hello created

  2. 执行如下命令,查看执行情况。

    kubectl get cronjob

    回显如下:

    NAME    SCHEDULE      TIMEZONE   SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   <none>     False     0        59s             2m36s

  3. 查看定时启动的Job。

    kubectl get jobs

    回显如下:

    NAME               COMPLETIONS   DURATION   AGE
    hello-1597387980   1/1           27s        45s

  4. 查看Job启动的Pod。

    kubectl get pod

    回显如下:

    NAME                           READY     STATUS      RESTARTS   AGE
    hello-1597387980-tjv8f         0/1       Completed   0          114s

  5. 查看Pod日志,Pod日志中预期将打印“Hello from the Kubernetes cluster”。

    kubectl logs hello-1597387980-tjv8f

    回显如下:

    Fri Aug 14 06:56:31 UTC 2020
    Hello from the Kubernetes cluster

  6. 删除CronJob。删除CronJob时,对应的普通任务及相关的Pod都会被删除。

    kubectl delete cronjob hello

    回显如下:

    cronjob.batch "hello" deleted

相关操作

定时任务创建完成后,您还可执行表1中操作。

表1 其他操作

操作

操作说明

编辑YAML

单击定时任务名称后的“更多 > 编辑YAML”,可修改当前任务对应的YAML文件。

停止定时任务

  1. 选择待停止的任务,单击操作列的“停止”。
  2. 单击“是”。

删除定时任务

  1. 选择待删除的任务,单击操作列的“更多 > 删除”
  2. 单击“是”。

    任务删除后将无法恢复,请谨慎操作。

相关文档