1、Daemonset控制器
1.1、DaemonSet概述
DaemonSet控制器能够确保k8s集群所有的节点都运行一个相同的pod副本,当向k8s集群中增加node节点时,这个node节点也会自动创建一个pod副本,当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它们创建的pod
1.2、DaemonSet工作原理:如何管理Pod?
daemonset的控制器会监听kuberntes的daemonset对象、pod对象、node对象,这些被监听的对象之变动,就会触发syncLoop循环让kubernetes集群朝着daemonset对象描述的状态进行演进。
1.3、Daemonset vs Deployment
核心区别一句话:DaemonSet 是"节点维度"的控制器,保证每个符合条件的节点跑一个 Pod;Deployment 是"应用副本维度"的控制器,保证集群里有指定数量的 Pod 副本。
| 对比维度 | DaemonSet | Deployment |
|---|---|---|
| 核心目标 | 让每个符合条件的节点运行一个 Pod 副本,通常用于节点级守护进程 | 维持指定数量的 Pod 副本,通常用于无状态应用部署 |
| 副本数量来源 | 由节点数量、nodeSelector、affinity、tolerations 决定,没有 spec.replicas |
由 spec.replicas 决定,可被 HPA 调整 |
| Pod 分布 | 默认每个节点最多一个;新节点加入后自动补一个 Pod | 调度到任意合适节点,同一节点可运行多个 Pod,不保证每节点一个 |
| 节点增减行为 | 新节点加入会自动创建 Pod;节点移除后对应 Pod 也会删除 | 节点增减不会直接改变副本数;节点故障时会在其他健康节点重建 Pod |
| 扩缩容方式 | 通过节点选择器、污点容忍控制运行范围,不按副本数扩缩 | 通过 replicas、HPA、VPA 等方式扩缩 |
| 调度特点 | 为匹配节点创建并绑定 Pod,常带 nodeAffinity;要跑在控制面等污点节点需加 tolerations | 由调度器根据资源、亲和性、污点等选择节点 |
| 更新策略 | 支持 RollingUpdate、OnDelete,通常按节点分批更新 |
支持 RollingUpdate、Recreate,基于 ReplicaSet,支持 maxSurge/maxUnavailable |
| 回滚能力 | 有基本 rollout 历史和回滚,但通常不如 Deployment 常用和灵活 | 版本历史、暂停、回滚、滚动发布等机制更成熟 |
| 服务暴露 | 常用 hostPort、hostNetwork,或由监控系统按节点发现;一般不需要 Service 做负载均衡 | 通常配合 Service、Ingress、LoadBalancer 暴露服务 |
| 是否适合 HPA | 不适合,因为副本数与节点绑定,不是固定 replicas | 适合,可根据 CPU、内存、自定义指标自动扩缩 |
| 资源开销 | 每个节点都有一份,节点越多总资源开销越大 | 只按副本数占用资源,与节点总数无直接关系 |
| 典型状态 | 节点级、系统级,常需要特权、hostPath、hostNetwork | 应用级,通常无状态 |
| 典型应用场景 | 日志采集:Fluent Bit、Filebeat;监控:node-exporter、Datadog Agent;网络:Calico、Flannel、Cilium、kube-proxy;存储:CSI node plugin;安全:Falco;设备插件:GPU plugin | Web/API、微服务、前端、无状态后端、队列 worker、Ingress Controller 等 |
| 管理对象 | DaemonSet 直接管理 Pod | Deployment 管理 ReplicaSet,ReplicaSet 再管理 Pod |
| 是否适合普通有状态业务 | 不适合,通常只做节点级守护进程 | 通常用于无状态;有状态业务更推荐 StatefulSet |
补充注意:
-
DaemonSet 可以通过
nodeSelector、affinity、tolerations只运行在部分节点上。 -
Deployment 也可以通过
podAntiAffinity近似实现"每节点一个",但语义和管理方式不如 DaemonSet 自然。 -
选择原则:节点级、每节点必须运行、随节点自动扩展 → DaemonSet;应用级、多副本、可扩缩、可滚动更新 → Deployment。
2、部署Daemonset
bash
# 创建daemonset.yaml
vi daemonset.yaml
#填入以下内容
apiVersion: apps/v1 # 指定 Kubernetes API 版本,apps/v1 用于 DaemonSet
kind: DaemonSet # 资源类型为 DaemonSet,每个节点运行一个 Pod
metadata: # 资源元数据
name: fluentd-elasticsearch # DaemonSet 名称
namespace: kube-system # 部署到 kube-system 命名空间
labels: # 资源标签
k8s-app: fluentd-logging # 标签 k8s-app=fluentd-logging
spec: # DaemonSet 规格
selector: # 选择器,用于匹配管理的 Pod
matchLabels: # 标签匹配规则
name: fluentd-elasticsearch # 匹配 name=fluentd-elasticsearch 的 Pod
template: # Pod 模板
metadata: # Pod 模板元数据
labels: # Pod 标签
name: fluentd-elasticsearch # Pod 标签 name=fluentd-elasticsearch
spec: # Pod 规格
tolerations: # 污点容忍配置
- key: node-role.kubernetes.io/master # 容忍 master 节点污点键
effect: NoSchedule # 污点效果为 NoSchedule
containers: # 容器列表
- name: fluentd-elasticsearch # 容器名称
image: docker.apiba.cn/fluentd:latest # 容器镜像
resources: # 资源请求与限制
limits: # 资源上限
memory: 200Mi # 内存上限为 200Mi
requests: # 资源请求
cpu: 100m # CPU 请求为 100m
memory: 200Mi # 内存请求为 200Mi
volumeMounts: # 容器内卷挂载
- name: varlog # 挂载名为 varlog 的卷
mountPath: /var/log # 挂载到容器内 /var/log
- name: varlibdockercontainers # 挂载名为 varlibdockercontainers 的卷
mountPath: /var/lib/docker/containers # 挂载到容器内 /var/lib/docker/containers
readOnly: true # 以只读方式挂载
terminationGracePeriodSeconds: 30 # Pod 终止宽限期为 30 秒
volumes: # Pod 卷定义
- name: varlog # 定义卷 varlog
hostPath: # 使用宿主机路径卷
path: /var/log # 宿主机路径为 /var/log
- name: varlibdockercontainers # 定义卷 varlibdockercontainers
hostPath: # 使用宿主机路径卷
path: /var/lib/docker/containers # 宿主机路径为 /var/lib/docker/containers
bash
# 启动deamonset
kubectl apply -f daemonset.yaml
# 查看ds
kubectl get ds -n kube-system
# 查看pod
kubectl get pods -n kube-system -o wide


3、滚动跟新Daemonset
| 特性 | RollingUpdate (滚动更新) | OnDelete (手动删除) |
|---|---|---|
| 更新触发 | 自动 | 手动 |
| 控制粒度 | 由 maxUnavailable 等参数控制 |
完全由用户决定 |
| 适用场景 | 常规业务更新,追求效率与稳定性 | 关键组件更新,需要人工介入验证 |
| 默认策略 | 是 | 否 |
| 复杂性 | 配置简单,过程自动化 | 需要用户手动介入,过程可控 |
以下是为 DaemonSet 配置 RollingUpdate 策略的 YAML 片段:
bash
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
spec:
# ... 其他配置 ...
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 每次最多更新一个节点上的 Pod
maxSurge: 0 # 不允许超出期望数量的 Pod(在节点上直接替换)
# minReadySeconds: 30 # 可选:新 Pod 需保持就绪 30 秒才被视为可用
template:
# ... Pod 模板定义 ...