介绍了DaemonSet与Job,这是和Deployment有所区别的Pod控制器,本章节我们将掌握这几种对象的特性和使用方式。
描述DaemonSet特性和使用方式
区分Job和CronJob
使用Job和CronJob
- DaemonSet
- Job
- CronJob
1. DaemonSet
1.1 Kube-proxy的特殊性
- 在Kubernetes组件章节中,我们介绍了kube-proxy组件,它被封装在pod中,并且时刻运行在每个Node节点中。
-
Replicaset侧重保证pod数量的恒定,那该如何实现kube-proxy类应用的调度?
通过DaemonSet实现在每一个节点的部署
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-proxy-bcc2z 1/1 Running 28 27d 192.168.227.10 k8s-master <none> <none>
kube-proxy-c7kf4 1/1 Running 15 27d 192.168.227.11 k8s-node1 <none> <none>
kube-proxy-qpttz 1/1 Running 17 27d 192.168.227.12 k8s-node2 <none> <none>
1.2 DaemonSet的特性
- DaemonSet 部署的副本Pod会分布在各个Node上。当有 Node 加入集群时,也会为他们新增一个 Pod。当有 Node 从集群移除时,这些 Pod 也会被回收。删除DaemonSet 将会删除它创建的所有 Pod。
- DaemonSet典型场景:
在集群的每个节点上运行存储Daemon,如glusterd,ceph。
在每个节点上运行日志收集Daemon,如flunentd或logstash。
在每个节点上运行监控Daemon,如Prometheus Node Exporter。
1.3 创建DaemonSet
- 创 建 DaemonSet 的 yaml 文 件 和 创 建deployment使用的类似。
- 类型(kind)选择DaemonSet。
- DaemonSet的yaml文件不需要副本数量项。
- 默认情况下 , DaemonSet 会 在 所 有Node上创建Pod。
[root@k8s-master tmp]# cat /tmp/daemoset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
[root@k8s-master tmp]# k apply -f /tmp/daemoset.yaml
daemonset.apps/nginx-daemonset created
[root@k8s-master tmp]# k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-daemonset-966k2 1/1 Running 0 59s 10.244.1.42 k8s-node1 <none> <none>
nginx-daemonset-q6vh2 1/1 Running 0 59s 10.244.2.54 k8s-node2 <none> <none>
业务容器不会运行在master节点
系统pod中有kube-Proxy 和 kube-flannel采用的daemonset模式进行部署
[root@k8s-master tmp]# k get daemonsets. -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-flannel-ds-amd64 3 3 3 3 3 beta.kubernetes.io/arch=amd64 27d
kube-flannel-ds-arm 0 0 0 0 0 beta.kubernetes.io/arch=arm 27d
kube-flannel-ds-arm64 0 0 0 0 0 beta.kubernetes.io/arch=arm64 27d
kube-flannel-ds-ppc64le 0 0 0 0 0 beta.kubernetes.io/arch=ppc64le 27d
kube-flannel-ds-s390x 0 0 0 0 0 beta.kubernetes.io/arch=s390x 27d
kube-proxy 3 3 3 3 3 <none> 27d
注意 daemonset的操作与deployment的操作一致,可以进行版本升级和回滚
1.4 DaemonSet查看
- 创建完成后,可以在Node1和Node2上分别看到一个pod。
- 如将其中一个pod强制删除,daemonset会自动启动一个新的pod
- 当kubernetes集群出现节点故障时,daemonset中的pod数量会减少,不会像deployment一样将受到影响的pod在其他节点启动
2. job
2.1 一次性任务场景
- 通过Deployment我们可以部署常驻型应用,它可以保证pod数量保证应用的实时可用,也可以通过灵活的扩缩容让业务处于最佳状态。
- 通过DaemonSet我们可以部署守护进程,它使得每个node上运行着一个固定pod。
-
应该使用哪种方式解决如下问题?
pod上的任务只执行一次,执行结束后回收pod资源
image.png
2.2 运行一个Job
- 相对于Deployment和DaemonSet通常提供持续的服务,Job执行一次性任务
- 类型(kind)选择Job
- restartPolicy只能选择Never或OnFailure
- backoffLimit:参数指定job失败后进行重试的次数
restartPolicy 还有always选项,表名运行完该pod一直处于运行状态,不会回收。如果只运行一次,只能选择never或者onfailure
[root@k8s-master tmp]# cat /tmp/jobs.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
2.3 查看Job
- 运行job后,查看状态
[root@k8s-master tmp]# k get jobs.batch
NAME COMPLETIONS DURATION AGE
lablepod 1/1 17h 12d
pi 0/1 9s 9s
[root@k8s-master tmp]# k get pod -w
NAME READY STATUS RESTARTS AGE
lablepod-fln79 0/1 Completed 2 12d
myapp-pod 1/1 Running 53 24d
mydep-65bbdb4c9f-bvwmp 1/1 Running 14 25d
mydep-65bbdb4c9f-sswdr 1/1 Running 15 25d
mydep-65bbdb4c9f-swgvz 1/1 Running 14 26d
mypod 0/1 ImagePullBackOff 0 25d
nginx-daemonset-966k2 1/1 Running 0 25m
nginx-daemonset-q6vh2 1/1 Running 0 25m
pi-8ggjj 0/1 ContainerCreating 0 19s
- 过一段时间后继续查看状态,completions状态从“0/1”变为“1/1”,表示任务
已经完成
[root@k8s-master tmp]# k get jobs.batch
NAME COMPLETIONS DURATION AGE
lablepod 1/1 17h 13d
pi 1/1 84s 3h13m
- 查看job使用的pod状态,发现pod已经运行完成并且关闭
[root@k8s-master tmp]# k get pod
NAME READY STATUS RESTARTS AGE
lablepod-fln79 0/1 Completed 2 13d
myapp-pod 1/1 Running 57 25d
mydep-65bbdb4c9f-bvwmp 1/1 Running 14 26d
mydep-65bbdb4c9f-sswdr 1/1 Running 15 26d
mydep-65bbdb4c9f-swgvz 1/1 Running 14 26d
mypod 0/1 ImagePullBackOff 0 25d
nginx-daemonset-966k2 1/1 Running 0 3h39m
nginx-daemonset-q6vh2 1/1 Running 0 3h39m
pi-8ggjj 0/1 Completed 0 3h14m
- 使用kubectl logs命令可以查看该Job运行结果
[root@k8s-master tmp]# k logs pi-8ggjj
3.14159265358979323846264338
3 CronJob
3.1 运行cronjob
- 在日常应用中,有一种常见场景是需要Job在指定时间或周期运行,这种类
型我们称其为Cron Job,主要管理基于时间的Job。
在给定时间点只运行一次
在给定时间点周期性地运行 - 使用配置文件创建Cron Job。
3.2 Schedule参数配置
-
Schedule的格式和linux中crontab命令类似
image.png
- 如果需要在每个小时的第15分钟执行任务
15 * * * *
- 如果需要每15分钟执行一次任务
*/15 * * * *
3.3 示例
[root@k8s-master ~]# cat /tmp/cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
每过1分钟会新建立一个pod
[root@k8s-master ~]# k get pod -w
NAME READY STATUS RESTARTS AGE
lablepod-fln79 0/1 Completed 2 13d
myapp-pod 1/1 Running 60 25d
mydep-65bbdb4c9f-bvwmp 1/1 Running 16 26d
mydep-65bbdb4c9f-sswdr 1/1 Running 17 26d
mydep-65bbdb4c9f-swgvz 1/1 Running 16 26d
mypod 0/1 ImagePullBackOff 0 25d
nginx-daemonset-966k2 1/1 Running 2 20h
nginx-daemonset-q6vh2 1/1 Running 2 20h
pi-8ggjj 0/1 Completed 0 20h
NAME AGE
mypod 25d
mypod 25d
hello-1645667400-mpdz6 0s
hello-1645667400-mpdz6 0s
hello-1645667400-mpdz6 0s
hello-1645667400-mpdz6 2s
hello-1645667460-qxtrm 0s
[root@k8s-master ~]# k logs hello-1645667400-mpdz6
Thu Feb 24 01:50:05 UTC 2022
Hello from the Kubernetes cluster
[root@k8s-master ~]# k logs hello-1645667460-qxtrm
Thu Feb 24 01:51:20 UTC 2022
Hello from the Kubernetes cluster
[root@k8s-master ~]#
时间是以格林尼治时间为准,crontab 时间也是以格林尼治时间为准
[root@k8s-master ~]# timedatectl
Local time: 四 2022-02-24 09:58:21 CST
Universal time: 四 2022-02-24 01:58:21 UTC
RTC time: 四 2022-02-24 01:58:23
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
[root@k8s-master ~]# timedatectl
Local time: 四 2022-02-24 09:58:22 CST
Universal time: 四 2022-02-24 01:58:22 UTC
RTC time: 四 2022-02-24 01:58:23
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

