K8s DaemonSet 详解

🚀 K8s DaemonSet 详解:最强节点守护神!

在 Kubernetes(K8s)中,大多数 Pod 由 DeploymentStatefulSet 进行调度,但有些应用需要每个节点都运行一个 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:fluentd
    spec:
      containers:
        -name:fluentd
          image:fluent/fluentd:v1.14
          volumeMounts:
            -name:varlog
              mountPath:/var/log
      volumes:
        -name:varlog
          hostPath:
            path:/var/log  # 访问宿主机日志目录

🔥 注意:

    1. 每个节点都会运行一个 Fluentd 守护进程
    1. Pod 会自动挂载 /var/log 目录,以便收集宿主机日志
    1. 新加入的节点,也会自动运行 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 在所有节点运行,可以使用 nodeSelectoraffinity

复制代码
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️⃣ 避免占用所有节点资源

📌 使用 nodeSelectortaints & 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 就是最好的选择!

相关推荐
阿里云云原生41 分钟前
金蝶云•星辰基于 SLS 构建稳定高效可观测系统
云原生
Rookie小强2 小时前
ZooKeeper和Reids做分布式锁的区别?
分布式·zookeeper·云原生
斯普信专业组2 小时前
zookeeper因jute.maxbuffer启动异常问题排查处理
分布式·zookeeper·云原生
z涛.4 小时前
Docker容器
运维·docker·容器
long3167 小时前
使用docker compose 部署dockge
运维·docker·容器
豆豆の爸爸12 小时前
苹果容器Apple container是做什么用的?
docker·容器
koboides15 小时前
04-Docker的架构介绍及部署实战
docker·容器·架构
MANONGMN16 小时前
【走进Docker的世界】Docker的发展历程
运维·docker·容器
DogDaoDao16 小时前
WebAssembly技术详解:从浏览器到云原生的高性能革命
云原生·音视频·编译·wasm·webassembly·流媒体·多媒体