3-6-3-DaemonSet、Job和CronJob控制器
1. DaemonSet控制器
从名字上就可以看出这个控制器是管理守护进程类的pod; DaemonSet控制器的主要作用是管理守护进程类的Pod , 通常用于在每个节点需要运行一个这样的Pod场景; 比如我们要收集日志到es中 , 我们就可以使用这种控制器在每个节点上运行一个Pod; DaemonSet控制器和Deployment控制器很类似 , 不同的是ds(DaemonSet的简写)控制器不需要我们手动指定其运行的数量 , 它会根据k8s集群节点数量的变化而变化 , 如果新加入一个节点它会自动扩展对应pod数量 , 减少节点时 , 它也不会把之前运行在该节点上的pod调度到其他节点 , 总之一个节点上只能运行同类型Pod1个; 除此之外ds它还支持通过节点选择器来做选择性的调度; 比如 , 在某个拥有对应标签的节点就运行对应pod , 没有就不运行; 其他的更新操作和deployment差不多;
1.1 创建DaemonSet控制器
示例: 创建DaemonSet控制器
root@k8s-master01:/opt/k8s-data/yaml/daemonset# cat ds-demo-nginx-1.14.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-demo
namespace: default
spec:
selector:
matchLabels:
app: ngx-ds
template:
metadata:
labels:
app: ngx-ds
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80
minReadySeconds: 5对于ds控制器来说 , 它在spec中最主要定义选择器和pod模板 , 这个定义和deploy控制器一样 ; 上述配置文件主要使用ds控制器运行一个nginx pod , 其标签名为ngx-ds ;
应用配置清单
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl apply -f ds-demo-nginx-1.14.yaml
daemonset.apps/ds-demo created
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds-demo 6 6 4 6 3 <none> 17s nginx nginx:1.14-alpine app=ngx-ds
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds-demo 6 6 6 6 6 <none> 36s nginx nginx:1.14-alpine app=ngx-ds
可以看到我们并没有指定pod数量 , 对应控制器它会根据节点数量在每个node节点上创建pod ;
验证 : 查看pod情况 , 看看是不是每个节点都被调度运行了一个pod
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get pods
NAME READY STATUS RESTARTS AGE
ds-demo-62274 1/1 Running 0 2m35s
ds-demo-hqxk8 1/1 Running 0 2m35s
ds-demo-tr4zq 1/1 Running 0 2m35s
ds-demo-xl7sf 1/1 Running 0 2m35s
ds-demo-xp68v 1/1 Running 0 2m35s
ds-demo-zd8gk 1/1 Running 0 2m35s
可以看到对应pod在每个node节点都仅跑了一个pod ;
定义节点选择器, nodeSelector选择节点
root@k8s-master01:/opt/k8s-data/yaml/daemonset# cat ds-demo-nginx-1.14.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-demo
namespace: default
spec:
selector:
matchLabels:
app: ngx-ds
template:
metadata:
labels:
app: ngx-ds
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- name: http
containerPort: 80
nodeSelector:
app: nginx-1.14-alpine
minReadySeconds: 5定义节点选择器需要在pod模板中的spec字段下使用nodeSelector字段来定义 , 这个字段的值为一个字典 ; 以上配置定义了只有节点标签为app=nginx-1.14-alpine才会在对应节点上创建pod , 否则就不予创建 ;
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds-demo 6 6 6 6 6 <none> 6m16s
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl apply -f ./
daemonset.apps/ds-demo configured
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds-demo 0 0 0 0 0 app=nginx-1.14-alpine 8m22s
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get pods
No resources found in default namespace.可以看到加上了节点选择器以后 , 对应pod都被删除了 , 原因是在k8s节点上没有任何一个节点拥有对应节点选择器中的标签 , 所以都不满足调度条件 , 当然对应pod就被控制器删除了 ;
测试: 给node01.cbear.top节点添加一个节点标签 , 其名为app=nginx-1.14-alpine , 看看对应节点是否会创建pod
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl label node k8s-node01.cbear.top app=nginx-1.14-alpine
node/k8s-node01.cbear.top labeled
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds-demo 1 1 1 1 1 app=nginx-1.14-alpine 12m nginx nginx:1.14-alpine app=ngx-ds
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get pods
NAME READY STATUS RESTARTS AGE
ds-demo-6xm4r 1/1 Running 0 12s
可以看到只要k8snode节点拥有对应node选择器匹配的标签时 , 对应pod就会精准调度到对应节点上运行 ;
删除节点选择器 , 应用资源配置清单 , 然后再新加一个节点 , 新加的节点会自动创建对应pod
1.2 更新pod版本
1.2.1 通过yaml更新pod
root@k8s-master01:/opt/k8s-data/yaml/daemonset# cat ds-demo-nginx-1.14.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-demo
namespace: default
spec:
selector:
matchLabels:
app: ngx-ds
template:
metadata:
labels:
app: ngx-ds
spec:
containers:
- name: nginx
image: nginx:1.16-alpine
ports:
- name: http
containerPort: 80
minReadySeconds: 5
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl apply -f ./
daemonset.apps/ds-demo configured
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds-demo 6 6 6 6 6 <none> 9h nginx nginx:1.16-alpine app=ngx-ds
可以看到我们修改了pod模板中镜像的版本 , 应用以后 , 对应pod会一一更新;
查看ds详细信息
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl describe ds ds-demo
Name: ds-demo
Selector: app=ngx-ds
Node-Selector: <none>
Labels: <none>
Annotations: deprecated.daemonset.template.generation: 3
Desired Number of Nodes Scheduled: 6
Current Number of Nodes Scheduled: 6
Number of Nodes Scheduled with Up-to-date Pods: 6
Number of Nodes Scheduled with Available Pods: 6
Number of Nodes Misscheduled: 0
Pods Status: 6 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=ngx-ds
Containers:
nginx:
Image: nginx:1.16-alpine
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m11s daemonset-controller Created pod: ds-demo-5cssr
Normal SuccessfulCreate 2m11s daemonset-controller Created pod: ds-demo-tst4g
Normal SuccessfulCreate 2m10s daemonset-controller Created pod: ds-demo-phrwn
Normal SuccessfulCreate 2m10s daemonset-controller Created pod: ds-demo-qffbl
Normal SuccessfulCreate 2m10s daemonset-controller Created pod: ds-demo-b5nfw
Normal SuccessfulDelete 97s daemonset-controller Deleted pod: ds-demo-6xm4r
Normal SuccessfulCreate 97s daemonset-controller Created pod: ds-demo-5gl4r
1.2.2 使用命令更新pod
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl set image ds ds-demo nginx=nginx:1.18-alpine --record
Flag --record has been deprecated, --record will be removed in the future
daemonset.apps/ds-demo image updated
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds-demo 6 6 5 3 5 <none> 9h nginx nginx:1.18-alpine app=ngx-ds
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl rollout status ds ds-demo
Waiting for daemon set "ds-demo" rollout to finish: 4 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 4 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 4 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 5 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 5 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 5 out of 6 new pods have been updated...
Waiting for daemon set "ds-demo" rollout to finish: 5 of 6 updated pods are available...
Waiting for daemon set "ds-demo" rollout to finish: 5 of 6 updated pods are available...
daemon set "ds-demo" successfully rolled out
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-demo-76pch 1/1 Running 0 3m21s 172.20.4.92 k8s-node02.cbear.top <none> <none>
ds-demo-7rlbr 1/1 Running 0 2m55s 172.20.1.4 k8s-master01.cbear.top <none> <none>
ds-demo-9kcmj 1/1 Running 0 2m28s 172.20.0.4 k8s-master03.cbear.top <none> <none>
ds-demo-p86xs 1/1 Running 0 3m14s 172.20.3.117 k8s-node01.cbear.top <none> <none>
ds-demo-rb4nf 1/1 Running 0 2m1s 172.20.5.77 k8s-node03.cbear.top <none> <none>
ds-demo-spfk7 1/1 Running 0 3m7s 172.20.2.4 k8s-master02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl describe pod/ds-demo-76pch | grep -i image
Image: nginx:1.18-alpine
Image ID: docker.io/library/nginx@sha256:93baf2ec1bfefd04d29eb070900dd5d79b0f79863653453397e55a5b663a6cb1
Normal Pulled 3m59s kubelet Container image "nginx:1.18-alpine" already present on machine默认更新策略是删除一个pod , 然后再新建一个pod ;
定义更新策略
root@k8s-master01:/opt/k8s-data/yaml/daemonset# cat ds-demo-nginx-1.14.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-demo
namespace: default
spec:
selector:
matchLabels:
app: ngx-ds
template:
metadata:
labels:
app: ngx-ds
spec:
containers:
- name: nginx
image: nginx:1.16-alpine
ports:
- name: http
containerPort: 80
minReadySeconds: 5
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2定义ds的更新策略需要在spec字段下使用updateStrategy字段 , 该字段的值为一个对象 , 其中type是更新类型 , 该类型有两个值 , 一个是OnDelete , 一个是RollingUpdate ; rollingUpdate字段用于指定更新策略 , 只有当type的值为RollingUpdate时 , 定义rollingUpdate字段才有意义 , 其中maxUnavaiable是用来定义一次删除几个pod(最大允许不可用的pod数量) ; ds更新只能先删除再创建 , 不能先创建再删除 , 因为它只允许一个node上运行一个pod , 所以只有删除pod后再创建 ; 默认情况是删除一个 , 新建一个 ; 上述配置定义更新策略为一次删除两个 ;
应用配置 , 查看更新过程
root@k8s-master01:/opt/k8s-data/yaml/daemonset# kubectl apply -f ds-demo-nginx-1.14.yaml && kubectl get pods -w
daemonset.apps/ds-demo configured
NAME READY STATUS RESTARTS AGE
ds-demo-76pch 1/1 Running 0 10m
ds-demo-7rlbr 1/1 Running 0 10m
ds-demo-9kcmj 1/1 Running 0 9m52s
ds-demo-p86xs 1/1 Terminating 0 10m
ds-demo-rb4nf 1/1 Running 0 9m25s
ds-demo-spfk7 1/1 Terminating 0 10m
ds-demo-spfk7 0/1 Terminating 0 10m
ds-demo-tm9zh 0/1 Pending 0 0s
ds-demo-tm9zh 0/1 Pending 0 0s
ds-demo-p86xs 0/1 Terminating 0 10m
ds-demo-zkpj4 0/1 Pending 0 0s
ds-demo-tm9zh 0/1 ContainerCreating 0 0s
ds-demo-zkpj4 0/1 Pending 0 0s
ds-demo-zkpj4 0/1 ContainerCreating 0 0s
ds-demo-spfk7 0/1 Terminating 0 10m
ds-demo-spfk7 0/1 Terminating 0 10m
ds-demo-spfk7 0/1 Terminating 0 10m
ds-demo-p86xs 0/1 Terminating 0 10m
ds-demo-p86xs 0/1 Terminating 0 10m
ds-demo-p86xs 0/1 Terminating 0 10m
ds-demo-tm9zh 1/1 Running 0 1s
ds-demo-zkpj4 1/1 Running 0 2s
ds-demo-7rlbr 1/1 Terminating 0 10m
ds-demo-7rlbr 0/1 Terminating 0 10m
ds-demo-zkmfq 0/1 Pending 0 0s
ds-demo-zkmfq 0/1 Pending 0 0s
ds-demo-rb4nf 1/1 Terminating 0 9m32s
ds-demo-zkmfq 0/1 ContainerCreating 0 0s
ds-demo-7rlbr 0/1 Terminating 0 10m
ds-demo-7rlbr 0/1 Terminating 0 10m
ds-demo-7rlbr 0/1 Terminating 0 10m
ds-demo-rb4nf 0/1 Terminating 0 9m32s
ds-demo-mfpk5 0/1 Pending 0 0s
ds-demo-mfpk5 0/1 Pending 0 0s
ds-demo-mfpk5 0/1 ContainerCreating 0 0s
ds-demo-mfpk5 1/1 Running 0 1s
ds-demo-rb4nf 0/1 Terminating 0 9m33s
ds-demo-rb4nf 0/1 Terminating 0 9m33s
ds-demo-rb4nf 0/1 Terminating 0 9m33s
ds-demo-zkmfq 1/1 Running 0 1s
ds-demo-9kcmj 1/1 Terminating 0 10m
ds-demo-76pch 1/1 Terminating 0 11m
ds-demo-76pch 0/1 Terminating 0 11m
ds-demo-snglx 0/1 Pending 0 0s
ds-demo-snglx 0/1 Pending 0 0s
ds-demo-9kcmj 0/1 Terminating 0 10m
ds-demo-zvp97 0/1 Pending 0 0s
ds-demo-snglx 0/1 ContainerCreating 0 0s
ds-demo-zvp97 0/1 Pending 0 0s
ds-demo-zvp97 0/1 ContainerCreating 0 0s
ds-demo-9kcmj 0/1 Terminating 0 10m
ds-demo-9kcmj 0/1 Terminating 0 10m
ds-demo-9kcmj 0/1 Terminating 0 10m
ds-demo-76pch 0/1 Terminating 0 11m
ds-demo-76pch 0/1 Terminating 0 11m
ds-demo-76pch 0/1 Terminating 0 11m
ds-demo-zvp97 1/1 Running 0 1s
ds-demo-snglx 1/1 Running 0 1s可以看到现在更新pod版本就是一次删除两个pod , 然后新建两个pod ;
2. Job控制器
2.1 Job控制器基础
job控制器主要作用是用来运行一个或多个pod来执行任务 , 当任务执行完成后 , 自动退出 , 如果在执行任务过程中pod故障了 , job控制器会根据重启策略将其进行重启 , 直到任务完成pod正常退出 ; 如果重启策略为Never , 则pod异常后将不再重启 , 它会重新创建一个新pod再次执行任务 , 最后直到任务完成正常退出 ;
Job控制器pod状态

上图主要描述了对于job控制器创建的pod的状态 , 正常情况pod执行完任务正常退出 , 其状态为completed ; 如果pod非正常退出(即退出码非0) , 并且重启策略为never , 表示不重启pod , 此时pod的状态就为Failure 。虽然不重启pod , 但是对应的任务还是在 , 所以重启策略为never时 , pod非正常退出 , job控制器会重新创建一个pod再次执行任务。如果pod非正常退出且重启策略为OnFailure时 , pod会被重启 , 然后再次执行任务 , 直到最后任务执行完成pod正常退出 , 此时pod的状态为completed;
任务作业方式
串行作业

串行作业一次只有一个
pod被创建 , 只有当pod任务执行完成后 , 第二个pod才会被创建 ;并行作业

并行作业可以并行启动多个
pod同时作业 ;
2.2 定义job控制器
示例: 定义job控制器
root@k8s-master01:/opt/k8s-data/yaml/job# cat job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
labels:
app: myjob
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never创建job控制最主要是定义对应pod模板 ; 定义方式和pod其他控制器定义方式相同 ; 在spec字段下使用template指定来定义pod模板 ;
应用配置清单
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl apply -f job-demo.yaml
job.batch/job-demo created
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get jobs -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job-demo 0/1 7s 7s myjob alpine batch.kubernetes.io/controller-uid=588607c7-53e6-4caa-937e-8dbf6290b3d4
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods
NAME READY STATUS RESTARTS AGE
ds-demo-mfpk5 1/1 Running 0 61m
ds-demo-snglx 1/1 Running 0 61m
ds-demo-tm9zh 1/1 Running 0 61m
ds-demo-zkmfq 1/1 Running 0 61m
ds-demo-zkpj4 1/1 Running 0 61m
ds-demo-zvp97 1/1 Running 0 61m
job-demo-v57hg 0/1 ContainerCreating 0 19s
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pod
NAME READY STATUS RESTARTS AGE
ds-demo-mfpk5 1/1 Running 0 61m
ds-demo-snglx 1/1 Running 0 61m
ds-demo-tm9zh 1/1 Running 0 61m
ds-demo-zkmfq 1/1 Running 0 61m
ds-demo-zkpj4 1/1 Running 0 61m
ds-demo-zvp97 1/1 Running 0 61m
job-demo-v57hg 1/1 Running 0 38s
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pod
NAME READY STATUS RESTARTS AGE
ds-demo-mfpk5 1/1 Running 0 61m
ds-demo-snglx 1/1 Running 0 61m
ds-demo-tm9zh 1/1 Running 0 61m
ds-demo-zkmfq 1/1 Running 0 61m
ds-demo-zkpj4 1/1 Running 0 61m
ds-demo-zvp97 1/1 Running 0 61m
job-demo-v57hg 0/1 Completed 0 39s可以看到创建job控制后 , 对应启动pod执行完任务后就正常退出 , 此时pod的状态为completed ;
2.3 定义并行job控制器
定义并行job控制器
apiVersion: batch/v1
kind: Job
metadata:
name: job-multi-demo
spec:
completions: 6
template:
metadata:
labels:
app: myjob
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never定义多路并行pod需要在spec字段下使用completions来指定执行任务需要的对应pod的数量 ; 以上配置表示job-multi-demo这个job控制器执行任务需要启动6个pod ;
应用配置清单
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl apply -f job-multi.yaml
job.batch/job-multi-demo created
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get jobs -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
job-multi-demo 0/6 20s 20s myjob alpine batch.kubernetes.io/controller-uid=a22e9592-3d21-4107-b442-b90e96a55bc6
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo-64xfq 1/1 Running 0 29s 172.20.5.80 k8s-node03.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo-64xfq 0/1 Completed 0 62s 172.20.5.80 k8s-node03.cbear.top <none> <none>
job-multi-demo-lmb92 1/1 Running 0 23s 172.20.5.81 k8s-node03.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo-2kmtw 0/1 Completed 0 105s 172.20.4.94 k8s-node02.cbear.top <none> <none>
job-multi-demo-64xfq 0/1 Completed 0 3m27s 172.20.5.80 k8s-node03.cbear.top <none> <none>
job-multi-demo-6n9rg 0/1 Completed 0 2m19s 172.20.3.119 k8s-node01.cbear.top <none> <none>
job-multi-demo-9f6n8 0/1 Completed 0 70s 172.20.3.120 k8s-node01.cbear.top <none> <none>
job-multi-demo-bjw2z 0/1 Completed 0 41s 172.20.3.121 k8s-node01.cbear.top <none> <none>
job-multi-demo-lmb92 0/1 Completed 0 2m48s 172.20.5.81 k8s-node03.cbear.top <none> <none>默认情况没有指定并行度 , 其并行度为1,即pod和pod之间就是串行执行任务 ;
2.2 定义并行度
root@k8s-master01:/opt/k8s-data/yaml/job# cat job-multi.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-multi-demo2
spec:
completions: 6
parallelism: 2
template:
metadata:
labels:
app: myjob
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never定义并行度需要在spec字段下使用parallelism字段来指定 , 所谓并行度指一次并行运行几个pod , 上述配置表示一次运行2个pod ; 即2个pod同时作业 ;
应用配置清单
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl apply -f job-multi.yaml
job.batch/job-multi-demo2 created
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get job
NAME COMPLETIONS DURATION AGE
job-multi-demo2 0/6 9s 9s
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-8bv9z 0/1 ContainerCreating 0 16s <none> k8s-node01.cbear.top <none> <none>
job-multi-demo2-q2nhf 0/1 ContainerCreating 0 16s <none> k8s-node02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-8bv9z 1/1 Running 0 20s 172.20.3.122 k8s-node01.cbear.top <none> <none>
job-multi-demo2-q2nhf 1/1 Running 0 20s 172.20.4.95 k8s-node02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-22l9h 0/1 ContainerCreating 0 2s <none> k8s-node02.cbear.top <none> <none>
job-multi-demo2-8bv9z 0/1 Completed 0 30s 172.20.3.122 k8s-node01.cbear.top <none> <none>
job-multi-demo2-j4rdk 0/1 ContainerCreating 0 2s <none> k8s-node03.cbear.top <none> <none>
job-multi-demo2-q2nhf 0/1 Completed 0 30s 172.20.4.95 k8s-node02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-22l9h 1/1 Running 0 18s 172.20.4.96 k8s-node02.cbear.top <none> <none>
job-multi-demo2-8bv9z 0/1 Completed 0 46s 172.20.3.122 k8s-node01.cbear.top <none> <none>
job-multi-demo2-j4rdk 1/1 Running 0 18s 172.20.5.82 k8s-node03.cbear.top <none> <none>
job-multi-demo2-q2nhf 0/1 Completed 0 46s 172.20.4.95 k8s-node02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-22l9h 0/1 Completed 0 39s 172.20.4.96 k8s-node02.cbear.top <none> <none>
job-multi-demo2-8bv9z 0/1 Completed 0 67s 172.20.3.122 k8s-node01.cbear.top <none> <none>
job-multi-demo2-j4rdk 0/1 Completed 0 39s 172.20.5.82 k8s-node03.cbear.top <none> <none>
job-multi-demo2-kjj7x 0/1 ContainerCreating 0 10s <none> k8s-node01.cbear.top <none> <none>
job-multi-demo2-q2nhf 0/1 Completed 0 67s 172.20.4.95 k8s-node02.cbear.top <none> <none>
job-multi-demo2-z4blx 0/1 ContainerCreating 0 10s <none> k8s-node03.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
job-multi-demo2-22l9h 0/1 Completed 0 3m52s 172.20.4.96 k8s-node02.cbear.top <none> <none>
job-multi-demo2-8bv9z 0/1 Completed 0 4m20s 172.20.3.122 k8s-node01.cbear.top <none> <none>
job-multi-demo2-j4rdk 0/1 Completed 0 3m52s 172.20.5.82 k8s-node03.cbear.top <none> <none>
job-multi-demo2-kjj7x 0/1 Completed 0 3m23s 172.20.3.123 k8s-node01.cbear.top <none> <none>
job-multi-demo2-q2nhf 0/1 Completed 0 4m20s 172.20.4.95 k8s-node02.cbear.top <none> <none>
job-multi-demo2-z4blx 0/1 Completed 0 3m23s 172.20.5.83 k8s-node03.cbear.top <none> <none>可以看到现在pod就一次运行两个 ;
3. CronJob控制器
这种类型的控制器主要用来创建周期性任务pod ;
示例: 定义CronJob控制器
root@k8s-master01:/opt/k8s-data/yaml/job# cat cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
labels:
app: mycronjob
spec:
schedule: "*/2 * * * *"
jobTemplate:
metadata:
labels:
app: mycronjob-jobs
spec:
parallelism: 2
template:
spec:
containers:
- name: myjob
image: alpine
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster; sleep 10
restartPolicy: OnFailure定义cronjob控制器 , 最主要是定义job模板 ; 其实cronjob控制器是通过job控制器来管理pod , 这个逻辑有点类似deploy控制器通过rs来控制pod ; 其中schedule字段用来指定周期性调度时间策略 , 这个定义和我们在linux上定义周期性任务一样 ; 对于job模板和我们定义job一样 ; 以上配置表示每2分钟执行一次job模板中的定义的job任务 ; 其每次并行运行2个pod ;
执行配置清单
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl apply -f cronjob-demo.yaml
cronjob.batch/cronjob-demo created
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-demo-28626194-7r7xb 0/1 ContainerCreating 0 10s
cronjob-demo-28626194-85dch 0/1 ContainerCreating 0 10s
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get job
NAME COMPLETIONS DURATION AGE
cronjob-demo-28626194 0/1 of 2 25s 25s
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-demo-28626194-7r7xb 0/1 Completed 0 68s
cronjob-demo-28626194-85dch 0/1 Completed 0 68s查看是否创建的有job控制器呢
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cronjob-demo-28626194-7r7xb 0/1 Completed 0 2m13s 172.20.3.124 k8s-node01.cbear.top <none> <none>
cronjob-demo-28626194-85dch 0/1 Completed 0 2m13s 172.20.4.97 k8s-node02.cbear.top <none> <none>
cronjob-demo-28626196-jckkl 0/1 ContainerCreating 0 13s <none> k8s-node03.cbear.top <none> <none>
cronjob-demo-28626196-sm8pk 0/1 ContainerCreating 0 13s <none> k8s-node02.cbear.top <none> <none>
root@k8s-master01:/opt/k8s-data/yaml/job# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
cronjob-demo-28626194 2/1 of 2 28s 2m16s myjob alpine batch.kubernetes.io/controller-uid=ee81edbf-a6af-4985-bda8-03b91226580d
cronjob-demo-28626196 0/1 of 2 16s 16s myjob alpine batch.kubernetes.io/controller-uid=b5cfdbae-748b-44a0-a52c-04c3ee4ccf27有两个job控制器 , 名字都一样 ; 从上面显示的结果 , 不难理解 , cronjob每执行一次 , 它都会调用对应的job控制来创建新pod ;