raw link: https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#concurrency-policy
使用 CronJob 运行自动化任务
CronJobs 在 Kubernetes v1.21 中被提升为普遍可用。如果您使用的是旧版本的 Kubernetes,请参考您使用的 Kubernetes 版本的文档,以便您看到准确的信息。较旧的 Kubernetes 版本不支持batch/v1CronJob API。
你可以使用一个 定时任务 跑步 工作在基于时间的时间表上。这些自动化作业像Linux 或 UNIX 系统上的Cron任务一样运行。
Cron 作业对于创建周期性和重复性任务很有用,例如运行备份或发送电子邮件。Cron 作业还可以将单个任务安排在特定时间,例如,如果您想将作业安排在低活动期。
Cron 作业有局限性和特质。例如,在某些情况下,一个 cron 作业可以创建多个作业。因此,作业应该是幂等的。
有关更多限制,请参阅CronJobs。
在你开始之前
您需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与您的集群通信。建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。如果您还没有集群,您可以使用minikube创建一个, 或者您可以使用以下 Kubernetes Playground 之一:
Katacoda 【https://www.katacoda.com/courses/kubernetes/playground】
Play with Kubernetes 【http://labs.play-with-k8s.com/】
创建 Cron 作业
Cron 作业需要一个配置文件。此示例 cron 作业配置.spec文件每分钟打印一次当前时间和一条问候消息:
application/job/cronjob.yaml 将 application/job/cronjob.yaml 复制到剪贴板
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
使用以下命令运行示例 CronJob:
kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml
输出类似于:
cronjob.batch/hello created
创建 cron 作业后,使用以下命令获取其状态:
kubectl get cronjob hello
输出类似于:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 <none> 10s
从命令的结果可以看出,cron 作业尚未安排或运行任何作业。观察大约一分钟后创建的作业:
kubectl get jobs --watch
输出类似于:
NAME COMPLETIONS DURATION AGE
hello-4111706356 0/1 0s
hello-4111706356 0/1 0s 0s
hello-4111706356 1/1 5s 5s
现在您已经看到了一个由“hello”cron 作业调度的正在运行的作业。您可以停止查看作业并再次查看 cron 作业以查看它是否安排了作业:
kubectl get cronjob hello
输出类似于:
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 50s 75s
您应该会看到 cronhello作业在 中指定的时间成功地安排了作业LAST SCHEDULE。当前有 0 个活动作业,这意味着该作业已完成或失败。
现在,找到最后一个计划作业创建的 pod,并查看其中一个 pod 的标准输出。
注意:作业名称和 pod 名称不同。
# Replace "hello-4111706356" with the job name in your system
pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items[*].metadata.name})
显示 pod 日志:
kubectl logs $pods
输出类似于:
Fri Feb 22 11:02:09 UTC 2019
Hello from the Kubernetes cluster
删除 Cron 作业
当您不再需要 cron 作业时,请使用以下命令将其删除kubectl delete cronjob :
kubectl delete cronjob hello
删除 cron 作业会删除它创建的所有作业和 Pod,并阻止它创建其他作业。您可以阅读有关在垃圾收集中删除作业的更多信息。
编写 Cron 作业规范
与所有其他Kubernetes CONFIGS,cron作业的需要apiVersion,kind和metadata领域。有关使用配置文件的一般信息,请参阅部署应用程序和使用 kubectl 管理资源文档。
一个 cron 作业配置也需要一个.spec section。
注意:对 cron 作业的所有修改,尤其是它的.spec,仅适用于以下运行。
Schedule 日程
该.spec.schedule是的一个必填字段.spec。它需要一个Cron格式的字符串,例如0 * * * *or @hourly,作为要创建和执行的作业的调度时间。
该格式还包括扩展的“Vixie cron”步骤值。如 FreeBSD 手册中所述:
步长值可以与范围结合使用。跟随一个范围,/指定跳过该范围内的数字值。例如,0-23/2可以在小时字段中使用以指定每隔一小时执行一次命令(V7 标准中的替代方案是 0,2,4,6,8,10,12,14,16,18,20,22)。星号后也允许执行步骤,因此如果您想说“每两个小时”,只需使用*/2.
注意:?附表中的问号 ( ) 与星号的含义相同*,即它代表给定字段的任何可用值。
Job Template 作业模板
的.spec.jobTemplate是作业的模板,它是必需的。它与Job具有完全相同的架构,只是它是嵌套的并且没有apiVersionor kind。有关编写作业的信息.spec,请参阅编写作业规范。
Starting Deadline 开始截止日期
该.spec.startingDeadlineSeconds字段是可选的。如果由于任何原因错过了预定的时间,它代表以秒为单位的开始作业的最后期限。在截止日期之后,cron 作业不会启动该作业。以这种方式未按时完成的作业被视为失败作业。如果未指定此字段,则作业没有截止日期。
如果该.spec.startingDeadlineSeconds字段已设置(非空),CronJob 控制器将测量从预期创建作业到现在之间的时间。如果差异高于该限制,它将跳过此执行。
例如,如果设置为200,则它允许在实际计划后最多 200 秒内创建作业。
并发策略 Concurrency Policy
该.spec.concurrencyPolicy字段也是可选的。它指定如何处理由该 cron 作业创建的作业的并发执行。规范只能指定以下并发策略之一:
Allow (默认):cron 作业允许同时运行的作业
Forbid: cron 作业不允许并发运行;如果是运行新作业的时间并且之前的作业运行尚未完成,则 cron 作业会跳过新作业运行
Replace:如果到了新作业运行的时间并且之前的作业运行尚未完成,则 cron 作业将当前正在运行的作业运行替换为新的作业运行
请注意,并发策略仅适用于由同一 cron 作业创建的作业。如果有多个 cron 作业,则始终允许它们各自的作业同时运行。
Suspend 暂停
该.spec.suspend字段也是可选的。如果设置为true,则暂停所有后续执行。此设置不适用于已经开始的执行。默认为假。
警告:在预定时间内暂停的执行算作错过的作业。当没有开始截止日期的现有 cron 作业.spec.suspend从 更改true为false时,将立即安排错过的作业。
Jobs History Limits 作业历史限制
在.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit领域都是可选的。这些字段指定应保留多少已完成和失败的作业。默认情况下,它们分别设置为 3 和 1。将限制设置为0对应于在完成后不保留相应类型的作业。
回馈