【kubernetes】K8s使用 CronJob 运行自动化任务

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对应于在完成后不保留相应类型的作业。

回馈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值