k8s | 深入理解 DaemonSet
DaemonSet是一种控制器,用于在集群内运行一组Pod,并确保每个节点上都有一个Pod副本在运行。常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
- 日志收集,比如 fluentd,Filebeat等,收集所有节点的日志数据
- 系统监控,比如 Prometheus Node Exporter,collectd,cAdvisor 等,集所有节点的运行状态数据
- 系统程序,比如 kube-proxy, kube-dns, glusterd, ceph 等
DaemonSet适用于需要在每个节点上运行一组Pod的场景,可以使集群中的服务更加健壮和可靠。
工作原理
DaemonSet的工作原理是监听节点的变化,通过监听节点的变化,当新的节点加入集群时,DaemonSet会自动在该节点上创建一个Pod副本。而当节点从集群中删除时,DaemonSet会自动删除该节点上的Pod副本。这样,DaemonSet保证了集群中每个节点都会运行指定的Pod。有且只有一个pod
-
控制器监视节点的状态:DaemonSet控制器会监视集群中的节点状态,一旦有新的节点加入集群,或者节点状态发生变化(例如节点重新启动),控制器就会触发一些操作。
-
创建Pod:当控制器检测到新节点时,它会创建一个新的Pod,并将其调度到该节点上。控制器还会确保每个节点上只运行一个Pod实例。
-
更新Pod:如果DaemonSet的配置发生变化,控制器会自动更新每个节点上的Pod实例。
-
删除Pod:如果节点发生故障或者被删除,控制器会自动删除节点上的Pod实例。
-
扩容和缩容:DaemonSet还支持扩容和缩容,可以根据需要增加或减少Pod的数量。
常用特性
-
只在特定的节点上运行Pod:可以使用NodeSelector或者NodeAffinity来限制DaemonSet的Pod只在特定的节点上运行。
-
根据节点的标签更新Pod:如果在集群中添加或删除了节点,Kubernetes会通过DaemonSet自动添加或删除Pod。同时,也可以通过添加或移除节点标签来更新DaemonSet中的Pod。
-
确保每个节点只运行一个Pod:可以使用PodAntiAffinity来确保每个节点上只有一个Pod在运行。
指定 Node 节点
- nodeSelector:只调度到匹配指定 label 的 Node 上
- nodeAffinity:功能更丰富的 Node 选择器,比如支持集合操作
- podAffinity:调度到满足条件的 Pod 所在的 Node 上
评论区