16、k8s控制器Daemnonset

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 模板定义 ...
相关推荐
深蓝电商API16 小时前
Docker+K8s部署爬虫:从单机到集群的完整路线
爬虫·docker·k8s
运维开发那些事18 小时前
推理集群稳定性最佳实践
k8s·gpu算力
meijinmeng3 天前
将 Kubernetes 部署扩展到多个Region区域:GitOps 参考架构
k8s·cicd
张洛闻Eren3 天前
Ansible【第二课】:实施 Ansible Playbook
linux·运维·服务器·云原生·kubernetes·k8s·ansible
紫神9 天前
DDS 通信技术说明
网络·云原生·容器·k8s·dds·弱网
Eminem8914 天前
14、k8s持久化存储
k8s
上火的金鱼妹16 天前
higress网关访问+ 模型访问的安全策略管控
k8s·higress·ai网关
weixin_4445793017 天前
Containerd
容器·k8s
Dragon_qu·x18 天前
MongoDB 高可用集群部署
运维·数据库·mongodb·k8s·helm