Gl�ria头像
关注

ELK Filebeat 部署

Filebeat 是轻量采集器,核心原则:就近采集日志,尽量在日志产生的机器上部署,避免跨网络读取日志。

一、物理机 / 传统虚拟机(业务服务器,最常用)

部署方式:每台业务机器独立部署 Filebeat(Agent 单机部署)

业务机器:Java 应用、Nginx、Tomcat,日志输出到本机磁盘 /opt/app/logs/。 每台业务服务器单独安装一个 Filebeat,只采集本机的日志文件

部署步骤简述:

  1. 在业务机器安装 filebeat rpm/deb 包;
  2. 修改 filebeat.yml:配置日志路径、输出(Kafka / ES);
  3. 启动 systemd 托管:systemctl start filebeat && systemctl enable filebeat
  4. registry 文件默认路径:/var/lib/filebeat/registry,保存文件读取 offset 断点。

✅优点

  1. 就近读取本地磁盘日志,网络开销小;
  2. 轻量,内存占用几十 MB,几乎不抢占业务资源;
  3. 断点续传,重启不丢、不重复采集;
  4. 横向扩展简单:新增业务机器,部署 Filebeat 即可。

❌缺点

  1. 机器数量很多时,需要批量部署(ansible / 脚本);
  2. 配置变更需要批量下发 yaml。

适用:物理机、ECS 云主机,微服务业务,大数据服务器(YARN/Flink/spark 日志采集)。

二、Kubernetes 容器环境(两种主流方案)

方案 1:DaemonSet 方式(生产首选)

在 K8s 集群每个 Node 节点,运行一个 Filebeat Pod。 Filebeat Pod 挂载宿主机的容器日志目录 /var/log/containers/,读取宿主机上所有容器产生的日志。

不管这个 Node 上跑多少业务 Pod,只需要 1 个 Filebeat Pod。

✅优点

  • 只需要部署一次 DaemonSet,新增节点自动拉起 Filebeat;不用给每个业务 Pod 单独部署;
  • 运维成本低。

❌缺点

  • Filebeat 权限要求高,需要挂载宿主机目录;
  • 日志过滤逻辑写在 DaemonSet 的配置,区分不同业务日志需要加标签过滤。

方案 2:Sidecar 边车模式

每个业务 Pod 内部,单独启动一个 Filebeat 容器,和业务容器共享日志卷 emptyDir。业务容器写日志到共享卷,同 Pod 内 Filebeat 读取日志。

✅优点

  • 日志隔离:每个业务 Pod 的采集配置独立;
  • 不依赖宿主机目录,权限更安全;
  • 采集范围只属于当前 Pod。

❌缺点

  • Pod 数量多的时候,Filebeat 实例数量非常多,资源开销变大;
  • 配置管理繁琐。

对比:K8s 绝大多数业务选择 DaemonSet;只有强隔离需求才用 Sidecar。


DaemonSet(DS)解释说明

一句话:DaemonSet 保证集群里每一个(或者指定一部分)节点,都运行一份相同的 Pod 副本。新节点加入集群,会自动在该节点创建 Pod;节点删除,Pod 跟着回收。

适用场景

  1. 节点日志收集:如 filebeat、fluentd,每个节点都要采集容器日志
  2. 节点监控:node-exporter,每个节点采集服务器指标
  3. 网络插件:calico、flannel,每个节点网络代理
  4. 安全代理、节点审计等每个机器都必须部署一个的组件

❌ 不适合业务应用(业务一般用 Deployment,不需要每台节点都跑)

和 Deployment 区别

  • DaemonSet:每个节点最多 1 个 Pod,不控制副本数,由节点数量决定;不支持扩缩副本(是扩缩节点)
  • Deployment:调度 Pod 到任意节点,可以多个 Pod 跑在同一个节点,用来部署业务服务

简单 yaml 示例

#资源所属 API 组,Deployment、StatefulSet、DaemonSet 都在`apps/v1`,K8s 1.9 之后稳定版本。
apiVersion: apps/v1
kind: DaemonSet       #资源类型,声明这是一个 DaemonSet,作用是每个符合条件节点运行 1 个 Pod
metadata:             #metadata 元信息
  name: filebeat-ds   #DaemonSet 的名称,执行 kubectl 操作时用这个名字
  namespace: logging  #资源放在`logging`命名空间;不写默认是`default`
spec:                 #spec.selector 标签选择器
  selector:           #`selector.matchLabels`:**用来匹配 Pod 标签**。DaemonSet 控制器通过标签找到属于自己管理的 Pod
    matchLabels:
      app: filebeat
  template:           #spec.template Pod 模板(核心:定义要创建的 Pod 长什么样)。DaemonSet 会用这个模板在节点上创建 Pod
    metadata:
      labels:
        app: filebeat #`metadata.labels`:给生成出来的 Pod 打上标签 `app=filebeat`,和上面 selector 匹配
    #spec.template.spec.containers 容器配置
    spec:
      # nodeSelector / nodeAffinity 可以指定只在部分节点部署
      # nodeSelector:
      #   env: prod
      containers:      #Pod 内容器列表,一个 Pod 可以多个容器
      - name: filebeat #`name: filebeat`:容器名称,Pod 内标识
        image: elastic/filebeat:7.17.0  #`image: elastic/filebeat:7.17.0`:镜像地址 + 版本,拉取 filebeat 镜像,用来收集日志
        volumeMounts:  #**挂载声明**,把卷挂载到容器内部目录
        - name: varlog  #卷名字,要和下面 volumes 的 name 对应
          mountPath: /var/log  #容器内路径,容器里面`/var/log`就是挂载点
      volumes:         #volumes 卷定义,在 Pod 级别定义卷
      - name: varlog   #卷名称,和 volumeMounts 关联
        hostPath:      #宿主机卷类型,**把节点宿主机上的目录挂载进容器**
          path: /var/log  #宿主机(node 节点)的`/var/log`目录

常用操作命令

# 创建DaemonSet
kubectl apply -f ds.yaml

# 查看ds
kubectl get daemonset -n logging
kubectl get ds -n logging

# 查看详情(排查为什么Pod无法调度)
kubectl describe ds filebeat-ds -n logging

# 查看ds下的pod
kubectl get pod -n logging -l app=filebeat -o wide

# 更新镜像(滚动更新,默认策略RollingUpdate)
kubectl set image ds/filebeat-ds filebeat=elastic/filebeat:8.11.0 -n logging

# 删除DaemonSet(会连带删除所有Pod)
kubectl delete ds filebeat-ds -n logging

三、集中式部署(不推荐!了解即可)

单独找一台日志采集服务器,远程读取其他机器日志(例如 sftp、nfs 挂载远程日志目录),在这一台机器上部署 Filebeat 采集多台机器日志。

❌缺点:

  1. 跨网络读取日志,网络延迟高;网络抖动容易丢日志;
  2. 单点风险,采集机挂掉所有机器日志无法采集;
  3. 无法正确监听 inode,日志切割场景容易漏采。

生产基本不用。不推荐集中式,Filebeat 设计就是分布式 agent。

四、容器(Docker 非 K8s)

和物理机思路类似:宿主机部署 Filebeat,挂载 docker 日志目录 /var/lib/docker/containers/,采集本机所有容器 json 日志。

五、Filebeat 输出目标(和部署配套)

Filebeat 采集完日志,可以输出到三类:

  1. 输出 Kafka(大规模生产架构首选):Filebeat -> Kafka -> Logstash -> ES
  2. 直接输出 ES:小规模业务,省去 Logstash
  3. 输出 Logstash:小型架构 Filebeat -> Logstash -> ES

最佳实践:Filebeat 只负责采集,不做复杂清洗;复杂 grok 解析、脱敏放到 Logstash。

六、精简版

Filebeat 有 4 种部署方式:

  1. 物理机 / ECS:单机 Agent 部署。每台业务机器部署 Filebeat,采集本机磁盘日志;就近采集,轻量,是传统业务最常用方式。
  2. K8s DaemonSet(首选):集群每个节点运行一个 Filebeat Pod,读取宿主机所有容器日志;运维简单,不需要每个 Pod 单独部署。
  3. K8s Sidecar 边车:每个业务 Pod 内附带 Filebeat 容器,共享日志卷;隔离性好,但实例多、资源开销大。
  4. 集中式远程采集:不推荐。单台机器远程读取多台机器日志,存在单点故障、网络问题,容易丢日志。

核心原则:Filebeat 属于分布式采集 Agent,就近采集本地日志,尽量避免远程读取。

七、高频Q&A

Q:registry 文件作用?

A:保存每个日志文件的读取偏移量 offset、inode 信息,Filebeat 重启后从上次位置继续采集,防止重复采集或者漏日志。

Q:DaemonSet 和 Sidecar 怎么选?

A:集群规模大,通用日志采集,选 DaemonSet;业务需要独立采集配置、强隔离场景,才使用 Sidecar。

Q:Filebeat 能不能部署在 Logstash 服务器上采集?

A:不建议。Filebeat 尽量部署在日志产生端,减少网络传输压力。

 

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/weixin_47157956/article/details/164745172

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--