k8s的job和CronJob

网易公开课,开课啦!

主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。

腾讯课堂:点击进入
网易课堂:点击进入

7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!


全栈工程师开发手册 (作者:栾鹏)
架构系列文章

任务主要包含两种:

  • Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
  • CronJob是基于调度的Job执行将会自动产生多个job,调度格式参考Linux的cron系统。

job

Job,执行一次任务
Job Spec格式

  • spec.template格式同Pod。
  • RestartPolicy仅支持Never或OnFailure。
  • 单个Pod时,默认Pod成功运行后Job即结束。
  • .spec.completions标志Job结束需要成功运行的Pod个数,默认为1。
  • .spec.parallelism标志并行运行的Pod的个数,默认为1。
  • spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试。

一个简单的例子:

apiVersion: batch/v1beta1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

注意,里面的template配置方法与Deployment配置参数是完全一样的,用于生成运行时的pod。可以在其中指定挂载卷、运行的命令等等。

执行job任务:

$ kubectl create -f ./job.yaml
job "pi" created
$ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
3.141592653589793238462643383279502...

cron job

Cron Job 管理基于时间的 Job,即:

  • 在给定时间点只运行一次
  • 在给定时间点周期性地运行

一个 CronJob 对象类似于 crontab (cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 Cron 。

注意: 在预定计划中,问号(?)和星号(*)的意义是相同的,表示给定字段的取值是任意可用值。

注意: 在 Kubernetes 1.4 版本引入了 ScheduledJob 资源,但从 1.5 版本开始改成了 CronJob。

典型的用法如下所示:

  • 在给定的时间点调度 Job 运行
  • 创建周期性运行的 Job,例如:数据库备份、发送邮件。

前提条件

当使用的 Kubernetes 集群,版本 >= 1.4(对 ScheduledJob),>= 1.5(对 CronJob),当启动 API Server(参考 为集群开启或关闭 API 版本 获取更多信息)时,通过传递选项 --runtime-config=batch/v2alpha1=true 可以开启 batch/v2alpha1 API。

Cron Job 资源yaml文件

apiVersion: batch/v1beta1   #batch/v2alpha1
kind: CronJob
metadata:
  name: clean-job
  namespace: cloudai-2
spec:
  schedule: "*/1 * * * *"   # 分钟,小时,日,月,星期
  startingDeadlineSeconds: 300  # 300秒没有启动成功,就不再启动
  concurrencyPolicy: Forbid #Allow 允许job并发执行,Forbid只允许当前这个执行,Replace取消当前这个,而执行新的
  suspend: false # 设置为true,后续所有执行被挂起
  jobTemplate:
    spec:
#      ttlSecondsAfterFinished: 100 # 任务完成后的10s之后自动删除pod,k8s 1.12以后才有
      backoffLimit: 4   # 最大允许失败的次数
      template:
        spec:
          restartPolicy: OnFailure
          volumes: 
          - name: tz-config
            hostPath:
              path: /usr/share/zoneinfo/Asia/Shanghai
          - name: code-path  
            persistentVolumeClaim:
              claimName: cloudai-code-pvc
          - name: file-path  
            persistentVolumeClaim:
              claimName: cloudai-file-pvc
          containers:
          - name: clean-job
            image: luanpeng/lp:cloudai-cron-job
            command: ['python','clean_job.py']
            workingDir: /app/cronjob
            volumeMounts:
            - name: tz-config
              mountPath: /etc/localtime
            - name: code-path
              mountPath: /app
            - name: file-path
              mountPath: /file

batch/v2alpha1 是当前 CronJob 的 apiVersion。

指明当前资源的类型为 CronJob。

schedule 指定什么时候运行 Job,其格式与 Linux cron 一致。这里 */1 * * * * 的含义是每一分钟启动一次。

jobTemplate 定义 Job 的模板,格式与前面 Job 一致。

  • .spec.schedule:调度,必需字段,指定任务运行周期,格式同 Cron。

  • .spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务,格式同 Job。

  • .spec.startingDeadlineSeconds :启动 Job 的期限(秒级别),该字段是可选的。

    • 如果因为任何原因而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败的。

    • 如果没有指定,则没有期限。

  • .spec.concurrencyPolicy:并发策略,该字段也是可选的。

    • 它指定了如何处理被 Cron Job 创建的 Job 的并发执行。只允许指定下面策略中的一种。

      • Allow(默认):允许并发运行 Job。

      • Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个。

      • Replace:取消当前正在运行的 Job,用一个新的来替换。

    • 注意,当前策略只能应用于同一个 Cron Job 创建的 Job。如果存在多个 Cron Job,它们创建的 Job 之间总是允许并发运行。

  • .spec.suspend :挂起,该字段也是可选的。

    • 如果设置为 true,后续所有执行都会被挂起。

    • 它对已经开始执行的 Job 不起作用。默认值为 false。

  • .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit :历史限制,是可选的字段。

    • 它们指定了可以保留多少完成和失败的 Job。

    • 默认没有限制,所有成功和失败的 Job 都会被保留。

    • 当运行一个 Cron Job 时,Job 可以很快就堆积很多,推荐设置这两个字段的值。

    • 设置限制的值为 0,相关类型的 Job 完成后将不会被保留。

然后就可以使用kubectl create -f CronJob.yaml

检查

一个CronJob会定期启动一个job 来执行一个任务.

通过 kubectl get cronjob 查看 CronJob 的状态.

通过 kubectl get jobs 查看 Job 的执行情况.

执行 kubectl logs 可查看某个 Job 的运行日志.

实时跟踪jobs运行 kubectl get jobs --watch

注意:当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。 因此如果我们现在使用它,那么Job应该被我们设计成幂等的。

你可能感兴趣的:(架构,微服务架构)