1.7.3 Job重试机制

如果要实现 Pod 执行失败后可以重试,此时可以把重启策略改成 OnFailure,但是最好限制一下重试次数。比如最多允许每个 Pod 尝试两次任务执行

1、定义job的yaml文件

关键配置信息

  backoffLimit: 2 #每个Pod最大重启次数

完整配置信息

[root@k8s-master01 JOB]# vim job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  labels:
    job-name: echo
  name: echo
  namespace: default
spec:
  backoffLimit: 2 #每个Pod最大重启次数
  completions: 5  #成功数为5
  parallelism: 2  #并发是2
  template:
    spec:
      containers:
      - command:
        - sh 
        - -c
        - echo "Hello, Job" && sleep 1 && exit 42
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: echo
        resources: {}
      restartPolicy: OnFailure

2、创建job

[root@k8s-master01 ~]# kaf job.yaml 

3、查看资源情况

# 查看pod,刚开始处于running
[root@k8s-master01 ~]# kgp
NAME         READY   STATUS    RESTARTS   AGE
echo-9dm59   1/1     Running   0          2s
echo-skqst   1/1     Running   0          2s

# 查看pod,后面因为退出状态码设置为42且restartPolicy设置为OnFailure导致pod会重启,最多重启两次后被删除
[root@k8s-master01 ~]# kgp
NAME         READY   STATUS        RESTARTS     AGE
echo-9dm59   1/1     Terminating   1 (9s ago)   19s
echo-skqst   1/1     Terminating   1 (9s ago)   19s

# 等一会查看pod,pod被删除
[root@k8s-master01 ~]# kgp
No resources found in default namespace.

# 查看job,此时会显示Failed状态,标记为失败
[root@k8s-master01 ~]# kg job
NAME   STATUS   COMPLETIONS   DURATION   AGE
echo   Failed   0/5           26s        26s

4、环境复原

[root@k8s-master01 ~]# k delete -f job.yaml

1.8 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
  ttlSecondsAfterFinished: 100
  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执行任务。
  • ttlSecondsAfterFinished:Job在执行结束之后(状态为completed或Failed)自动清理。设置为0表示执行结束立即删除,不设置则不会清除。这里设置100代表完成后100s后自动删除

2.部署

[root@k8s-master01 JOB]# kubectl create -f job.yaml 

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