创建定时任务(CronJob)
操作场景
定时任务是按照指定时间周期运行的短任务。使用场景为在某个固定时间点,为所有运行中的节点做时间同步。
- 在给定时间点只运行一次。
- 在给定时间点周期性地运行。
CronJob的典型用法如下所示:
- 在给定的时间点调度Job运行。
- 创建周期性运行的Job,例如数据库备份、发送邮件。
前提条件
已创建资源,具体操作请参见创建节点。
通过控制台创建
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建负载”。
- 配置工作负载的信息。
基本信息容器配置
- 容器信息
Pod中可以配置多个容器,您可以单击右侧“添加容器”为Pod配置多个容器。
- 基本信息:配置容器的基本信息。
参数
说明
容器名称
为容器命名。
更新策略
镜像更新/拉取策略。可以勾选“总是拉取镜像”,表示每次都从镜像仓库拉取镜像;如不勾选则优使用节点已有的镜像,如果没有这个镜像再从镜像仓库拉取。
镜像名称
单击后方“选择镜像”,选择容器使用的镜像。
如果需要使用第三方镜像,请参见使用第三方镜像。
镜像版本
选择需要部署的镜像版本。
CPU配额
- 申请:容器需要使用的最小CPU值,默认0.25Core。
- 限制:允许容器使用的CPU最大值。建议设容器配额的最高限额,避免容器资源超额导致系统故障。
如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格。
内存配额
- 申请:容器需要使用的内存最小值,默认512MiB。
- 限制:允许容器使用的内存最大值。如果超过,容器会被终止。
如不填写申请值和限制值,表示不限制配额。申请值和限制值的配置说明及建议请参见设置容器规格。
GPU配额(可选)
当集群中包含GPU节点时,才能设置GPU配额,且集群中需安装gpu-device-plugin插件。
- 不限制:表示不使用GPU。
- 独享:单个容器独享GPU。
- 共享:容器需要使用的GPU百分比,例如设置为10%,表示该容器需使用GPU资源的10%。
关于如何在集群中使用GPU,请参见使用Kubernetes默认GPU调度。
特权容器(可选)
特权容器是指容器里面的程序具有一定的特权。
若选中,容器将获得超级权限,例如可以操作宿主机上面的网络设备、修改内核参数等。
初始化容器(可选)
选择容器是否作为初始化(Init)容器。初始化(Init)容器不支持设置健康检查。
Init容器是一种特殊容器,可以在Pod中的其他应用容器启动之前运行。每个Pod中可以包含多个容器,同时Pod中也可以有一个或多个先于应用容器启动的Init容器,当所有的Init 容器运行完成时,Pod中的应用容器才会启动并运行。详细说明请参见Init 容器。
- 基本信息:配置容器的基本信息。
- 镜像访问凭证:用于访问镜像仓库的凭证,默认取值为default-secret,使用default-secret可访问SWR镜像仓库的镜像。default-secret详细说明请参见default-secret。
- GPU显卡(可选):默认为不限制。当集群中存在GPU节点时,工作负载实例可以调度到指定GPU显卡类型的节点上。
定时规则
- 并发策略:支持如下三种模式。
- 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。
- 以固定时间(按月)执行定时任务时,在某月的天数不存在的情况下,任务将不会在该月执行。例如设置天数为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表示不保留。
高级配置(可选)- 标签与注解:以键值对形式为工作负载Pod添加标签或注解,填写完成后需单击“确认添加”。关于标签与注解的作用及配置说明,请参见标签与注解。
- 网络配置:
- Pod入/出口带宽限速:支持为Pod设置入/出口带宽限速,详情请参见Pod互访QoS限速。
- 容器信息
- 单击右下角“创建工作负载”。
使用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
运行该任务,如下:
- 创建CronJob。
kubectl create -f cronjob.yaml
命令行终端显示如下信息:
cronjob.batch/hello created
- 执行如下命令,查看执行情况。
kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 <none> 9s
kubectl get jobs
NAME COMPLETIONS DURATION AGE hello-1597387980 1/1 27s 45s
kubectl get pod
NAME READY STATUS RESTARTS AGE hello-1597387980-tjv8f 0/1 Completed 0 114s hello-1597388040-lckg9 0/1 Completed 0 39s
kubectl logs hello-1597387980-tjv8f
Fri Aug 14 06:56:31 UTC 2020 Hello from the Kubernetes cluster
kubectl delete cronjob hello
cronjob.batch "hello" deleted
删除CronJob时,对应的普通任务及相关的Pod都会被删除。
相关操作
定时任务创建完成后,您还可执行表1中操作。