AdvancedCronJob

170 阅读2分钟

阅读本节前请了解 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

预处理

  1. 通过函数 r.List(ctx, &childJobs, client.InNamespace(advancedCronJob.Namespace), client.MatchingFields{jobOwnerKey: advancedCronJob.Name})将当前 cronjob 所相关的所有 job 加入到数组 childJobs 中

  2. 遍历 childJobs

    1. 将 job 进行分类, 分类函数 _, finishedType := isJobFinished(&job)

      1. activeJobs: 正在运行的 job
      2. failedJobs: 失败的 job
      3. successfulJobs:成功完成的 job
    2. 从每个 job 的 annotation "apps.kruise.io/scheduled-at" 拿到调度时间,遍历结束之后可以找到一个最近调度时间存至 mos tRecentTime, 并将该值更新到 advancedCronJob.Status.LastScheduleTime

清理超过限制的 job

  1. 删除超过限制的失败 job

    1. 删除数量受 FailedJobsHistoryLimit限制,我们需要保留至少 FailedJobsHistoryLimit 个 failedJobs
  2. 删除超过限制的成功 job

    1. 删除数量受 SuccessfulJobsHistoryLimit限制,我们需要保留至少 SuccessfulJobsHistoryLimit 个 failedJobs

生成下一次的执行计划

  1. 通过函数 missedRun, nextRun, err := getNextSchedule(&advancedCronJob, now)计算下一次 job 的创建时间, 下面描述计算规则

    1. 最近的调度时间是 max (mostRecentTime, CreationTimestamp)
    2. 然后会检查从最近一次调度到当前为止一共缺少了多少次调度,如果 miss 数大于 100,直接报错
    3. 如果 miss 数不足 100,那么生成下一次调度时间 (recentSchedualTime + duration)
  2. 如果 missedRun == 0, 意味着没有漏掉任何 job,本次 reconcile 结束并返回下一次调度的时间

  3. 如果 missedRun > 0, 意味着最近可能有遗漏,会检查是否超过截止运行时间(StartingDeadlineSeconds), 如果超过了了则直接等待到下一个调度窗口才创建 job

  4. 此时状态为有遗漏 job 且没超过截止运行时间,根据并发策略 (Spec.ConcurrencyPolicy) 进行角度

    1. 如果已经有活动任务且并发策略为 “Forbid”, 那么意味着不能兵法操作,直接休眠到下次调度
    2. 如果并发策略为 “Replace”,那么删除活跃 job 并重建

reconcileBroadcastJob

与普通 job 的逻辑完全一样,不单独赘述