阅读本节前请了解 Advanced CronJob 的使用和功能
系列教程: Openkruise
openkruise doc :openkruise.io/zh/docs/use…
相比原生的 job,AdvancedCronJob 支持创建 broadcastJob, 本质上如果还有其他 job 的扩展,也可以在这里实现
apiVersion: apps.kruise.io/v1alpha1
kind: AdvancedCronJob
spec:
template:
# Option 1: use jobTemplate, which is equivalent to original CronJob
jobTemplate:
# ...
# Option 2: use broadcastJobTemplate, which will create a BroadcastJob object when cron schedule triggers
broadcastJobTemplate:
# ...
# Options 3(future): ...
Reconcile
reconcileJob
预处理
-
通过函数
r.List(ctx, &childJobs, client.InNamespace(advancedCronJob.Namespace), client.MatchingFields{jobOwnerKey: advancedCronJob.Name})将当前 cronjob 所相关的所有 job 加入到数组 childJobs 中 -
遍历 childJobs
-
将 job 进行分类, 分类函数
_, finishedType := isJobFinished(&job)- activeJobs: 正在运行的 job
- failedJobs: 失败的 job
- successfulJobs:成功完成的 job
-
从每个 job 的 annotation "apps.kruise.io/scheduled-at" 拿到调度时间,遍历结束之后可以找到一个最近调度时间存至 mos tRecentTime, 并将该值更新到 advancedCronJob.Status.LastScheduleTime
-
清理超过限制的 job
-
删除超过限制的失败 job
- 删除数量受
FailedJobsHistoryLimit限制,我们需要保留至少FailedJobsHistoryLimit个 failedJobs
- 删除数量受
-
删除超过限制的成功 job
- 删除数量受
SuccessfulJobsHistoryLimit限制,我们需要保留至少SuccessfulJobsHistoryLimit个 failedJobs
- 删除数量受
生成下一次的执行计划
-
通过函数
missedRun, nextRun, err := getNextSchedule(&advancedCronJob, now)计算下一次 job 的创建时间, 下面描述计算规则- 最近的调度时间是 max (mostRecentTime, CreationTimestamp)
- 然后会检查从最近一次调度到当前为止一共缺少了多少次调度,如果 miss 数大于 100,直接报错
- 如果 miss 数不足 100,那么生成下一次调度时间 (recentSchedualTime + duration)
-
如果 missedRun == 0, 意味着没有漏掉任何 job,本次 reconcile 结束并返回下一次调度的时间
-
如果 missedRun > 0, 意味着最近可能有遗漏,会检查是否超过截止运行时间(StartingDeadlineSeconds), 如果超过了了则直接等待到下一个调度窗口才创建 job
-
此时状态为有遗漏 job 且没超过截止运行时间,根据并发策略 (Spec.ConcurrencyPolicy) 进行角度
- 如果已经有活动任务且并发策略为 “Forbid”, 那么意味着不能兵法操作,直接休眠到下次调度
- 如果并发策略为 “Replace”,那么删除活跃 job 并重建
reconcileBroadcastJob
与普通 job 的逻辑完全一样,不单独赘述