# 创建定时任务（CronJob）
[定时任务（CronJob）](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/)是Kubernetes中用于定期执行任务的一种工作负载，类似于Linux系统的crontab，使用[Cron](https://man7.org/linux/man-pages/man8/cron.8.html)格式进行编写， 并周期性地在给定的调度时间执行Job。
CronJob适用于多种场景，帮助您自动化和管理任务，确保任务按时执行，减轻人工管理的负担。例如：
- **定期备份**：可以使用CronJob定期执行备份任务，例如数据库备份、文件系统备份等。
- **数据同步**：定期从主节点同步数据到从节点或云存储。
- **日志清理**：定期清理旧的日志文件，避免占用过多存储空间。
- **定期报告**：生成和发送定期报告，如系统状态报告、性能报告等。
- **维护任务**：执行定期的系统维护任务，如清理缓存、更新组件等。
- **定期任务调度**：在特定时间点或周期内执行特定任务，如定期重启服务、执行健康检查等。
#### 前提条件
- 在创建工作负载前，您需要存在一个可用集群。若没有可用集群 ，请参照[购买Standard/Turbo集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0028.html)中内容创建。
- 工作负载需要运行在节点上，因此集群中需要包含可用节点。如果集群中无可用节点，请参见[创建节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0363.html)进行创建。
 
#### 创建定时任务
您可以通过控制台或kubectl命令行创建定时任务。
- [通过控制台创建]
  1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)。
  
  2. 单击集群名称进入集群，在左侧选择"工作负载"，在右上角单击"创建工作负载"。
  
  3. 填写工作负载的**基本信息** 。
     
     
     | 参数  | 说明                                                                                                                                                      |
     |:---|:---|
     | 负载类型  | 选择定时任务CronJob。关于不同工作负载类型的介绍请参见[工作负载概述](https://support.huaweicloud.com/usermanual-cce/cce_10_0006.html)。                                                  |
     | 负载名称  | 填写工作负载的名称。请输入1到52个字符的字符串，可以包含小写英文字母、数字和中划线（-），并以小写英文字母开头，小写英文字母或数字结尾。                                                                                      |
     | 命名空间   | 选择工作负载的命名空间，默认为default。您可以单击后面的"创建命名空间"，命名空间的详细介绍请参见[创建命名空间](https://support.huaweicloud.com/usermanual-cce/cce_10_0278.html)。                           |
     | 容器运行时 | 容器隧道网络CCE集群默认使用普通运行时，VPC网络CCE Standard集群和CCE Turbo集群可以使用普通运行时或安全运行时。具体区别请参见[安全运行时与普通运行时](https://support.huaweicloud.com/usermanual-cce/cce_10_0463.html)。 |
        
     
     
  
  4. 填写工作负载的**容器配置** 。
     
     - 容器信息：Pod中可以配置多个容器，您可以单击右侧"添加容器"为Pod配置多个容器。
       ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
       单个Pod内如果配置了多个容器，请确保每个容器中使用的端口不冲突 ，否则工作负载将会部署失败。
       - 基本信息：配置容器的基本信息。
         
         | 参数            | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
         |:---|:---|
         | 容器名称         | 为容器命名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
         | 更新策略       | 镜像更新/拉取策略。可以勾选"总是拉取镜像"，表示每次都从镜像仓库拉取镜像；如不勾选则优先使用节点已有的镜像，如果没有这个镜像再从镜像仓库拉取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
         | 镜像名称        | 单击后方"选择镜像"，选择容器使用的镜像。 - 容器镜像服务 共享版：提供简单易用、安全可靠的镜像管理功能。 - 我的镜像：可选择您上传的私有镜像。关于上传镜像的操作详情请参见[客户端上传镜像](https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html)。  - 镜像中心：可选择SWR提供的公共镜像。关于镜像中心的说明请参见[镜像中心](https://support.huaweicloud.com/usermanual-swr/swr_01_0022.html)。  - 共享镜像：可选择由其他账号共享的镜像。关于共享镜像的操作详情请参见[共享私有镜像](https://support.huaweicloud.com/usermanual-swr/swr_01_0026.html)。    - 容器镜像服务 企业版：提供企业级的独享安全托管服务，支持镜像加签、镜像安全扫描，保障数据安全。 - 所属实例：选择企业版仓库实例，您需要提前购买一个企业版仓库，详情请参见[购买仓库](https://support.huaweicloud.com/usermanual2-swr/swr_02_0408.html)。  - 域名：企业版仓库支持配置多个自定义域名，您可以选择采用默认域名或自定义域名。关于自定义域名的操作详情请参见[域名管理](https://support.huaweicloud.com/usermanual2-swr/swr_02_0500.html)。     如果需要使用第三方镜像，可直接输入镜像地址，但需同时保证使用的[镜像访问凭证](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html#cce_10_0047__li1487514116369)可访问镜像仓库，详情请参见[使用第三方镜像](https://support.huaweicloud.com/usermanual-cce/cce_10_0009.html)。 如果使用SWR容器镜像服务企业版镜像，需同时保证使用的[镜像访问凭证](https://support.huaweicloud.com/usermanual-cce/cce_10_0047.html#cce_10_0047__li1487514116369)可访问SWR企业版镜像仓库，详情请参见[使用SWR企业版镜像仓库镜像](https://support.huaweicloud.com/usermanual-cce/cce_10_0948.html)。 |
         | 镜像版本       | 选择需要部署的镜像版本。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
         | CPU配额     | - 申请：容器需要使用的最小CPU值，默认0.25Core。  - 限制：允许容器使用的CPU最大值，防止占用过多资源。   如不填写申请值和限制值，表示不限制配额。申请值和限制值的配置说明及建议请参见[设置容器规格](https://support.huaweicloud.com/usermanual-cce/cce_10_0163.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
         | 内存配额      | - 申请：容器需要使用的内存最小值，默认512MiB。  - 限制：允许容器使用的内存最大值。如果超过，容器会被终止。   如不填写申请值和限制值，表示不限制配额。申请值和限制值的配置说明及建议请参见[设置容器规格](https://support.huaweicloud.com/usermanual-cce/cce_10_0163.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
         | GPU配额（可选） | 当集群中包含GPU节点时，才能设置GPU配额，且集群中需安装[CCE AI套件（NVIDIA GPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0141.html)插件。 - 不使用：表示不使用GPU。  - GPU 整卡：单个容器独享GPU。  - GPU 虚拟化：容器需要使用的GPU百分比，例如设置为10%，表示该容器需使用GPU资源的10%。   关于如何在集群中使用GPU，请参见[使用Kubernetes默认GPU调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0345.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
         | NPU配额（可选）    | 当集群中包含NPU节点时，才能设置NPU配额，且集群中需安装[CCE AI套件（Ascend NPU）](https://support.huaweicloud.com/usermanual-cce/cce_10_0239.html)插件。 - 不使用：表示不使用NPU。  - NPU整卡调度：单个容器独享NPU芯片。  - NPU虚拟化：通过资源虚拟化的方式将物理机配置的NPU切分成若干份vNPU（虚拟NPU），再挂载到容器中使用。   关于如何在集群中使用NPU，请参见[NPU整卡调度](https://support.huaweicloud.com/usermanual-cce/cce_10_0346.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
         | 特权容器（可选）     | 特权容器是指容器里面的程序具有一定的特权。若选中，容器将获得超级权限，例如可以操作宿主机的网络设备、修改内核参数、以及访问节点上的所有设备等。 更多信息，请参见[Pod Security Standards](https://kubernetes.io/docs/concepts/security/pod-security-standards/)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
         | 初始化容器（可选）   | 选择容器是否作为初始化（Init）容器。初始化（Init）容器不支持设置健康检查。 Init容器是一种特殊容器，可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器，同时Pod中也可以有一个或多个先于应用容器启动的Init容器，当所有的Init 容器运行完成时，Pod中的应用容器才会启动并运行。详细说明请参见[Init 容器](https://kubernetes.io/zh/docs/concepts/workloads/pods/init-containers/)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
         | 容器启动项（可选）     | 为容器添加启动项参数，详情请参见[Pod参数](https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/pod-v1/)。CCE当前支持以下容器启动项参数： - stdin：为容器开启标准输入，允许从外部源（如终端或其他输入流）接收输入。  - tty：为容器分配一个虚拟终端，允许您像在本地终端中一样向容器发送命令。 一般需要同时开启stdin，表示将终端（tty）绑定到容器的标准输入（stdin）上，可以支持类似于**kubectl exec -i -t**命令的交互式操作，但区别在于该参数在Pod启动时就已经配置完成。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
            
         
       
       - 生命周期（可选）：在容器的生命周期的特定阶段配置需要执行的操作，例如启动命令、启动后处理和停止前处理，详情请参见[设置容器生命周期](https://support.huaweicloud.com/usermanual-cce/cce_10_0105.html)。
       
       - 环境变量（可选）：支持通过键值对的形式为容器运行环境设置变量，可用于把外部信息传递给Pod中运行的容器，可以在应用部署后灵活修改，详情请参见[设置环境变量](https://support.huaweicloud.com/usermanual-cce/cce_10_0113.html)。
        
     
     - 镜像访问凭证：用于访问镜像仓库的凭证，默认取值为default-secret，使用default-secret可访问SWR共享版镜像仓库的镜像。default-secret详细说明请参见[default-secret](https://support.huaweicloud.com/usermanual-cce/cce_10_0388.html#cce_10_0388__section11760122012591)。
     
     - GPU显卡（可选）：默认为不限制。当集群中存在GPU节点时，工作负载实例可以调度到指定GPU显卡类型的节点上。
     
     
     
     
  
  5. 填写**定时规则** 。
     
     
     | 参数  | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     |:---|:---|
     | 并发策略  | 支持如下三种模式。 - Forbid：在前一个任务未完成时，不创建新任务。  - Allow：定时任务不断新建Job，会抢占集群资源。  - Replace：已到新任务创建时间点，但前一个任务还未完成，新的任务会取代前一个任务。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
     | 定时规则  | 指定新建定时任务在何时执行，YAML中的定时规则通过CRON表达式实现。 - 以固定周期执行定时任务，支持的周期单位为分钟、小时、日、月。例如，每30分钟执行一次任务，对应的CRON表达式为"\*/30 \* \* \* \*"，执行时间将从单位范围内的0值开始计算，如**00:00:00** 、**00:30:00** 、**01: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](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/#cron-schedule-syntax)。   说明： - 以固定时间（按月）执行定时任务时，在某月的天数不存在的情况下，任务将不会在该月执行。例如设置天数为30，而2月份没有30号，任务将跳过该月份，在3月30号继续执行。  - 由于CRON表达式的定义，这里的固定周期并非严格意义的周期。将从0开始按周期对其时间单位范围（例如单位为分钟时，则范围为0\~59）进行划分，无法整除时最后一个周期会被重置。因此仅在周期能够平均划分其时间单位范围时，才能表示准确的周期。 举个例子，周期单位为小时，因为"/2、/3、/4、/6、/8和/12"可将24小时整除，所以可以表示准确的周期；而使用其他周期时，在新的一天开始时，最后一个周期将会被重置。比如CRON式为"\* \*/12 \* \* \*"时为准确的周期，每天的执行时间为**00:00:00** 和**12:00:00** ；而CRON式为"\* \*/13 \* \* \*"时，每天的执行时间为**00:00:00** 和**13:00:00**，在第二天0时，虽然没到13个小时的周期还是会被刷新。    |
     | 时区 | 可以指定定时规则应用的时区。如果未指定，将默认为控制节点所在的时区。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
     | 任务记录 | 可以设置保留执行成功或执行失败的任务个数，设置为0表示不保留。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
        
     
     
  
  6. （可选）填写工作负载中的**高级配置** 。
     
     
     | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     |:---|:---|
     | 标签与注解 | 以键值对形式为工作负载Pod添加标签或注解，填写完成后需单击"确认添加"。关于标签与注解的作用及配置说明，请参见[设置标签与注解](https://support.huaweicloud.com/usermanual-cce/cce_10_0386.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | 网络配置    | - Pod入/出口带宽限速：支持为Pod设置入/出口带宽限速，详情请参见[为Pod配置QoS](https://support.huaweicloud.com/usermanual-cce/cce_10_0382.html)。  - 是否开启指定容器网络配置：仅支持该功能的集群显示该选项，开启指定容器网络配置，工作负载使用指定的容器网络配置中的容器子网和安全组来创建，详情请参见[使用容器网络配置为命名空间/工作负载绑定子网及安全组](https://support.huaweicloud.com/usermanual-cce/cce_10_0196.html)。  - 指定容器网络配置名：只支持选择关联资源类型为工作负载类型的自定义容器网络配置。  - IPv6共享带宽：仅支持该功能的集群显示该选项，开启后可为Pod的IPv6双栈网卡绑定共享带宽，详情请参见[在CCE Turbo集群中为IPv6双栈网卡的Pod配置共享带宽](https://support.huaweicloud.com/usermanual-cce/cce_10_0604.html)。   |
        
     
     
  
  7. 单击右下角"创建工作负载"，查看工作负载状态为"已启动"。 
     ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002247117817.png "点击放大")
     
     
     
   
- [使用kubectl创建CronJob]
  CronJob的配置参数如下所示：
  - .spec.schedule指定任务运行时间与周期，参数格式请参见[Cron](https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cron-jobs/#cron-schedule-syntax)，例如"0 \* \* \* \* "或"@hourly"。
  
  - .spec.jobTemplate指定需要运行的任务，格式与[使用kubectl创建Job](https://support.huaweicloud.com/usermanual-cce/cce_10_0150.html#cce_10_0150__section450152719412)相同。
  
  - .spec.startingDeadlineSeconds指定任务开始的截止期限。
  
  - .spec.concurrencyPolicy指定任务的并发策略，支持Allow、Forbid和Replace三个选项。
    - Allow（默认）：允许并发运行Job。
    
    - Forbid：禁止并发运行，如果前一个还没有完成，则直接跳过下一个。
    
    - Replace：取消当前正在运行的Job，用一个新的来替换。
     
  
  
  下面是一个CronJob的示例，保存在cronjob.yaml文件中。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  在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. 单击"是"。 任务删除后将无法恢复，请谨慎操作。    |
   
