作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。
公众号:网络豆云计算学堂
座右铭:低头赶路,敬事如仪
技术社区:云计算运维学习社区
个人主页: 网络豆的主页
目录
前言
如果你用过Kubernetes,可能听说过Deployment、StatefulSet,但DaemonSet这个“低调”的控制器,却常被新手忽略。
它像“保安”一样默默守护每个节点,确保关键服务无处不在——比如日志收集、节点监控。本文用大白话+实操案例,带你彻底搞懂DaemonSet!
一.什么是DaemonSet?
一句话总结:DaemonSet确保集群中每个符合条件的节点上都运行一个Pod副本。
-
当新节点加入集群时,DaemonSet自动部署Pod。
-
当节点被删除时,Pod也被回收。
适用场景:
-
日志收集(如Fluentd、Filebeat)
-
节点监控(如Prometheus Node Exporter)
-
网络插件(如Calico、Flannel)
二.典型应用场景与案例
场景1:日志收集(每个节点都需要)
需求:实时收集所有节点的系统日志,并发送到Elasticsearch。
案例:用DaemonSet部署Filebeat
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:8.10.0
volumeMounts:
- name: varlog
mountPath: /var/log # 挂载节点日志目录
volumes:
- name: varlog
hostPath:
path: /var/log # 直接使用宿主机的日志路径
tolerations: # 允许在污点节点上运行
- operator: Exists
场景2:节点监控(监控所有节点资源)
需求:采集每个节点的CPU、内存、磁盘数据。
案例:部署Prometheus Node Exporter
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true # 使用主机网络,直接暴露节点指标
containers:
- name: node-exporter
image: prom/node-exporter:v1.6.0
ports:
- containerPort: 9100
三.常见问题与解决方案
问题1:Pod未均匀分布在所有节点上
表现:部分节点没有生成Pod。
原因:节点可能设置了污点(Taint),或DaemonSet未配置容忍(Toleration)。
解决:在DaemonSet配置中添加tolerations
:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
问题2:DaemonSet的Pod占用资源过高
表现:节点资源被大量占用,影响其他服务。
解决:在Pod模板中配置资源限制:
containers:
- name: my-daemon
image: my-image
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
问题3:Pod无法访问宿主机目录或设备
表现:日志收集失败,提示“权限不足”或“路径不存在”。
解决:通过hostPath
挂载宿主机目录,并配置权限:
volumes:
- name: host-log
hostPath:
path: /var/log
type: Directory # 明确指定类型为目录
四.总结
DaemonSet是Kubernetes中节点级任务的核心解决方案,尤其适合需要“无处不在”的服务。
-
优点:自动扩缩容、与节点生命周期绑定。
-
避坑点:注意污点容忍、资源限制、目录挂载权限。
动手建议:尝试用DaemonSet部署一个日志收集器,观察节点变化,体验其自动化能力!
关注我,获取更多Kubernetes运维实战技巧!
遇到问题? 评论区留言,我会一一解答!