🚀 第三步:部署 DaemonSet
🧠 1. 什么是 DaemonSet?
在 Kubernetes 中,DaemonSet 是一种特殊的控制器,它会确保集群中每个节点上都运行一个 Pod。
适合以下场景:
- 系统级守护进程(如监控、日志采集)
- 节点本地任务
- agent 类型程序
本例通过 DaemonSet 来实现 Fluent Bit 在所有节点上采集容器日志。
📜 2. 参考 DaemonSet 配置文件
apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluent-bitnamespace: logginglabels:app.kubernetes.io/name: fluentbit
spec:selector:matchLabels:name: fluent-bittemplate:metadata:labels:name: fluent-bitspec:serviceAccountName: fluent-bit# 🧭 保持主机网络访问(支持 Use_Kubelet)hostNetwork: truednsPolicy: ClusterFirstWithHostNet# ❌ 排除 node01 节点affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: NotInvalues:- node01tolerations:- operator: Existscontainers:- name: fluent-bitimage: harbor.qiyuanlab.com:30020/library/fluent-bit:4.0.1imagePullPolicy: IfNotPresentsecurityContext:privileged: trueresources:limits:memory: 1500Mirequests:cpu: 500mmemory: 500MivolumeMounts:- name: varlogmountPath: /var/log- name: varlibdockercontainersmountPath: /data/docker/containersreadOnly: true- name: fluentbit-configmountPath: /fluent-bit/etc/# 🕒 时区同步- name: tz-localtimemountPath: /etc/localtimereadOnly: true- name: buffermountPath: /buffersvolumes:- name: varloghostPath:path: /var/log- name: varlibdockercontainershostPath:path: /data/docker/containers- name: fluentbit-configconfigMap:name: fluent-bit-config- name: tz-localtimehostPath:path: /etc/localtime- name: bufferemptyDir: {}
🧭 3. 配置详解与注意事项
🧾 元信息
字段 |
作用 |
注意事项 |
metadata.namespace |
部署命名空间 |
⚠️ 必须与第一步中创建的命名空间一致(如 logging ) |
serviceAccountName |
使用的服务账号 |
必须与 RBAC 绑定的 ServiceAccount 名称一致 |
🧠 网络设置
字段 |
作用 |
注意事项 |
hostNetwork: true |
Pod 共享宿主机网络 |
✅ 方便 Fluent Bit 与 kubelet API 通信,推荐开启 |
dnsPolicy: ClusterFirstWithHostNet |
DNS 策略 |
必须与 hostNetwork 搭配,否则可能出现 DNS 解析异常 |
🧭 调度设置
字段 |
作用 |
注意事项 |
affinity |
节点调度策略 |
⚠️ NotIn 表示不在 node01 上部署。可根据业务需要调整 |
tolerations |
污点容忍 |
✅ 允许在打了污点的节点上运行日志采集 Pod,避免漏采集 |
🐳 容器设置
字段 |
作用 |
注意事项 |
image |
Fluent Bit 镜像地址 |
✅ 可使用官方镜像或私有仓库镜像,注意版本一致性 |
securityContext.privileged: true |
提升容器权限 |
必须打开以访问宿主机日志路径 |
resources |
资源限制与请求 |
⚠️ 避免资源抢占过多,同时保证采集稳定性 |
volumeMounts |
挂载日志、配置、时区 |
挂载路径必须与实际宿主机路径匹配 |
🧰 Volume 配置
名称 |
类型 |
路径 |
说明 |
varlog |
hostPath |
/var/log |
宿主机日志目录 |
varlibdockercontainers |
hostPath |
/data/docker/containers |
容器日志目录(按实际环境修改) |
fluentbit-config |
ConfigMap |
/fluent-bit/etc/ |
前一步创建的 Fluent Bit 配置 |
tz-localtime |
hostPath |
/etc/localtime |
保持容器时区与宿主机一致 |
buffer |
emptyDir |
/buffers |
缓冲目录,避免日志堆积时丢失 |
⚠️ 特别注意:
hostPath
必须与宿主机实际路径一致,否则 Fluent Bit 无法读取日志。
- 建议
buffer
使用 emptyDir
,防止 Pod 重启导致磁盘空间未清理。
- 如果使用 containerd,请修改路径(如
/var/log/containers
和 /var/lib/containerd
)。
🛠️ 4. 部署与验证命令
✅ 部署 DaemonSet
kubectl apply -f fluent-bit-daemonset.yaml
🔍 查看部署状态
# 查看 DaemonSet 状态
kubectl get daemonset -n logging# 查看 Pod 是否在每个节点上部署
kubectl get pods -n logging -o wide# 查看 Pod 日志
kubectl logs -n logging -l name=fluent-bit
🧼 5. 常见问题与排查建议
问题现象 |
可能原因 |
解决方案 |
Pod 无法启动 |
路径挂载错误 / 权限不足 |
检查 volumeMounts 与宿主机路径 |
无法采集日志 |
ConfigMap 名称不一致 |
确保 ConfigMap 已正确创建且名称对应 |
DNS 解析失败 |
使用 hostNetwork 但 dnsPolicy 错误 |
使用 ClusterFirstWithHostNet |
部分节点未部署 |
节点调度被排除 |
检查 affinity 、tolerations 配置 |
时区不一致 |
宿主机与容器时间不同 |
使用 /etc/localtime 挂载同步时区 |
🧭 6. 推荐实践
- ✅ 与 RBAC、ConfigMap 一起管理,确保权限、配置和运行一致性。
- 🧰 配合
kubectl rollout restart daemonset
实现滚动更新。
- 🪄 使用
kubectl label
为节点分组,实现灵活调度。
- 🧠 定期查看资源使用情况,避免采集任务占用过多 CPU/内存。
- 🧼 定期清理日志文件夹,防止磁盘占满。
📝 小结
- 🧱 DaemonSet 是 Fluent Bit 在每个节点上采集日志的基础。
- 🧭 注意网络、调度、挂载路径、权限的配置匹配。
- ⚠️ 任何路径或名称不一致都可能导致采集失败。
- 🧪 通过
kubectl get/logs/describe
等命令可快速定位问题。
是否希望我在下一步给出一份 完整的三步部署流程 shell 脚本,可一键部署 Fluent Bit?(适合生产环境快速上线) 🚀