kubernetes的Daemonset、Job和CronJob
# Daemonset(容器化守护进程)
## 作用:在集群运行一个Daomon Pod
## 特征
这个Pod运行在集群的每一个节点上
每个节点只有这样一个Pod实例
当有新的节点加入时,该Pod会自动在新节点上被创建出来;当旧的节点被删除时,会自动被回收。
## 应用
各种网络插件的Agent组件,必须运行在每一个节点上,用来处理这个节点上的网络容器
各种存储插件的Agent组件,必须运行在每一个节点上,用来挂载远程存贮目录,操作容器的Volume目录
各种监控组件和日志组件,也必须.........,负责节点上的监控信息和日志搜集。
# 离线业务
Deployment、Statefulset、以及Daemonset的这三个编排针对的都是在线业务,Long Running Task(长作业)。这里要介绍的是离线业务或者说是Batch Job(计算业务)
# Job案例
job.yaml:
```
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: resouer/ubuntu-bc
command: ["sh", "-c", "echo 'scale=10000; 4*a(1)' | bc -l "]
restartPolicy: Never
backoffLimit: 4
```
这里面存在一个Pod模板,即spec.template字段。
这个模板中定义了一个安装有bc命令的ubuntu镜像的容器,运行的程序是:
$ echo "scale=10000; 4*a(1)" | bc -l
bc是linux中的计算器,-l表示用标准数学库,a(1)表示arctangle函数即计算π到10000位。
创建job:
$ kubectl create -f job.yaml
查看job对象:
$ kubectl describe jobs/pi
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
pi-rq5rl 0/1 Completed 0 4m
在Pod模板中restartPolicy=Never即永远不被重启,在job中该属性只能是Never和OnFailure,在Deployment智能设成Always。可以通过kubectl logs查看这个Pod的日志:
$ kubectl logs pi-rq5rl
若这个离线作业失败了,Job Controller就会不断尝试创建新的Pod,这个尝试需要由spec.backoffLimit字段设定,而且Job Controller的创建新的Pod动作时间间隔成指数增长,会发生在10s,20s,30s.....
如果这个Pod运行一直不结束,Job的API 中有一个spec.activeDeadlineSeconds字段可以设置最长运行时间。
# Job Controller对并行作业的控制方法
负责并行的参数有两个:
spec.parallelism:一个Job在任意时间同时启动运行的个数
spec.completions:定义Job至少完成的Pod数量
```
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
parallelism: 2
completions: 4
template:
spec:
containers:
- name: pi
image: resouer/ubuntu-bc
command: ["sh", "-c", "echo 'scale=5000; 4*a(1)' | bc -l "]
restartPolicy: Never
backoffLimit: 4
# 三种Job使用方法
## 外部管理器+Job管理器
```
apiVersion: batch/v1
kind: Job
metadata:
name: process-item-$ITEM
labels:
jobgroup: jobexample
spec:
template:
metadata:
name: jobexample
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: busybox
command: ["sh", "-c", "echo Processing item $ITEM && sleep 5"]
restartPolicy: Never
```
注意这两个方面:控制这类job时,替换$ITEM这样的变量;来自于同一个模板,都有jobgroup:jobexample标签,即这组job使用同样的标志。
可以利用shell脚本把$ITEM替换掉:
$ mkdir ./jobs
$ for i in apple banana cherry
do
cat job-tmpl.yaml | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml
done
$ kubectl create -f ./jobs
$ kubectl get pods -l jobgrop=jobexample
## 拥有固定任务数的并行Job
## 指定并行度(paralllism)但是不设置固定的completions
- 点赞
- 收藏
- 关注作者
评论(0)