Job

容器按照持续运行的时间可分为两类:服务类容器和工作类容器。

服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等。工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。

Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器;对于工作类容器,我们用 Job。

第一步:

先看一个简单的 Job 配置文件 myjob.yml:

① batch/v1 是当前 Job 的 apiVersion。

② 指明当前资源的类型为 Job。

③ restartPolicy 指定什么情况下需要重启容器。对于 Job,只能设置为 Never 或者 OnFailure。对于其他 controller(比如 Deployment)可以设置为 Always 。

第二步:通过 kubectl apply -f myjob.yml 启动 Job。

[root@ken ~]# kubectl apply -f myjob.yml
job.batch/myjob created

第三步:查看job的状态

[root@ken ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob / 4s 40s

第四步:查看pod的状态

[root@ken ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-8hczg / Completed 83s

显示completed已经完成

第五步:查看pod的标准输出

[root@ken ~]# kubectl logs myjob-8hczg
hello k8s job!

job失败的情况

讨论了job执行成功的情况,如果失败了会怎么样呢?

第一步:修改 myjob.yml,故意引入一个错误:

第二步:删除之前的job

[root@ken ~]# kubectl delete -f myjob.yml
job.batch "myjob" deleted
[root@ken ~]# kubectl get job
No resources found.

第三步:运行新的job并查看状态

[root@ken ~]# kubectl apply -f myjob.yml
job.batch/myjob created
[root@ken ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob / 6s 6s

可以发现完成为0

第四步:查看pod状态

[root@ken ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-hc6ld / ContainerCannotRun 64s
myjob-hfblk / ContainerCannotRun 60s
myjob-t9f6v / ContainerCreating 11s
myjob-v2g7s / ContainerCannotRun 31s

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

第五步:查看pod的启动日志

[root@ken ~]# kubectl describe pod myjob-hc6ld
...
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m21s default-scheduler Successfully assigned default/myjob-hc6ld to host1
Normal Pulling 2m19s kubelet, host1 pulling image "busybox"
Normal Pulled 2m18s kubelet, host1 Successfully pulled image "busybox"
Normal Created 2m18s kubelet, host1 Created container
Warning Failed 2m17s kubelet, host1 Error: failed to start container "hello": Error response from daemon: OCI runtime create failed: container_linux.go:: starting container process caused "exec: \"invlain_commadn\": executable file not found in $PATH": unknown

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

下面解释一个现象:为什么 kubectl get pod 会看到这么多个失败的 Pod?

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

[root@ken ~]# kubectl delete -f myjob.yml
job.batch "myjob" deleted
[root@ken ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE

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

[root@ken ~]# kubectl apply -f myjob.yml
job.batch/myjob created
[root@ken ~]# kubectl get job
NAME COMPLETIONS DURATION AGE

完成依然为0

再来查看一下pod的状态

[root@ken ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-5tbxw / CrashLoopBackOff 67s

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

定时执行job

Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job。

第一步:CronJob 配置文件示例如下:

[root@ken ~]# cat myjob1.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: OnFailure

① batch/v1beta1 是当前 CronJob 的 apiVersion。

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

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

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

第二步:接下来通过 kubectl apply 创建 CronJob。

[root@ken ~]# kubectl apply -f myjob1.yml
cronjob.batch/hello created

第三步:查看crontab的状态

[root@ken ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */ * * * * False 22s 3m12s

第四步:等待几分钟查看jobs的执行情况

[root@ken ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
hello- / 5s 2m24s
hello- / 18s 83s
hello- / 4s 23s

可以看到每隔一分钟就会启动一个 Job。

过段时间查看pod

第五步:执行 kubectl logs 可查看某个 Job 的运行日志:

[root@ken ~]# kubectl logs hello--6s8lp
hello k8s job!

k8s运行容器之Job(四)--技术流ken的更多相关文章

  1. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

  2. k8s重要概念及部署k8s集群(一)--技术流ken

    重要概念 1. cluster cluster是 计算.存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用. 2.master master是cluster的大脑,他的主要职责是调度,即决 ...

  3. k8s架构分析(二)--技术流ken

    master节点 k8s的集群由master和node组成,节点上运行着若干k8s服务. master节点之上运行着的后台服务有kube-apiserver .kube-scheduler.kube- ...

  4. k8s运行容器之deployment(三)--技术流ken

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  5. k8s运行容器之Job(四)

    Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...

  6. k8s运行容器之deployment(三)

    deployment 我们已经知道k8s是通过各种controller来管理pod的生命周期.为了满足不同业务场景,k8s开发了Deployment.ReplicaSet.DaemonSet.Stat ...

  7. k8s运行容器之Job应用(6)

    容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...

  8. k8s滚动更新(六)--技术流ken

    实践 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用, ...

  9. k8s健康检查(七)--技术流ken

    默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness ...

随机推荐

  1. js函数柯里化,实现bind

    1.柯里化: 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 举个栗子: 一个计算两数之和的函数,需要传递两个参数,柯里化 ...

  2. VUE 一些环境配置

    1. 安装  nrm 一键切换npm源 npm i nrm -g       [安装命令工具] nrm ls                 [罗列出所有的源] nrm use taobao  [使用 ...

  3. git 配置 .ssh key

    1.安装git软件: 2.打开本地git bash,使用如下命令生成ssh公钥和私钥对: ssh-keygen -t rsa -C 'xxx@xxx.com'    然后一路回车(-C 参数是你的邮箱 ...

  4. SQL Server 删除重复记录,只保留一条记录

    原文地址:http://blog.csdn.net/eriato/article/details/17417303 有张表格之前没有设计关键字段的唯一约束,导致有时候执行插入操作时不小心执行了多次就出 ...

  5. Ubuntu上安装使用WeChat、TIM

    WeChat可以直接到软件商店安装,不过是网页版...(其实个人感觉还行,就是什么都不能设置就挺蛋疼的,字体大小.背景什么的) 以下是网上找到的教程,在此总结一下: 下载地址:https://gith ...

  6. oracle中文乱码问题解决

    中文乱码问题解决:1.查看服务器端编码select userenv('language') from dual;我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK2.执行语句 se ...

  7. css实现超出两行隐藏

    overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-box-orient:vertical; -webkit-l ...

  8. 刚发现 CSS 还存在一个命名规范 B.E.M

    Block !误区:这个block并非inline-block里的block,而是将所有东西都划分为一个独立的模块,一个header是block,header里嵌套的搜索框是block,甚至一个ico ...

  9. thinkphp mysql查询结果为什么全是string问题

    找到根目录下的thinkphp\library\think\db\Connection.php 文件 // PDO连接参数 protected $params = [ PDO::ATTR_CASE = ...

  10. SQL语句题

    SQL语句题 Student(Sno,Sname,Sage,Ssex)注释:学生表(学号,姓名,性别年龄,性别) Course(Cno,Cname,Tno) 注释:课程表(课程号,课程名称,教师编号) ...