前言

filebeat通过调用docker或k8s的api 发现容器或pod,根据获取到的信息来收集日志。
官网详解

Providers类型

docker

配置示例:

filebeat.autodiscover:
  providers:
    - type: docker
      templates:
        - condition:   # 满足条件的才采集
            contains:
              docker.container.image: redis
          config:
            - module: redis   # 使用filebeat自带的redis日志模板,也可以不使用
              log:
                input:
                  type: container
                  paths:
                    - /var/lib/docker/containers/${data.docker.container.id}/*.log

在key值上面不需要用data引用,就比如上面示例的docker.container.image。在value值上面需要用data引用,就比如上面配置示例的${data.docker.container.id}

配置模板中可以使用的字段

  • host
  • port
  • docker.container.id
  • docker.container.image
  • docker.container.name
  • docker.container.labels

示例:

{
  "host": "10.4.15.9",
  "port": 6379,
  "docker": {
    "container": {
      "id": "382184ecdb385cfd5d1f1a65f78911054c8511ae009635300ac28b4fc357ce51",
      "name": "redis",
      "image": "redis:3.2.11",
      "labels": {
        "io.kubernetes.pod.namespace": "default"
        ...
      }
    }
  }
}

通过data可以引用对应的字段,比如上面的示例使用${data.port}就是6379。

kubernetes

配置示例:

filebeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        - condition:   # 满足条件的才采集
            equals:
              kubernetes.container.image: "redis"
          config:
            - module: redis   # 使用filebeat自带的redis日志模板,也可以不使用
              log:
                input:
                  type: container
                  paths:
                    - /var/log/containers/*-${data.kubernetes.container.id}.log

配置模板中可以使用的字段

  1. 通用字段

    • host
    • port (exposed)
    • kubernetes.labels
    • kubernetes.annotations
  2. pod字段

    • kubernetes.container.id
    • kubernetes.container.image
    • kubernetes.container.name
    • kubernetes.namespace
    • kubernetes.node.name
    • kubernetes.pod.name
    • kubernetes.pod.uid
  3. node字段

    • kubernetes.node.name
    • kubernetes.node.uid
  4. svc字段

    • kubernetes.namespace
    • kubernetes.service.name
    • kubernetes.service.uid
    • kubernetes.annotations

示例:

{
  "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"
    }
  },
}

通过data可以引用对应的字段,比如上面的示例使用${data.port}就是9090。

配置模板中的condition

支持的条件包括:

  • equals:等于,只能接受整数或字符串。
  • contains:包含,只能接受字符串。
  • regexp:正则匹配。
  • range:范围
    • lt:小于
    • lte:小于等于
    • gt:大于
    • gte:大于等于
  • network:是否在某个IP网络范围内。
  • has_fields:是否存在指定字段。
  • or:或
  • and:与
  • not:非

基于提示的自动发现

在 Kubernetes Pod 注释或 Docker 标签中找到带有前缀co.elastic.logs,并按照这个前缀的配置进行日志采集。

配置示例:

filebeat.autodiscover:
      providers:
        - type: kubernetes or docker
          node: ${NODE_NAME} # output时增加一个node字段
          hints.enabled: true # 开启基于提示的自动发现
          hints.default_config:
            type: container
            paths:
              - /var/log/containers/*${data.kubernetes.container.id}.log
  1. co.elastic.logs/enabled:默认是true采集所有容器日志,改为false的话会忽略该容器日志。
  2. co.elastic.logs/multiline.*:多行日志处理方式。
  3. co.elastic.logs/json.*:json解析模式处理。
  4. co.elastic.logs/include_lines:只收集匹配正则表达式的行。
  5. co.elastic.logs/exclude_lines:排除匹配正则表达式的行。
  6. co.elastic.logs/module:使用filebeat的日志模板。
  7. co.elastic.logs/fileset:文件集,还不知道具体怎么使用。
  8. co.elastic.logs/raw:将 filebeat.input 的配置转换成 json 字符串形式表示。
  9. co.elastic.logs/processors:配置处理器,filebeat的处理器有很多,还得具体了解下官网

高级用法appenders

由于很多配置可能是默认动态生成的,所以可能存在特殊情况不能使用默认配置。

配置示例:

filebeat.autodiscover:
  providers:
    - type: kubernetes
      templates:
        ...
      appenders:
        - type: config
          condition.equals:
            kubernetes.namespace: "prometheus"
          config:
            fields:
              type: monitoring

上面的配置是指满足kubernetes命名空间是prometheus条件的时候,则应用config的配置。如果不满足,则应用默认配置。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐