kubernetes 场景下的 filebeat autodiscover 自动发现功能说明
# 在容器内运行应用时会成为 "移动目标"# 自动发现允许对其跟踪并在发生变化时调整设置,自动发现子系统通过定义配置模板可以在服务开始运行时对其进行监控# 可在 filebeat.yml 中通过 filebeat.autodiscover.* 来定义自动发现设置# -------------------------------------------------------------- Dock
·
# 在容器内运行应用时会成为 "移动目标"
# 自动发现允许对其跟踪并在发生变化时调整设置,自动发现子系统通过定义配置模板可以在服务开始运行时对其进行监控
# 可在 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
更多推荐
所有评论(0)