Kubernetes 中使用 Job 和 CronJob 两个资源分别提供了一次性任务和定时任务的特性,这两种对象也使用控制器模型来实现资源的管理,我们在这篇文章来介绍Job执行如果失败了会怎么样呢?

修改job-fail.yaml,故意引入一个错误:

7cdefd654ddc7857be17b720ec8fe76e.png

Never

如果将 restartPolicy 设置为 Never 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。

运行 Job 并查看状态,可以看到Never策略的job,pod失败后,重新创建:

a2893d78009a868870f65964d8d64d3e.png

76f915819fcb7b65d3f2072f04568a48.png

直到重新创建7个(spec.backoffLimit默认为6,即重试6次,共7个pod)pod都失败后,认为失败,job的status里会更新为Failed

2cd11ed151b70ced6f25010f8a865abc.png

当前 Completion 的数量为 0

ca68eec2c33551448c3455027aef81a5.png

查看 Pod 的状态:

可以看到有多个 Pod,状态均不正常。kubectl describe pod 查看某个 Pod 的启动日志:

a020d80252bf63176c6ca342dfd40390.png

日志显示没有可执行程序,符合我们的预期。

为什么 kubectl get pod 会看到这么多个失败的 Pod?

原因是:当第一个 Pod 启动时,容器失败退出,根据 restartPolicy: Never,此失败容器不会被重启,但 Job DESIRED 的 Pod 是 1,目前 SUCCESSFUL0,不满足,所以 Job controller 会启动新的 Pod,直到 SUCCESSFUL1。对于我们这个例子,SUCCESSFUL 永远也到不了 1,所以 Job controller 会一直创建新的 Pod,直到设置的数量,失败后pod不会自动被删除,为了终止这个行为,只能删除 Job,pod也会被同时删掉。

26ec55c5dd6f9f93f587e69596bab8c4.png

OnFailure

如果将 restartPolicy 设置为 OnFailure 会怎么样?下面我们实践一下,修改job-fail.yaml后重新启动。

e06e1b4026de2247f32f8bd3d8ca567c.png

010842060eaafc0ab297108c48b514aa.png

Job 的 Completions Pod 数量还是为 0,看看 Pod 的情况:

798cdd6f92b5fdbd6a88f6caffb4baed.png

这里只有一个 Pod,不过 RESTARTS 在不断增加,说明 OnFailure 生效,容器失败后会自动重启。

24971944bc9adb558a28728ba6c2b13e.png

6次失败后,pod被删除:

ee8f66207e55dd72cdb7f31d431a1146.png

同时更新job的status为失败,方便查看最终执行结果:

784f329a534536dd05d874d9ad08d8f6.png

本公众号免费提供csdn下载服务,海量IT学习资源如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【2】,免费邀请加技术交流群互相学习提高,会不定期分享编程IT相关资源。

扫码关注,精彩内容第一时间推给你

75cd91dcc7ab4ec651b6f8dd7e568194.png
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐