kubernetes 场景下的 filebeat autodiscover 自动发现功能说明


# 在容器内运行应用时会成为 "移动目标"
# 自动发现允许对其跟踪并在发生变化时调整设置,自动发现子系统通过定义配置模板可以在服务开始运行时对其进行监控
# 可在 filebeat.yml 中通过 filebeat.autodiscover.* 来定义自动发现设置

# -------------------------------------------------------------- Docker

# Docker 自动发现提供程序监视容器的启动和停止,下面是每个事件的可用字段:
  host
  port
  docker.container.id
  docker.container.image
  docker.container.name
  docker.container.labels
# Example ...
# Tips: 配置模板能够引用来自自动发现事件的变量。通过 data 键命名空间访问,例如此处 ${data.port} 将解析为 6379
# {
#   "host": "10.4.15.9",
#   "port": 6379,
#   "docker": {
#     "container": {
#       "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51"
#       "name": "redis",
#       "image": "redis:3.2.11",
#       "labels": {
#         "io.kubernetes.pod.namespace": "default"
#         ...
#       }
#     }
#   }
# }

# --------------------------- filebeat.yml Example

filebeat.autodiscover:
  providers:
    - type: docker
    # host: "unix:///var/run/docker.sock"               # 默认
    # hints.enabled: true                               # Docker 自动发现提供程序支持标签中的提示(详细解释在下文)
      labels.dedot: false                               # 将 docker 标签中的点 . 替换为 _
      templates:                                        # 定义配置模板,实现跟踪并在发生变更时调整设置
        - condition:                                    # 判断条件
            contains:                                   # 可用字段参考该页面上述定义的事件的可用字段
              docker.container.image: redis             # 针对特定镜像的容器 (可用字段参考如上 ...)
          config:                                       # 转换为通用格式
            - type: container                           # 调用何种类型的输入 (该 config.* 字段内可设置该输入类型的相关配置)
              paths:                                    # 下例路径中的变量即通过 data 键命名空间访问得到的
                - /var/lib/docker/containers/${data.docker.container.id}/*.log
              stream: "stderr"                          # 读入指定的流:all, stdout or stderr. The default is all
              fields:                                   # 该配置尚未验证 ...
                "key":"${data.docker.name}"             # 通过 data 键命名空间访问
              # include_lines: ["^ERROR"]               # 包括的行
              # exclude_lines: ["^\\s+[\\-`('.|_]"]     # 排除的行
     #  - condition:
     #      contains:
     #        docker.container.image: redis
     #    config:
     #      - module: redis                             # If using modules, you can override the default input 
     #        log:                                      # Tips: 按 module 目录内对象的组织层级进行对象的设置即可 (均是YAML嵌套)
     #          input:
     #            type: container                       # 调用redis模块处理该输入插件抽取的日志数据
     #            paths:
     #              - /mnt/logs/${data.docker.container.id}/*.log

output.file:
  path: "/tmp/filebeat"
  filename: autodiscover-docker.log

# -------------------------------------------------------------- Kubernetes

# Kubernetes 自动发现提供监视 Node、pods 的启动、更新、停止
# 这些是每个事件的可用字段:
  # 通用字段 Generic fields ...
    host
    port (if exposed)
    kubernetes.labels
    kubernetes.annotations
  # Pod specific ...
    kubernetes.container.id
    kubernetes.container.image
    kubernetes.container.name
    kubernetes.namespace
    kubernetes.node.name
    kubernetes.pod.name
    kubernetes.pod.uid
  # Node specific ...
    kubernetes.node.name
    kubernetes.node.uid
  # Service specific ...
    kubernetes.namespace
    kubernetes.service.name
    kubernetes.service.uid
    kubernetes.annotations
# Example ...
# Tips: 配置模板能够引用来自自动发现事件的变量。通过 data 键命名空间访问,例如 ${data.port} 将解析为 9090
# {
#   "host": "172.17.0.21",
#   "port": 9090,
#   "kubernetes": {
#     "container": {
#       "id": "bb3a50625c01b16a88aa224779c39262a9ad14264c3034669a50cd9a90af1527",
#       "image": "prom/prometheus",
#       "name": "prometheus"
#     },
#     "labels": {
#       "project": "prometheus",
#       ...
#     },
#     "namespace": "default",
#     "node": {
#       "name": "minikube"
#     },
#     "pod": {
#       "name": "prometheus-2657348378-k1pnh"
#     }
#   },
# }

# --------------------------- filebeat.yml Example

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true                         # 开启对 Pod 注解中的提示的支持
    # kube_config: "~/.kube/config"               # K8S 客户端配置,未设置则使用 KUBECONFIG 环境变量,若不存在将回退到 InCluster
    # resource: ""                                # 定义需发现的资源,默认为 pod,可选值: pod、service、node
    # namespace: ""                               # 定义收集元数据的命名空间,默认所有,此配置仅适用于命名空间范围内的 K8S 资源
      templates:                                  # Tips: 模板和条件的配置与 Docker providers 配置类似
        - condition:
            equals:
              kubernetes.namespace: kube-system   # 
          config:
            - type: container
            # fields:                             # 该配置尚未验证 ...
            #   "namespace": "${data.kubernetes.namespace}"
            #   "container_name": "${data.kubernetes.container.name}"
            #   "container_image": "${data.kubernetes.container.image}"
            #   "node_name": "${data.kubernetes.node.name}"
            #   "pod_name": "${data.kubernetes.pod.name}"
              paths:
                - /var/log/containers/*-${data.kubernetes.container.id}.log
              exclude_lines: ["^\\s+[\\-`('.|_]"] # drop asciiart lines
      # - condition:
      #     equals:
      #       kubernetes.container.image: "redis"
      #   config:
      #     - module: redis
      #       log:
      #         input:
      #           type: container                     # 调用redis模块处理该输入插件抽取的日志数据
      #           paths:
      #             - /var/log/containers/*-${data.kubernetes.container.id}.log

# -------------------------------------------------------- Tips

# 与 kubernetes 相关的处理器
# https://www.elastic.co/guide/en/beats/filebeat/current/add-kubernetes-metadata.html

# Filebeat On Kubernetes
# https://www.elastic.co/guide/en/beats/filebeat/current/running-on-kubernetes.html

基于提示的自动发现
https://www.elastic.co/guide/en/beats/filebeat/current/configuration-autodiscover-hints.html

# 基于提示的自动发现在 Pod 资源的 annotations 注解或 Docker 的 labels 中的 "co.elastic.logs/*" 前缀字段下查找
# 一旦容器启动,Filebeat 将检查其是否包含任何注解提示并为其设置相应的设置
# 通过提示可指明如何获取给定容器的日志,默认使用 container 类型的输入从容器检索日志,可使用注解提示修改此行为

# --------------------------- kubernetes annotations For pod

co.elastic.logs/enabled: "true"
# Filebeat 默认抽取所有容器的日志,可将此提示设为 false 可忽略抽取
# 若默认配置被禁用,可使用该注解来只为设为 true 的容器启用日志检索。因为注释值只能是字串,所以需明确定义为 "true" 或 "false"

co.elastic.logs/multiline.pattern: '^\['
co.elastic.logs/multiline.negate: true
co.elastic.logs/multiline.match: after
# 多行匹配相关设置

co.elastic.logs/json.keys_under_root: true
co.elastic.logs/json.add_error_key: true
co.elastic.logs/json.message_key: log
# JSON 设置,可使用有用的信息标记 Docker 容器,以解码结构为 JSON 消息的日志

co.elastic.logs/include_lines: ["...","...."]
co.elastic.logs/exclude_lines: ["...","...."]
# 希望 Filebeat 包含/排除的行匹配的正则表达式列表

co.elastic.logs.sidecar/exclude_lines: '^DBG'
# 当Pod内有多个容器时,除非将容器名称放在提示中,否则设置将共享,上述配置将对名为 sidecar 的容器的日志执行 exclude_lines

co.elastic.logs/exclude_lines: '^DBG'
co.elastic.logs/1.include_lines: '^DBG'
co.elastic.logs/1.processors.dissect.tokenizer: "%{key2} %{key1}"
# 当需要在容器上定义多个输入时,可以为注释集提供数字前缀。如果有没有数字前缀的提示,那么它们会被组合到一个配置中
# 上述配置生成两个输入配置。第一个输入仅处理 DBG 日志并将其传递给 dissect 处理器,第二个输入处理除调试日志之外的所有内容

co.elastic.logs/module: ...             # 指定用于解析容器日志的模块,而不是使用 docker 原始输入
co.elastic.logs/fileset: "access"       # 配置上述模块后,将容器日志映射到模块文件集
co.elastic.logs/fileset.stdout: access  # 可以为容器中的每个流配置单独的文件集
co.elastic.logs/fileset.stderr: error   # 

co.elastic.logs/module: nginx
co.elastic.logs/fileset.stdout: access
co.elastic.logs/fileset.stderr: error
# 可以使用有用的信息标记 Docker 容器以启动 Filebeat 输入
# 上述标签将使用 Nginx 模块为该容器收集日志。访问日志从 stdout 检索,错误日志从 stderr 检索

co.elastic.logs/raw: "[{\"containers\":{\"ids\":[\"${data.container.id}\"]},\"multiline\":{\"negate\":\"true\",\"pattern\":\"^test\"},\"type\":\"docker\"}]"
# 当要完全设置整个输入/模块配置时可使用 raw 提示,并提供输入配置的字符串化 JSON
# raw 会覆盖所有其他注解提示,用于创建单个或一系列配置

co.elastic.logs/processors: 
# 定义要添加到 Filebeat 输入/模块配置的处理器
# 为了提供处理器定义的排序,可提供数字。若没有则将进行任意的排序: (下例中标记为1的处理器将首先被执行)
#   co.elastic.logs/processors.1.dissect.tokenizer: "%{key1} %{key2}"
#   co.elastic.logs/processors.dissect.tokenizer: "%{key2} %{key1}"

# --------------------------------------------------------------------------- Reference

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true           # 开启对 Pod 注释中的提示的支持
      hints.default_config:         # 设置在发现新容器时使用的默认设置
        type: container
        paths:
          - /var/log/containers/*-${data.container.id}.log  # CRI path

# ......

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      hints.default_config.enabled: false
    # 也可以禁用默认设置,此时只会检索带有 "co.elastic.logs/enabled":"true" 注释的 Pod

# ......

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      add_resource_metadata:                        # 启用在命名空间设置默认值的功能
        namespace:                                  #
          include_annotations: ["nsannotation1"]    # 此处配置针对命名空间的注释内容 ...
# 提示可以在命名空间注释上设置默认值,从而在 Pod 级别的注释丢失时使用,该配置的结果是 Pod 注释和命名空间注释的组合(Pod 优先)

# ......

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true                           # Docker 自动发现提供程序支持标签中的提示

# ......

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true                           #
      hints.default_config:                         # 设置在发现新容器时使用的默认设置
        type: container
        paths:
          - /var/log/containers/*-${data.container.id}.log  # CRI path

# ......

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true
      hints.default_config.enabled: false
    # 也可以禁用默认设置,此时只会检索带有 "co.elastic.logs/enabled":"true" 注释的 Pod

<think>好的,用户之前已经询问了如何搭建ELK日志监控平台,现在他们想了解如何配置Filebeat客户端。我需要先回顾之前的对话,确保这次回答保持一致,并且补充详细的信息。 首先,用户可能已经按照之前的指南安装了Filebeat,但可能在配置过程中遇到了问题,或者需要更详细的配置说明。他们可能需要知道如何正确编辑filebeat.yml文件,指定日志路径、输出到Logstash或Elasticsearch,以及如何处理多行日志等常见需求。 我需要考虑用户的使用场景,可能是在生产环境中部署Filebeat来收集各种服务的日志,比如Nginx、应用日志等。用户可能对配置文件的各个部分不太熟悉,需要逐一解释input、output、modules等部分的作用。 此外,用户可能对高级配置感兴趣,比如多行日志处理、负载均衡、安全性设置(如TLS加密)以及如何启用模块来解析特定服务的日志。需要给出具体的配置示例和注释,帮助用户理解每个参数的意义。 还要注意常见的错误,比如路径配置错误、权限问题、端口不通等,应该在注意事项中提及,帮助用户避免这些问题。同时,验证步骤也很重要,用户需要知道如何确认Filebeat是否正常运行,日志是否成功发送到目标。 最后,用户可能希望进一步优化配置,比如使用Docker部署或者Kubernetes中的DaemonSet,这些可以作为进阶内容简要介绍,但不需要太深入,除非用户明确要求。 需要保持回答结构清晰,分点说明,使用代码块展示配置示例,确保用户能够轻松复制和调整配置。同时,语言要简洁明了,避免技术术语过多,必要时提供注释和说明。</think>### Filebeat客户端配置详解 FilebeatELK栈中的轻量级日志采集工具,负责从指定路径收集日志并转发给Logstash或Elasticsearch。以下是核心配置步骤及常见场景示例: --- #### **一、基础配置(`filebeat.yml`)** 1. **定义日志输入(Input)** 指定需要监控的日志文件路径,支持通配符和多个路径: ```yaml filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log # 监控单个文件 - /var/log/app/*.log # 通配符匹配目录下所有.log文件 tags: ["nginx", "prod"] # 添加标签方便过滤 ``` 2. **配置输出(Output)** **场景1:输出到Logstash**(推荐,适合数据预处理): ```yaml output.logstash: hosts: ["logstash-server:5044"] # Logstash服务器地址及端口 loadbalance: true # 启用负载均衡(多Logstash节点时) ``` **场景2:直连Elasticsearch**(简单场景): ```yaml output.elasticsearch: hosts: ["http://es-node1:9200", "http://es-node2:9200"] # ES集群节点 username: "filebeat_user" # 如果启用安全认证 password: "your_password" index: "custom-logs-%{+yyyy.MM.dd}" # 自定义索引名称 ``` 3. **多行日志合并**(如Java异常堆栈) 通过正则表达式合并多行日志为单条事件: ```yaml multiline.type: pattern multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}' # 匹配日志开头的时间格式 multiline.negate: true # 不匹配的行合并到上一行 multiline.match: after # 合并到匹配行的后面 ``` --- #### **二、高级配置** 1. **字段与标签增强** 添加自定义字段或覆盖默认元数据: ```yaml fields: env: "production" # 添加环境标识 project: "web-app" fields_under_root: true # 将字段提升到根级别(便于Kibana搜索) ``` 2. **处理器(Processors)** 对日志进行简单处理,例如: ```yaml processors: - drop_fields: # 删除无用字段 fields: ["log.offset", "host.name"] - dissect: # 提取结构化字段(示例:解析Nginx日志) tokenizer: "%{clientip} %{ident} %{auth} [%{timestamp}] \"%{verb} %{request} HTTP/%{httpversion}\" %{status} %{size}" field: "message" target_prefix: "nginx" ``` 3. **模块(Modules)** 使用预置模块快速解析常见服务日志(如Nginx、MySQL): ```bash ./filebeat modules enable nginx # 启用Nginx模块 ``` 模块配置路径:`modules.d/nginx.yml` ```yaml - module: nginx access: enabled: true var.paths: ["/var/log/nginx/access.log*"] error: enabled: true var.paths: ["/var/log/nginx/error.log*"] ``` --- #### **三、安全与加密** 1. **TLS加密传输** 启用SSL/TLS保护数据传输(以Logstash为例): ```yaml output.logstash: hosts: ["logstash:5044"] ssl.enabled: true ssl.certificate_authorities: ["/path/to/ca.crt"] # 证书路径 ``` 2. **权限控制** 限制日志文件读取权限: ```bash chmod 640 /var/log/app/*.log # 仅允许特定用户/组访问 chown root:filebeat /var/log/app/ # 设置Filebeat用户组 ``` --- #### **四、验证与调试** 1. **测试配置语法** ```bash ./filebeat test config -e # 检查配置文件语法 ./filebeat test output -e # 验证与Logstash/ES的连接 ``` 2. **查看运行状态** ```bash ./filebeat -e -c filebeat.yml # 前台运行并输出详细日志 ``` 3. **监控Filebeat指标** 启用监控端点: ```yaml http.enabled: true # 开启HTTP监控 http.port: 5066 # 默认端口 ``` 访问 `http://localhost:5066/stats` 查看采集状态。 --- #### **五、常见问题** 1. **日志未采集** - 检查`paths`配置的路径是否有读取权限。 - 查看Filebeat日志(默认路径:`/var/log/filebeat/filebeat`)。 2. **性能优化** - 调整`queue.spool`参数控制内存队列大小。 - 增加`max_procs`(CPU核数)提升处理速度。 --- #### **六、扩展场景** - **容器化部署**: 使用Docker时,挂载日志目录并指定配置: ```bash docker run -d --name filebeat \ -v /host/path/logs:/container/logs \ -v /host/path/filebeat.yml:/usr/share/filebeat/filebeat.yml \ docker.elastic.co/beats/filebeat:8.10.0 ``` - **Kubernetes DaemonSet**: 通过DaemonSet在每个节点部署Filebeat,收集容器日志(需配置`autoDiscover`)。 通过合理配置Filebeat,可实现高效、灵活的日志采集,满足从单机到分布式环境的多样化需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值