什么是 DaemonSet
在 Kubernetes 集群中,DaemonSet 的核心作用是确保所有(或部分)节点上都运行一个特定 Pod 的副本。这与我们熟悉的 Deployment 不同,后者关注的是副本数量,而 DaemonSet 关注的是节点覆盖。
当有新节点加入集群时,DaemonSet 会自动在该节点上创建对应的 Pod;反之,当节点被移除,其上的 Pod 也会被清理。这种机制非常适合部署那些需要每个节点都运行的守护进程,比如日志收集器(Fluentd)、监控代理(Prometheus Node Exporter)或存储后端(Glusterd)。
在实际架构中,简单的场景可能只需要一个覆盖全集群的 DaemonSet。但在复杂环境下,针对不同硬件类型的节点,我们可能会配置多个 DaemonSet,分别指定不同的资源请求和启动参数。
如何编写 DaemonSet 配置
必填字段
就像其他 K8s 资源一样,DaemonSet 必须包含 apiVersion、kind 和 metadata。此外,.spec 部分也是必不可少的。
下面是一个最小化的配置示例,展示了基本结构:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
spec:
selector:
matchLabels:
app: logging
template:
metadata:
labels:
app: logging
spec:
containers:
- name: fluentd
image: fluentd:v1.0
Pod 模板
.spec.template 是 .spec 下唯一的必填项。它本质上就是一个 Pod 模板,结构与 Pod 完全一致,只是嵌套在其中且不需要 apiVersion 或 kind。
这里有两个关键点需要注意:
- 标签匹配:Pod 模板必须定义合适的标签,以便与选择器匹配。
- 重启策略:DaemonSet 中的 Pod 模板必须设置
RestartPolicy为Always,或者不指定(默认即为 Always)。这是为了保证守护进程在崩溃后能自动恢复。
选择器
用于选择由该 DaemonSet 管理的 Pod。它与 Job 或其他资源的选择器机制类似,包含 和 。

