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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Filebeat 是一个轻量级的开源日志文件数据收集器,它可用于将日志和事件数据从多个来源发送到诸如 Elasticsearch、Logstash、Kafka 等目的地。下面是 Filebeat 配置文件的详细解释: 1. `filebeat.inputs`: 这是一个数组,定义了要收集的日志文件的来源和类型。每个输入都包含一个 `type` 字段表示文件类型,如日志文件、系统日志等,以及相关的配置信息。 2. `filebeat.outputs`: 这也是一个数组,定义了将收集到的日志数据发送到的目的地。可以配置多个输出,例如 Elasticsearch、Logstash 等。每个输出通常包含一个 `hosts` 字段,表示要发送到的目标主机和端口。 3. `filebeat.modules`: 这是一个数组,定义了预定义模块的配置。预定义模块提供了对常见日志文件的结构化解析和分析功能,可以轻松集成到 Filebeat 中。 4. `filebeat.config.modules`: 这是一个布尔值,用于指定是否启用预定义模块。如果设置为 true,则 Filebeat 将加载并启用配置文件中定义的预定义模块。 5. `filebeat.autodiscover`: 这是一个对象,用于自动发现和动态管理容器化环境中的日志文件。可以根据特定的标签或其他条件自动配置输入。 6. `filebeat.registry.path`: 这是一个字符串,指定用于保存 Filebeat 状态和元数据的注册表文件的路径。注册表文件记录了已经发送的日志文件的位置,以便在重启后继续从上次中断的位置发送。 7. `filebeat.harvester.buffer_size`: 这是一个整数,表示每个 harvester(日志收集器)的缓冲区大小,用于在发送之前缓冲日志事件。 以上是一些常见的 Filebeat 配置文件的详细解释,你可以根据具体需求进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值