K8s DaemonSet 详解
🚀 K8s DaemonSet 详解:最强节点守护神!
在 Kubernetes(K8s)中,大多数 Pod 由 Deployment 或 StatefulSet 进行调度,但有些应用需要每个节点都运行一个 Pod,比如日志收集、监控代理等。这时候,DaemonSet 就是你的最佳选择!
💡 你是否有这些疑问?
✅ 什么是 DaemonSet?它有什么特点?
✅ DaemonSet 适用于哪些场景?
✅ 如何使用 DaemonSet?
🔥 今天,这篇文章带你彻底掌握 K8s DaemonSet!
🎯 什么是 DaemonSet?
DaemonSet 是 Kubernetes 的一种控制器,它确保 每个(或部分)节点都运行一个特定的 Pod。
📌 DaemonSet 适用于以下情况:
- • 系统级守护进程(Daemon):如监控代理、日志收集、网络插件
- • 需要直接访问宿主机的应用:如存储管理、硬件驱动
🔥 一句话总结:DaemonSet 让特定 Pod 在每个节点上自动运行,无需手动管理!
🎯 DaemonSet 适用场景
💡 哪些应用适合使用 DaemonSet?
场景 | 示例 |
---|---|
日志收集 | Fluentd、Filebeat |
监控代理 | Prometheus Node Exporter、Datadog Agent |
安全与网络 | Calico、Cilium(CNI 插件) |
存储管理 | Ceph、GlusterFS、LocalPV |
GPU 监控 | NVIDIA DCGM Exporter |
🔥 DaemonSet 适合所有需要在每个节点上运行的任务!
🎯 DaemonSet vs Deployment:核心区别!
对比项 | DaemonSet | Deployment |
---|---|---|
适用场景 | 需要每个节点运行 Pod | 需要负载均衡和弹性伸缩 |
Pod 运行数量 | 取决于集群节点数(每个节点 1 个) | 取决于replicas 数量 |
Pod 何时创建 | 新节点加入时自动创建 Pod | 由调度器决定 Pod 运行在哪个节点 |
Pod 终止 | 节点删除时,DaemonSet Pod 也会消失 | Pod 可能被调度到其他节点 |
典型应用 | 监控、日志收集、存储管理 | Web 服务、数据库、微服务 |
🔥 总结:
- • 需要在每个节点都运行?👉 选 DaemonSet
- • 需要可扩展的负载均衡?👉 选 Deployment
🎯 DaemonSet 实战:如何创建?
✅ 1️⃣ 创建一个 DaemonSet
📌 下面是一个 Fluentd 日志收集 DaemonSet 的 YAML 配置
apiVersion: apps/v1
kind:DaemonSet
metadata:
name:fluentd
labels:app:fluentd
spec:
selector:matchLabels:app:fluentd
template:metadata:labels:app:fluentdspec:containers:-name:fluentdimage:fluent/fluentd:v1.14volumeMounts:-name:varlogmountPath:/var/logvolumes:-name:varloghostPath:path:/var/log # 访问宿主机日志目录
🔥 注意:
-
- 每个节点都会运行一个 Fluentd 守护进程
-
- Pod 会自动挂载
/var/log
目录,以便收集宿主机日志
- Pod 会自动挂载
-
- 新加入的节点,也会自动运行 Fluentd Pod!
✅ 2️⃣ 查看 DaemonSet 运行情况
kubectl get daemonsets
示例输出:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd 3 3 3 3 3 <none> 10m
💡 “DESIRED” = “CURRENT” = 节点数,说明 DaemonSet 运行正常!
✅ 3️⃣ 只在特定节点运行 DaemonSet
📌 如果你不希望 DaemonSet 在所有节点运行,可以使用 nodeSelector
或 affinity
spec:template:spec:nodeSelector:node-type: log-collector # 只在标签为 log-collector 的节点运行
🔥 打标签后生效
kubectl label nodes worker-node-1 node-type=log-collector
✅ 4️⃣ DaemonSet 滚动更新
💡 DaemonSet 也支持滚动更新!
kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v1.15
📌 更新策略
spec:updateStrategy:type: RollingUpdate # 逐个节点更新
🔥 如果更新失败,如何回滚?
kubectl rollout undo daemonset/fluentd
💡 这样可以恢复到上一个版本!
🎯 DaemonSet 最佳实践!
✅ 1️⃣ 避免占用所有节点资源
📌 使用 nodeSelector
或 taints & tolerations
,只让 DaemonSet 运行在特定节点!
✅ 2️⃣ 配合 HostPath
使用,访问宿主机数据
📌 例如,日志收集器挂载 /var/log
,监控工具挂载 /proc
和 /sys
!
✅ 3️⃣ 使用 RollingUpdate
确保安全更新
📌 逐个节点更新,避免影响整个集群!
✅ 4️⃣ 监控 DaemonSet 运行状态
kubectl get daemonsets -o wide
kubectl describe daemonset fluentd
kubectl logs -l app=fluentd
🎯 总结:DaemonSet 适合哪些情况?
🔥 你应该在这些情况下使用 DaemonSet:
✅ 日志收集(Fluentd、Filebeat)
✅ 监控代理(Node Exporter、Datadog)
✅ 存储管理(Ceph、LocalPV)
✅ 网络插件(Calico、Cilium)
✅ GPU 监控(NVIDIA DCGM)
💡 如果你的 Pod 需要每个节点都运行,DaemonSet 就是最好的选择!