在K8S中,DaemonSet类型的资源特性有哪些?
在 Kubernetes 中,DaemonSet 是一种特殊类型的控制器资源,其核心目标是确保集群中的所有(或符合条件的)节点上都运行着一个且仅一个特定 Pod 的副本。随着节点的加入或退出集群,DaemonSet 会自动创建或删除相应的 Pod。其主要特性如下:
-
每个节点一个 Pod:
- 这是 DaemonSet 最核心的特性。它确保集群中满足条件的每个节点上都运行一个该 DaemonSet 管理的 Pod 实例。
- 当新节点加入集群时,DaemonSet 控制器会立即在该节点上调度并创建一个 Pod。
- 当节点从集群中移除时,DaemonSet 控制器会删除该节点上的 Pod(通常通过垃圾回收机制)。
- 如果节点被标记为不可调度(
unschedulable
),DaemonSet 控制器通常仍会在该节点上创建 Pod(除非使用nodeAffinity
等机制明确排除)。
-
节点级守护进程:
- DaemonSet 的典型用途是部署那些提供节点级别基础设施服务的守护进程,这些服务需要在每个节点上运行,且通常与节点本身紧密相关,而非服务于集群内其他应用。例如:
- 日志收集代理: 如 Fluentd、Filebeat,负责收集节点和容器日志。
- 监控代理: 如 Prometheus Node Exporter、Datadog Agent,负责收集节点指标。
- 网络插件: 如 Calico、Cilium 或 Weave Net 的某些组件,需要运行在每个节点上提供网络功能(如 CNI 插件)。
- 存储插件: 如 Ceph、GlusterFS 的客户端守护进程。
- 安全代理: 如 Falco 或安全扫描工具。
- 节点维护工具: 如执行节点级清理、更新脚本的 Pod。
- DaemonSet 的典型用途是部署那些提供节点级别基础设施服务的守护进程,这些服务需要在每个节点上运行,且通常与节点本身紧密相关,而非服务于集群内其他应用。例如:
-
自动适应集群规模变化:
- DaemonSet 控制器持续监控集群中的节点状态。集群规模扩缩(节点增加或减少)时,DaemonSet 会自动调整 Pod 的数量和分布,始终保持“一个节点一个 Pod”的状态。无需手动干预调整副本数。
-
使用节点选择器/亲和性控制部署范围:
- 默认情况下,DaemonSet 会在所有节点上部署 Pod。
- 通过
.spec.template.spec.nodeSelector
字段,可以指定一个节点标签选择器。只有拥有匹配标签的节点才会运行该 DaemonSet 的 Pod。 - 通过
.spec.template.spec.affinity.nodeAffinity
字段,可以使用更强大的节点亲和性规则来控制 Pod 部署到哪些节点上(例如,要求、偏好、排斥等)。 - 常见用例: 只在特定硬件(如 GPU 节点)或特定角色(如 Ingress 节点)上部署守护进程,或者避免在 Master 节点(通常带有
node-role.kubernetes.io/control-plane: NoSchedule
污点)上部署(需配合污点容忍)。
-
支持污点容忍:
- 集群节点(尤其是 Master 节点)通常会设置污点以防止普通 Pod 调度上去。
- 为了能在这些带有污点的节点上部署守护进程,DaemonSet 的 Pod 模板(
.spec.template.spec.tolerations
)必须显式声明容忍相应的污点。否则,Pod 将无法调度到带有污点的节点上。 - 例如,为了在 Master 节点上部署网络插件或监控代理,Pod 需要容忍
node-role.kubernetes.io/control-plane:NoSchedule
或node-role.kubernetes.io/master:NoSchedule
污点。
-
滚动更新策略:
- 当更新 DaemonSet 的 Pod 模板(如更新容器镜像)时,DaemonSet 支持两种更新策略(
.spec.updateStrategy.type
):RollingUpdate
(默认): 以可控的方式逐个节点更新 Pod。控制器会先终止旧 Pod,然后在同一节点上创建新 Pod。可以配置maxUnavailable
来控制同时不可用的 Pod 数量(例如,设置为1
表示一次只更新一个节点)。OnDelete
: 仅当用户手动删除节点上的旧 Pod 时,DaemonSet 控制器才会在该节点上创建新的 Pod。这提供了完全手动的更新控制。
- 当更新 DaemonSet 的 Pod 模板(如更新容器镜像)时,DaemonSet 支持两种更新策略(
-
唯一标识符:
- 每个由 DaemonSet 创建的 Pod 都包含一个唯一的控制器修订哈希(
controller-revision-hash
)标签。这有助于 DaemonSet 控制器跟踪和管理不同版本的 Pod。
- 每个由 DaemonSet 创建的 Pod 都包含一个唯一的控制器修订哈希(
-
不直接支持水平扩缩:
- 与
Deployment
或ReplicaSet
不同,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 集群至关重要。