daemonset 是 kubernetes 中确保每个节点运行一个日志采集 pod 的核心资源,适用于 fluentd、filebeat 等代理部署,需配置宿主机路径挂载、权限、configmap/secret 及 rbac,支持滚动更新与多维度验证。

在 Kubernetes 中,DaemonSet 是确保每个节点(或满足条件的节点)上都运行一个 Pod 副本的理想资源对象,特别适合部署日志采集代理(如 Fluentd、Filebeat、Logstash 或 OpenTelemetry Collector)。它能自动响应节点增减,无需手动干预,是构建集群级日志收集基础设施的核心组件。
明确 DaemonSet 的适用场景与限制
DaemonSet 保证每个 Node 上有且仅有一个该 Pod 实例(除非被 taint/tolerations 或 nodeSelector/affinity 排除)。它不适用于需要多副本负载均衡的日志后端(如 Elasticsearch),也不适合只在部分专用节点(如 infra 节点)部署的场景——此时需配合节点标签和调度策略精确控制。
注意:DaemonSet 管理的 Pod 不受 ReplicaSet 控制,也不会出现在 Deployment 或 StatefulSet 的拓扑中;升级采用滚动更新(默认)或强制删除重建模式,需关注日志采集中断窗口。
准备日志插件镜像与配置
选择轻量、稳定、支持动态配置重载的日志代理。例如:
-
Filebeat:官方 Helm Chart 成熟,支持 Kubernetes 模块(`kubernetes` input)、自动发现容器日志路径(
/var/log/pods/*)和元数据注入; -
Fluentd:插件生态丰富,但需自行维护配置(推荐用
fluent/fluentd-kubernetes-daemonset官方镜像); -
OpenTelemetry Collector:云原生新标准,支持 logs/metrics/traces 统一采集,需配置
filelogreceiver 和k8sattributesprocessor。
关键配置要点:
- 挂载宿主机路径:
/var/log(容器引擎日志)、/var/log/pods(容器 stdout/stderr 软链)、/etc/machine-id(用于唯一标识); - 设置
securityContext.privileged: true(仅当需要读取 Docker socket 或 hostPath 设备时); - 使用 ConfigMap 或 Secret 管理采集规则、目标地址、TLS 证书等,避免硬编码;
- 为避免干扰业务,建议设置资源限制(
requests/limits),尤其 CPU limit 避免采集器被 throttled。
编写并部署 DaemonSet YAML
以 Filebeat 为例,最小可行 DaemonSet 片段如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: filebeat
template:
metadata:
labels:
k8s-app: filebeat
spec:
serviceAccountName: filebeat
tolerations:
- operator: Exists # 允许容忍所有污点(含 master 节点)
hostNetwork: true # 可选,便于访问宿主机服务(如本地 syslog)
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:8.12.0
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
readOnly: true
subPath: filebeat.yml
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: varlog
mountPath: /var/log
readOnly: true
- name: varlogpods
mountPath: /var/log/pods
readOnly: true
volumes:
- name: config
configMap:
name: filebeat-config
- name: data
hostPath:
path: /var/lib/filebeat-data
type: DirectoryOrCreate
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlog
hostPath:
path: /var/log
- name: varlogpods
hostPath:
path: /var/log/pods
部署前需提前创建:
- ServiceAccount + ClusterRoleBinding(授予读取 Pods/Namespaces/Nodes 的权限);
- ConfigMap(含
filebeat.yml,定义 input、processors、output); - hostPath 类型的持久化目录(如
/var/lib/filebeat-data)建议用 initContainer 初始化权限(chown); - 若对接 HTTPS 日志后端,将证书挂载为 Secret。
验证与持续运维
部署后执行以下检查:
- 运行
kubectl get ds -n kube-system filebeat确认 DESIRED == CURRENT == READY; - 用
kubectl get pods -n kube-system -l k8s-app=filebeat查看各节点 Pod 状态,确认其 nodeName 与集群节点一一对应; - 进入任一 Pod:
kubectl exec -it -n kube-system <pod-name> -- filebeat test config && filebeat test output</pod-name>验证配置语法与连通性; - 查看采集日志:
kubectl logs -n kube-system <pod-name></pod-name>,关注是否有 permission denied、connection refused 或 no log files found 类错误; - 在日志后端(如 Kibana)搜索
kubernetes.node.name:"xxx",确认节点维度日志已上报。
后续建议:
- 通过 Prometheus + Filebeat 自身指标(
filebeat_output_write_bytes_total)监控发送速率与失败数; - 定期轮转
/var/lib/filebeat-data避免磁盘占满(可用 node-problem-detector 或自定义 cronJob 清理); - 升级时使用
updateStrategy.type: RollingUpdate并设置maxUnavailable: 1减少采集空白期。










