DaemonSet 控制器为 Kubernetes 提供了节点级系统服务的自动化部署能力,是集群可观测性与基础设施运维的关键保障。
DaemonSet 是 Kubernetes 中的一种控制器,确保在集群中的每个(或特定)节点上运行一个 Pod 副本。当有新节点加入集群时,DaemonSet 会自动在新节点上创建 Pod;当节点从集群中移除时,对应的 Pod 也会被回收。删除 DaemonSet 时,它创建的所有 Pod 都会被删除。
DaemonSet 适用于需要在每个节点上运行系统级服务的场景。常见用例如下:
DaemonSet 资源定义包含必需字段和可选字段,合理配置可满足不同节点管理需求。
apiVersion:API 版本kind:资源类型metadata:元数据信息spec:规格定义.spec.template 是 DaemonSet 的核心配置,定义要创建的 Pod 模板:
apiVersion 和 kindrestartPolicy 必须设置为 Always(默认值).spec.selector 用于选择管理的 Pod,支持 matchLabels 和 matchExpressions 两种方式。选择器必须与 Pod 模板的标签匹配,否则 API 会拒绝创建。
可通过以下方式限制 Pod 运行的节点:
nodeSelector:基于节点标签选择nodeAffinity:更灵活的节点亲和性规则tolerations:容忍节点污点如果未指定节点选择条件,DaemonSet 默认在所有节点上创建 Pod。
DaemonSet 的调度机制与普通 Pod 不同,具备如下特点:
.spec.nodeName)unschedulable 状态DaemonSet Pod 自动添加以下容忍配置:
| 污点键 | Effect |
|---|---|
| node.kubernetes.io/not-ready | NoExecute |
| node.kubernetes.io/unreachable | NoExecute |
| node.kubernetes.io/disk-pressure | NoSchedule |
| node.kubernetes.io/memory-pressure | NoSchedule |
| node.kubernetes.io/unschedulable | NoSchedule |
DaemonSet Pod 的通信模式多样,常见方式如下:
hostNetwork: true 或 hostPort,结合节点 IP 和端口访问服务DaemonSet 支持多种更新与维护策略,便于系统级服务的平滑升级。
Kubernetes 1.6+ 支持 DaemonSet 滚动更新:
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
以下情况会触发 DaemonSet 更新:
可通过 --cascade=orphan 选项删除 DaemonSet 但保留 Pod,便于后续手动管理。
为 DaemonSet Pod 设置适当的资源请求和限制:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
配置安全上下文,特别是需要访问主机资源时:
securityContext:
privileged: true
hostNetwork: true
hostPID: true
配置存活探针和就绪探针,提升服务可用性:
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
下表对比了 DaemonSet 与其他常见控制器的适用场景和特性。
| 控制器类型 | 主要特性 | 适用场景 |
|---|---|---|
| DaemonSet | 每节点一个 Pod,节点覆盖 | 系统级守护进程 |
| Deployment | 指定副本数,高可用与分担 | 无状态服务 |
| StaticPod | kubelet 直接管理,配置简单 | 特殊场景、功能有限 |
| Job/CronJob | 一次性/定时任务 | 批处理、定时任务 |
DaemonSet 控制器为 Kubernetes 提供了节点级服务的自动化部署能力,适用于日志收集、监控、网络等系统级场景。合理配置和管理 DaemonSet,有助于提升集群的可观测性、可维护性和基础设施弹性。