kubernetes - 控制器 - CronJob

网友投稿 1172 2022-10-27

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

kubernetes - 控制器 - CronJob

控制器 - CronJob目标什么是 CronJobCronJob 的限制使用CronJob执行自动任务什么是 CronJobCronJob 按照预定的时间计划创建 Job,一个 CronJob 对象类似于 Linux中的 crontab 文件中的一行记录,该对象根据 Cron 格式定义时间计划,周期性的创建 JobSchedule (时间计划)所有的 CronJob 的 schedule 中所定义的时间,都是基于 master 所在地区计算的CronJob 的限制一个 CronJob 对象在时间计划中没执行一次都会创建大约一个 Job 对象,这里用到了大约,是因为在少数情况下会创建两个或者不创建 Job 对象,尽管 K8S 已经尽最大可能的避免这个情况的出现,但是不能完全的避免这类现象,因此,Job 程序必须是 幂运算当以下两个条件都满足时,Job 至少将运行一次:startingDeadlineSeconds记录执行错过次数的时间 被设置为一个较大的值,或者不设置(将使用默认值)concurrencyPolicy 并发策略 被设置为Allow对于每一个 CronJob ,CronJob 控制器将检查自上一次执行的时间到现在为止有多少次执行错过了,如果执行错过的次数超过了 100 次,则 CronJob 不会在创建 Job 对象,并记录以下错误Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.非常重要的一点是, 如果设置了startingDeadlineSeconds(非空),控制器将按照从startingDeadlineSeconds秒之前到现在为止的时间段计算被执行错过的次数,而不是按照上一次执行的时间点到现在为止的时间点计算错过的次数,举个例子吧: 如果startingDeadlineSeconds被设置为 200,则控制器将计算过去200秒内被执行错过的次数当 CronJob 在其计划的时间点创建 Job 失败,此时 CronJob 被认为执行错过一次,如果concurrencyPolicy被设置为Forbid,并且上次创建的 Job 仍在运行,此时 CronJob 再次遇到新的计划执行时间点,尝试创建新的 Job 此时该 Job 会创建失败,并被记录执行错过一次在举个例子说明一下上面的意思:假设某个 CronJob 被设置为: 自 08:30:00 开始,每分钟创建一个新的 Job,且 CronJob 的 startingDeadlineSeconds字段未被设置,如果 CronJob 控制器恰好在 08:29:00到10:21:00这个时间段出现故障,则该 CronJob 将不会在创建新的 Job 对象,因为其错过的执行次数已经超过了 100假设某个 CronJob 被设置为: 自08:30:00开始,每分钟创建一个新的 Job, 且 CronJob 的 startingDeadlineSeconds字段被设置为200,同样,如果 CronJob 控制器恰好在  08:29:00到10:21:00这个时间段出现故障,此时 CronJob 控制器将在 10:22:00创建一个新的 Job 这是因为,在这个例子中,控制器将只计算过去 200 秒中错过的执行次数(大约 3 次),而不是从上一次执行的时间点开始计算错过的执行次数CronJob 只负责按照时间计划的规定创建 Job 对象,由 Job 来负责管理具体 Pod 的创建和执行使用CronJob执行自动任务CronJob 执行周期性的重复任务很重要,例如: 备份数据,发送邮件等,CronJob 也可以用来指定将来某个时间点执行单个任务,例如将某项任务定时到系统负载比较低的时候执行创建 CronJob下面的例子中的 CronJob 每分钟,打印一次当前时间并输出 HelloWorld信息apiVersion: batch/v1beta1kind: CronJobmetadata: name: hellospec: schedule: "*/1 * * * *" # 每分钟执行一次 jobTemplate: # 定义 Job 模板 spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo "Hello World" # 输出时间和hello world restartPolicy: OnFailure执行命令创建 CronJobkubectl apply -f cronjob.yaml输出结果cronjob.batch/hello created或者你可以直接使用 kubectl run命令创建kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- bin/sh -c "date; echo Hello World"执行命令查看创建的 CronJob 状态kubectl get cronjob hello输出结果NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGEhello */1 * * * * False 0 32s 42s从结果看,该 CronJob 并未执行一次任务,执行下面的命令 等候一分钟watch kubectl get jobs输出结果NAME COMPLETIONS DURATION AGEhello-1590460740 1/1 17s 73shello-1590460800 0/1 13s 13s此时,可以看到该 CronJob 创建了多个Job,并执行结束。这时ctrl + c 停止 watch,并重新查看 Cronjob 的状态kubectl get cronjob hello输出结果NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGEhello */1 * * * * False 0 20s 3m30s输出结果显示,该 CronJob 在 LAST SCHEDULE 这个时间点成功创建了一个 Job。当前 ACTIVE Job 数为 0,意味着,该 Job 已经成功结束,或者已经失败查看 Pod 输出的信息# 将 "hello-1590460800" 替换成您系统中的 Job namepods=$(kubectl get pods --selector=job-name=hello-1590460800 --output=jsonpath={.items[*].metadata.name})查看 Pod 的日志kubectl logs $pods输出结果如下所示Tue May 26 02:39:19 UTC 2020Hello World删除 CronJob当你不再需要某个 CronJob 时,可以使用命令将其删除 kubectl delete cronjob ,在本例中,可以执行命令kubectl delete cronjob hello或者kubectl delete -f cronjob.yaml删除 CronJob 时,将移除该 CronJob 创建的所有 Job 和 Pod,并且 CronJob 控制器将不会为其在创建任何新的 Job编写 CronJob YAML与其他所有 Kubernetes 对象一样,CronJob 对象需要 apiVersion、kind、metadata 这几个字段。CronJob 还需要 .spec 字段所有对 CronJob 对象作出的修改,尤其是 .spec 的修改,都只对修改之后新建的 Job 有效,已经创建的 Job 不会受到影响Schedule.spec.schedule字段是必填字段,类型为 Cron 格式的字符串,例如: 0 * * * * *或@hourly该字段定义了 CronJob 应该什么时候执行 Job该字段同样支持 vixie cron step 值(step values),参考 FreeBSD manual。例如,指定 CronJob 每隔两个小时执行一次,可以有如下三种写法0 0,2,4,5,6,8,12,14,16,17,20,22 * * *使用 范围值 + Step 值的写法:0 0-23/2 * * *Step 也可以跟在一个星号后面,如 0 */2 * * *问号 ? 与 星号 * 的含义相同,代表着该字段不做限定Job Template.spec.jobTemplate 字段也是为必填字段,该字段的结构与 Job 相同,只是不需要 apiVersion和kind字段Starting Deadline.spec.startingDeadlineSeconds字段为可选字段,代表着从计划的时间点开始,最迟多少秒之内必须启动 Job。如果超过了这个时间点,CronJob 就不会为其创建 Job,并将其记录为一次错过的执行次数。如果该字段未指定,则 Job 必须在指定的时间点执行Concurrency Policy.spec.concurrencyPolicy字段是必填字段,指定了如何创建 Job 的并发性,可选值的值有:Allow:默认值,允许并发运行 JobForbid:不允许并发运行 Job;如果新的执行时间点到了,而上一个 Job 还未执行完,则 CronJob 将跳过新的执行时间点,保留仍在运行的 Job,且不会在此刻创建新的 JobReplace:如果新的执行时间点到了,而上一个 Job 还未执行完,则 CronJob 将创建一个新的 Job 以替代正在执行的 JobConcurrency policy 只对由同一个 CronJob 创建的 Job 生效。如果有多个 CronJob,则他们各自创建的 Job 之间不会相互影响。Suspend.spec.suspend字段是可选字段,如果该字段设置为 true,所有的后续执行都将挂起,该字段不会影响到已经创建的 Job。默认值为 false挂起(suspend)的时间段内,如果恰好存在有计划的执行时间点,则这些执行时间计划都被记录下来。如果不指定 .spec.startingDeadlineSeconds,并将 .spec.suspend 字段从 true 修改为 false,则挂起这段时间内的执行计划都将被立刻执行Job History Limits.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit字段是可选字段,这些字段指定了 CronJob 保留多少个 完成或失败的 Job 记录.spec.successfulJobsHistoryLimit 的默认值为 3.spec.failedJobsHistoryLimit 的默认值为 1如果将其设置为 0,则 CronJob 不会保留已经结束的 Job 的记录

上一篇:JavaScript则试
下一篇:在Jenklns中集成Selenium测试
相关文章

 发表评论

暂时没有评论,来抢沙发吧~