AIOps 一场颠覆传统运维的盛筵
1172
2022-10-27
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
发表评论
暂时没有评论,来抢沙发吧~