对于离线业务, 批处理任务, k8s 使用 JobCronJob 进行管理

Job的定义

在Job Pod被创建之后, k8s 会自动为其添加 Labels , 同时对 Job 对象, 也会添加相应的 Selector, 从而 保证了 Job 与它所管理的 Pod 之间的匹配关系.

<aside> 💡 k8s 为对象自动添加lable的功能, 叫做 Dynamic Admission Control , 是借助 Admission Controller 对象实现的, 在API创建之后立马调用

</aside>

Job Controller 控制的对象, 直接就是 Pod, Job Controller 在控制循环中进行的调谐(Reconcile)操作,是根据实际在 Running状态 Pod 的数目、已经成功退出的 Pod 的数目,以及 parallelism、completions 参数的值共同计算出在这个周期里,应该创建或者删除的 Pod 数目,然后调用 Kubernetes API 来执行这个操作。

Job的扩容

kubectl scale jobs job-multi --replicas=2

CronJob的定义

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  concurrencyPolicy: Replace  # 并发执行策略, 新产生的 Job 会替换旧的、没有执行完的 Job
  failedJobsHistoryLimit: 3  # 为失败的任务执行保留的历史记录数, 默认值为1
  successfulJobsHistoryLimit: 1  # 为成功的任务执行保留的历史记录数
  startingDeadlineSeconds: 10  # 因各种原因缺乏执行作业的时间点, 说导致的启动作业错误的超时时长, 会被计入错误历史记录
  suspend: false # 是否挂起后续的任务执行,默认为false,对运行中的作业不会产生影响。
  schedule: "*/1 * * * *"  # 指定 CronJob, 何时启动
  jobTemplate:
    spec:
      template:
				metadata:
          labels:
            cronjob: es-clean-log-indices
        spec:
					restartPolicy: OnFailure  # 只能为 OnFailure 和 Never
          containers:
					...

spec.concurrencyPolicy 管理定时任务的策略, 在某些情况下, 可能原来的Job还没有执行完, 新的Job就产生了, 可以通过 spec.concurrencyPolicy 来定义处理策略