DaemonSet介绍
DaemonSet概述
DaemonSet确保全部node上运行一个Pod的副本。当有node节点加入集群时,也会为他们新增一个Pod 。当有node节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。在每一个node节点上只调度一个Pod,因此无需指定replicas的个数,比如:在每个node上都运行一个日志采集程序,负责收集node节点本身和node节点之上的各个Pod所产生的日志,在每个node上都运行一个性能监控程序,采集该node的运行性能数据。
DaemonSet应用场景
-
在集群的每个节点上运行存储,比如:glusterd、ceph。
-
在每个节点上运行日志收集组件,比如:flunentd 、logstash、filebeat等。
- 在每个节点上运行监控组件,比如:Prometheus。
DaemonSet和Deployment区别
DaemonSet默认会在每个节点上运行有且只有一个pod(不考虑调度策略的情况下)。而Deployment可以在每个节点运行0到多个pod。
DaemonSet应用实践
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
app: nginx-ds
spec:
template:
metadata:
name: nginx-pod
labels:
app: nginx-pod
spec:
containers:
- name: nginx-c
image: nginx:1.21.5
imagePullPolicy: IfNotPresent
restartPolicy: Always
selector:
matchLabels:
app: nginx-pod
运行DaemonSet并查看pod信息
kubectl apply -f daemonset.yaml
#查看pod信息,发现只有master节点不会创建
kubectl get pod -o wide
通过运行上面的DaemonSet资源文件,发现在所有工作节点都创建了pod,但是master节点没有,因为master节点默认设置了污点,不允许pod调度到该节点,如果业务需要在master节点部署pod的话(例如像监控信息),那么需要修改DaemonSet的资源文件,添加污点容忍度,修改如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-ds
labels:
app: nginx-ds
spec:
template:
metadata:
name: nginx-pod
labels:
app: nginx-pod
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: nginx-c
image: nginx:1.21.5
imagePullPolicy: IfNotPresent
restartPolicy: Always
selector:
matchLabels:
app: nginx-pod
再次运行发现在master节点也创建了pod,这样所有节点都运行了一个pod。如果我们删除某个节点的pod,会马上在该节点创建一个新的pod,以保证每个节点都运行一个pod。
DaemonSet滚动更新
DaemonSet有两种更新策略类型:
-
OnDelete:这是向后兼容性的默认更新策略。使用OnDelete更新策略,在更新DaemonSet模板后,只有在手动删除旧的DaemonSet pod时才会创建新的DaemonSet pod。这与Kubernetes1.5或更早版本中DaemonSet的行为相同。
- RollingUpdate:使用RollingUpdate更新策略,在更新DaemonSet模板后,旧的DaemonSet pod将被终止,并且将以受控方式自动创建新的DaemonSet pod;默认类型是RollingUpdate。
kubectl edit ds nginx-ds
编辑DaemonSet,修改镜像版本,保存退出,这时各节点的pod将会自动更新成新的镜像。
DaemonSet版本回滚
更新之后,查看更新记录
kubectl rollout history ds nginx-ds
REVISION CHANGE-CAUSE
1 <none>
2 <none>
根据版本号可以回滚到指定版本:
#根据版本号查看版本的内容
kubectl rollout history ds nginx-ds --revision=1
kubectl rollout history ds nginx-ds --revision=2
#根据版本号回滚到指定版本
kubectl rollout undo ds nginx-ds --to-revision=1