一、Job如何创建

1.定义一个名为job.yaml的yaml文件

[root@k8s-master01 JOB]# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    job-name: echo
  name: echo
  namespace: default
spec:
  backoffLimit: 4
  completions: 5  #成功数为5
  parallelism: 3  #并发是3
  template:
    spec:
      containers:
      - command:
        - echo
        - Hello, Job
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: echo
        resources: {}
      restartPolicy: Never

上面参数说明如下:

  • backoffLimit:如果任务执行失败,失败多少次后不再执行。这里设置为4,代表失败4次后不再执行
  • completions:有多少个Pod执行成功,认为任务是成功的。如果为空默认和parallelism数值一样。这里设置为5,代表起来5个Pod是代表执行成功的
  • parallelism:并行执行任务的数量,如果parallelism数值大于未完成任务数,只会创建未完成的数量; 比如completions是5,并发是3,第一次会创建3个Pod执行任务, 第二次只会创建2个Pod执行任务。

2.部署

[root@k8s-master01 JOB]# kubectl create -f job.yaml
job.batch/echo created

3.查看job

[root@k8s-master01 JOB]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
echo   5/5           8s         5m21s

4.查看Pod状态,观察先完成3个,等3个完成后再完成剩下的两个

[root@k8s-master01 JOB]# kubectl get po
NAME         READY   STATUS      RESTARTS   AGE
echo-42g4k   0/1     Completed   0          3m45s
echo-66qsz   0/1     Completed   0          3m45s
echo-hbbc2   0/1     Completed   0          3m41s
echo-j4hxt   0/1     Completed   0          3m45s
echo-s7sjr   0/1     Completed   0          3m41s

5.查看任一Pod的日志

[root@k8s-master01 JOB]# kubectl logs -f echo-42g4k
Hello, Job

二、Job如何终止与清理

Job 完成时不会再创建新的 Pod,不过已有的 Pod 通常也不会被删除。 保留这些 Pod 使得你可以查看已完成的 Pod 的日志输出,以便检查错误、警告或者其它诊断性输出。 Job 完成时 Job 对象也一样被保留下来,这样你就可以查看它的状态。 在查看了 Job 状态之后删除老的 Job 的操作留给了用户自己。 你可以使用 kubectl 来删除 Job。 当使用 kubectl 来删除 Job 时,该 Job 所创建的 Pod 也会被删除。

默认情况下,Job 会持续运行,除非某个 Pod 失败(restartPolicy=Never) 或者某个容器出错退出(restartPolicy=OnFailure)。 这时,Job 基于前述的 spec.backoffLimit 来决定是否以及如何重试。 一旦重试次数到达 .spec.backoffLimit 所设的上限,Job 会被标记为失败, 其中运行的 Pod 都会被终止。

终止 Job 的另一种方式是设置一个活跃期限。 你可以为 Job 的 .spec.activeDeadlineSeconds 设置一个秒数值。 该值适用于 Job 的整个生命期,无论 Job 创建了多少个 Pod。 一旦 Job 运行时间达到 activeDeadlineSeconds 秒,其所有运行中的 Pod 都会被终止, 并且 Job 的状态更新为 type: Failedreason: DeadlineExceeded

注意 Job 的 .spec.activeDeadlineSeconds 优先级高于其 .spec.backoffLimit 设置。 因此,如果一个 Job 正在重试一个或多个失效的 Pod,该 Job 一旦到达 activeDeadlineSeconds 所设的时限即不再部署额外的 Pod, 即使其重试次数还未达到 backoffLimit 所设的限制。

下面针对活跃期限进行举例说明:

1.定义一个名为job-activeDead.yaml的yaml文件

[root@k8s-master01 JOB]# vim job-activeDead.yaml
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    job-name: echo111
  name: echo111
  namespace: default
spec:
  backoffLimit: 4
  activeDeadlineSeconds: 100
  completions: 5  #成功数为5
  parallelism: 3  #并发是3
  template:
    spec:
      containers:
      - command:
        - echo
        - Hello, Job
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: echo111
        resources: {}
      restartPolicy: Never

上面参数说明如下:

  • backoffLimit:如果任务执行失败,失败多少次后不再执行。这里设置为4,代表失败4次后不再执行
  • activeDeadlineSeconds: 表示Job的整个生命周期,以秒为单位。一旦到设置的秒数,所有运行中的Pod就会终止
  • completions:有多少个Pod执行成功,认为任务是成功的。如果为空默认和parallelism数值一样。这里设置为5,代表起来5个Pod是代表执行成功的
  • parallelism:并行执行任务的数量,如果parallelism数值大于未完成任务数,只会创建未完成的数量; 比如completions是5,并发是3,第一次会创建3个Pod执行任务, 第二次只会创建2个Pod执行任务。

2.部署

[root@k8s-master01 JOB]# kubectl create -f job.yaml
job.batch/echo111 created
:

3.查看job

[root@k8s-master01 JOB]# kubectl get job
NAME      COMPLETIONS   DURATION   AGE
echo111   5/5           7s         38s

4.查看Pod状态

[root@k8s-master01 JOB]# kubectl get po
NAME                            READY   STATUS      RESTARTS        AGE
echo111-5pbdl                   0/1     Completed   0               71s
echo111-8jd25                   0/1     Completed   0               71s
echo111-rs94m                   0/1     Completed   0               68s
echo111-tbkpw                   0/1     Completed   0               71s
echo111-x9cch                   0/1     Completed   0               68s