在K8S中,DaemonSet类型的资源特性有哪些?

在 Kubernetes 中,DaemonSet 是一种特殊类型的控制器资源,其核心目标是确保集群中的所有(或符合条件的)节点上都运行着一个且仅一个特定 Pod 的副本。随着节点的加入或退出集群,DaemonSet 会自动创建或删除相应的 Pod。其主要特性如下:

  1. 每个节点一个 Pod:

    • 这是 DaemonSet 最核心的特性。它确保集群中满足条件的每个节点上都运行一个该 DaemonSet 管理的 Pod 实例。
    • 当新节点加入集群时,DaemonSet 控制器会立即在该节点上调度并创建一个 Pod。
    • 当节点从集群中移除时,DaemonSet 控制器会删除该节点上的 Pod(通常通过垃圾回收机制)。
    • 如果节点被标记为不可调度(unschedulable),DaemonSet 控制器通常仍会在该节点上创建 Pod(除非使用 nodeAffinity 等机制明确排除)。
  2. 节点级守护进程:

    • DaemonSet 的典型用途是部署那些提供节点级别基础设施服务的守护进程,这些服务需要在每个节点上运行,且通常与节点本身紧密相关,而非服务于集群内其他应用。例如:
      • 日志收集代理: 如 Fluentd、Filebeat,负责收集节点和容器日志。
      • 监控代理: 如 Prometheus Node Exporter、Datadog Agent,负责收集节点指标。
      • 网络插件: 如 Calico、Cilium 或 Weave Net 的某些组件,需要运行在每个节点上提供网络功能(如 CNI 插件)。
      • 存储插件: 如 Ceph、GlusterFS 的客户端守护进程。
      • 安全代理: 如 Falco 或安全扫描工具。
      • 节点维护工具: 如执行节点级清理、更新脚本的 Pod。
  3. 自动适应集群规模变化:

    • DaemonSet 控制器持续监控集群中的节点状态。集群规模扩缩(节点增加或减少)时,DaemonSet 会自动调整 Pod 的数量和分布,始终保持“一个节点一个 Pod”的状态。无需手动干预调整副本数。
  4. 使用节点选择器/亲和性控制部署范围:

    • 默认情况下,DaemonSet 会在所有节点上部署 Pod。
    • 通过 .spec.template.spec.nodeSelector 字段,可以指定一个节点标签选择器。只有拥有匹配标签的节点才会运行该 DaemonSet 的 Pod。
    • 通过 .spec.template.spec.affinity.nodeAffinity 字段,可以使用更强大的节点亲和性规则来控制 Pod 部署到哪些节点上(例如,要求、偏好、排斥等)。
    • 常见用例: 只在特定硬件(如 GPU 节点)或特定角色(如 Ingress 节点)上部署守护进程,或者避免在 Master 节点(通常带有 node-role.kubernetes.io/control-plane: NoSchedule 污点)上部署(需配合污点容忍)。
  5. 支持污点容忍:

    • 集群节点(尤其是 Master 节点)通常会设置污点以防止普通 Pod 调度上去。
    • 为了能在这些带有污点的节点上部署守护进程,DaemonSet 的 Pod 模板(.spec.template.spec.tolerations必须显式声明容忍相应的污点。否则,Pod 将无法调度到带有污点的节点上。
    • 例如,为了在 Master 节点上部署网络插件或监控代理,Pod 需要容忍 node-role.kubernetes.io/control-plane:NoSchedulenode-role.kubernetes.io/master:NoSchedule 污点。
  6. 滚动更新策略:

    • 当更新 DaemonSet 的 Pod 模板(如更新容器镜像)时,DaemonSet 支持两种更新策略(.spec.updateStrategy.type):
      • RollingUpdate (默认): 以可控的方式逐个节点更新 Pod。控制器会先终止旧 Pod,然后在同一节点上创建新 Pod。可以配置 maxUnavailable 来控制同时不可用的 Pod 数量(例如,设置为 1 表示一次只更新一个节点)。
      • OnDelete 仅当用户手动删除节点上的旧 Pod 时,DaemonSet 控制器才会在该节点上创建新的 Pod。这提供了完全手动的更新控制。
  7. 唯一标识符:

    • 每个由 DaemonSet 创建的 Pod 都包含一个唯一的控制器修订哈希(controller-revision-hash)标签。这有助于 DaemonSet 控制器跟踪和管理不同版本的 Pod。
  8. 不直接支持水平扩缩:

    • DeploymentReplicaSet 不同,DaemonSet 没有 replicas 字段,也不能被 HorizontalPodAutoscaler 管理进行自动扩缩。它的 Pod 数量直接由集群中符合条件的节点数量决定。

与 Deployment/ReplicaSet 的关键区别:

特性 DaemonSet Deployment/ReplicaSet
部署目标 每个符合条件的节点部署 1 个 Pod 部署指定数量 (replicas) 的 Pod
副本数控制 集群节点数量决定 由用户设置的 replicas 字段决定
扩缩容 节点增减自动扩缩 通过修改 replicas 手动或 HPA 自动扩缩
典型用途 节点级守护进程 (日志、监控、网络、存储代理等) 应用服务 (API, Web Server, Worker 等)
更新策略 RollingUpdate, OnDelete RollingUpdate, Recreate
节点选择/亲和 关键,用于控制部署范围 用于优化调度,但不改变副本目标
污点容忍 通常必须配置,以在带污点节点上运行 可选,用于调度到带污点节点

总结:

DaemonSet 是 Kubernetes 中用于确保每个(符合条件的)节点运行单一实例守护进程的核心机制。它通过自动感知节点变化、支持节点选择器/亲和性与污点容忍来精确控制部署范围,并通过滚动更新策略实现安全更新。它是部署集群基础设施层组件的理想选择,如日志、监控、网络和存储插件等需要“无处不在”的节点级服务。理解其特性对于构建健壮的 Kubernetes 集群至关重要。

posted @ 2025-08-19 09:05  天道酬勤zjh  阅读(5)  评论(0)    收藏  举报