入门Kubernetes-Job

 一、Job是什么?

 Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。

 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。

 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

 一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。

 适用场景:

  Job不是设计用来完成通信密集型的并行程序,如科学计算领域常见的场景。它支持并行地处理一组独立但相关的work item,如发送邮件,渲染帧,转码文件和扫描NoSql数据库中的key

二、Job使用方式:

 1、简单示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
   #容器设置 spec: containers:
- name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    #重启策略:OnFailure-失败时;Never-从不 restartPolicy: Never
 #允许执行失败Pod数量 backoffLimit:
4

  该Job的Pod为计算π的后2k位,只执行一次,且异常不会重启。

  启动job:

kubectl apply -f job.yml 
job.batch/pi created

   查看Pod生成:该job的Pod已正常执行完成

#获取pods
kubectl get pods
NAME                                 READY   STATUS      RESTARTS   AGE
pi-qg9l9                             0/1     Completed   0          90m  

  查看Pod执行结果:

 kubectl logs pi-qg9l9
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664……

 2、Job编写规则:

  a) Pod定义:

   Job 的 .spec 中只有 .spec.template 是必需的字段。

   字段 .spec.template 的值是一个 Pod 模版。 其定义规范与 Pod 完全相同,只是其中不再需要 apiVersion 或 kind 字段。

   Job 中 Pod 的 RestartPolicy 只能设置为 Never 或 OnFailure 之一。

  b) job并行执行:   

   适合以 Job 形式来运行的任务主要有三种:

    • 非并行 Job:
      • 通常只启动一个 Pod,除非该 Pod 失败。
      • 当 Pod 成功终止时,立即视 Job 为完成状态。
    • 具有 确定完成计数 的并行 Job:
      • .spec.completions 字段设置为非 0 的正数值。
      • Job 用来代表整个任务,当成功的 Pod 个数达到 .spec.completions 时,Job 被视为完成。
      • 当使用 .spec.completionMode="Indexed" 时,每个 Pod 都会获得一个不同的 索引值,介于 0 和 .spec.completions-1 之间。
    • 带 工作队列 的并行 Job:
      • 不设置 spec.completions,默认值为 .spec.parallelism
      • 多个 Pod 之间必须相互协调,或者借助外部服务确定每个 Pod 要处理哪个工作条目。 例如,任一 Pod 都可以从工作队列中取走最多 N 个工作条目。
      • 每个 Pod 都可以独立确定是否其它 Pod 都已完成,进而确定 Job 是否完成。
      • 当 Job 中 任何 Pod 成功终止,不再创建新 Pod。
      • 一旦至少 1 个 Pod 成功完成,并且所有 Pod 都已终止,即可宣告 Job 成功完成。
      • 一旦任何 Pod 成功退出,任何其它 Pod 都不应再对此任务执行任何操作或生成任何输出。 所有 Pod 都应启动退出过程。

   对于 非并行 的 Job,你可以不设置 spec.completions 和 spec.parallelism。 这两个属性都不设置时,均取默认值 1。

   对于 确定完成计数 类型的 Job,你应该设置 .spec.completions 为所需要的完成个数。 你可以设置 .spec.parallelism,也可以不设置。其默认值为 1。

   对于一个 工作队列 Job,你不可以设置 .spec.completions,但要将.spec.parallelism 设置为一个非负整数。

  c) 完成模式:

   带有 确定完成计数 的 Job,即 .spec.completions 不为 null 的 Job, 都可以在其 .spec.completionMode 中设置完成模式:

    • NonIndexed (默认值):当成功完成的 Pod 个数达到 .spec.completions 所设值时认为 Job 已经完成。换言之,每个Job完成事件都是独立无关且同质的。 要注意的是,当 .spec.completions 取值为 null 时,Job 被隐式处理为 NonIndexed
    • Indexed:Job 的 Pod 会获得对应的完成索引,取值为 0 到 .spec.completions-1, 存放在注解 batch.kubernetes.io/job-completion-index 中。 当每个索引都对应一个完成完成的 Pod 时,Job 被认为是已完成的。

  说明:

   .spec.completions:完成该Job需要执行成功的Pod数

   .spec.parallelism:能够同时运行的Pod数

   .spec.backoffLimit:允许执行失败的Pod数,默认值是6,0表示不允许Pod执行失败。如果Pod是restartPolicy为Nerver,则失败后会创建新的Pod,如果是OnFailed,则会重启Pod,不管是哪种情况,只要Pod失败一次就计算一次,而不是等整个Pod失败后再计算一个。当失败的次数达到该限制时,整个Job随即结束,所有正在运行中的Pod都会被删除

   .spec.activeDeadlineSeconds: Job的超时时间,一旦一个Job运行的时间超出该限制,则Job失败,所有运行中的Pod会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时

 3、Job清除规则:

  a)Job 完成时不会再创建新的 Pod,不过已有的 Pod 也不会被删除。 保留这些 Pod 使得你可以查看已完成的 Pod 的日志输出,以便检查错误、警告 或者其它诊断性输出。 Job 完成时 Job 对象也一样被保留下来,这样你就可以查看它的状态。
  b)自动清理已完成 Job (状态为 Complete 或 Failed)的另一种方式是使用由 TTL 控制器所提供 的 TTL 机制。 通过设置 Job 的 .spec.ttlSecondsAfterFinished 字段,可以让该控制器清理掉 已结束的资源。

三、CronJob(重复Job)

 CronJob 创建基于时隔重复调度的 Jobs。一个 CronJob 对象就像 crontab (cron table) 文件中的一行。 它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job。

 适用场景:

  CronJobs 对于创建周期性的、反复重复的任务很有用,例如执行数据备份或者发送邮件。 CronJobs 也可以用来计划在指定时间来执行的独立任务,例如计划当集群看起来很空闲时 执行某个 Job。

 1、 Cron时间语法表

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6) (周日到周一;在某些系统上,7 也是星期日)
# │ │ │ │ │                                   
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
#
* 任何值 , 值列表分割 - 范围 / 跳过值

   示例参考:  

输入描述相当于
@yearly (or @annually) 每年 1 月 1 日的午夜运行一次 0 0 1 1 *
@monthly 每月第一天的午夜运行一次 0 0 1 * *
@weekly 每周的周日午夜运行一次 0 0 * * 0
@daily (or @midnight) 每天午夜运行一次 0 0 * * *
@hourly 每小时的开始一次 0 * * * *

 2、CronJob示例:每分钟输出信息 

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: hello
spec:
  #时间间隔设置:cron格式;每分钟启动1次 
  schedule: "*/1 * * * *"
  #job模板
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello k8s job!"]
          #重启策略  
          restartPolicy: OnFailure

  创建cronjob:

#创建cronjob
kubectl apply -f cronjob.yaml
error: unable to recognize "cronjob.yaml": no matches for kind "CronJob" in version "batch/v1"

  解决办法:

   需要更改一下/etc/kubernetes/manifests/kube-apiserver.yaml,增加如下配置,重启 kubelet服务,然后重新执行这个cronJob

参考:

  在线cron生成 

    https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/
 https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/ 

posted @ 2021-09-12 18:06  chaney1992  阅读(284)  评论(0编辑  收藏  举报