一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集
一、EFK简介
Elasticsearch:一个开源的分布式搜索和分析引擎,用于存储和查询日志数据。它是 EFK 的核心组件,负责高效地存储和检索日志信息。
Filebeat:一个轻量级的日志采集器,主要用于将日志文件数据发送到 Logstash 或 Elasticsearch。Filebeat 设计用于高效地转发和处理日志数据,具有低内存消耗和可靠的传输能力。
Kibana:一个开源的数据可视化平台,与 Elasticsearch 配合使用,用于创建图表、仪表板和报告,以便对日志数据进行分析和展示。
二、EFK 和 ELK 的对比
2.1、日志收集器
- EFK:使用 Filebeat 作为日志收集器。Filebeat 是一种轻量级的代理,专门用于转发日志数据到 Elasticsearch 或 Logstash。它易于配置和维护,适合处理大规模日志数据的转发。
- ELK:使用 Logstash 作为日志收集器。Logstash 提供了丰富的数据处理功能,可以对日志进行解析、过滤和增强,然后将其发送到 Elasticsearch。虽然功能强大,但配置和维护相对复杂。
2.2、配置和性能
- EFK:Filebeat 的设计目标是轻量化,适合在日志生成的主机上运行,性能高且资源消耗低。它能够高效地将日志数据传输到 Elasticsearch 或 Logstash,并且配置较为简单。
- ELK:Logstash 提供了强大的数据处理能力,但通常需要更多的系统资源。其复杂的配置和处理能力适合需要进行大量数据处理的场景。
2.3、数据管道
- EFK:Filebeat 直接将日志数据发送到 Elasticsearch 或 Logstash。它可以进行基本的日志采集和传输,但通常将更复杂的数据处理任务交给 Logstash 或直接到 Elasticsearch。
- ELK:Logstash 处理复杂的数据处理和转换任务,能够在数据到达 Elasticsearch 之前进行各种处理。这样可以将数据以最佳格式存储到 Elasticsearch 中,但也会增加系统的复杂性和资源消耗。
2.4、优势与区别
-
EFK 的优势在于 Filebeat 的轻量和高效,使得日志收集和传输过程更加简洁和低资源消耗。适合日志生成主机直接使用,减少了 Logstash 的负担。
-
ELK 通过 Logstash 提供了更多的数据处理和转换能力,适合处理复杂的日志数据处理需求。虽然功能强大,但配置和维护相对较复杂,资源消耗也较高。
当然 Logstash 相比于 FileBeat 也有一定的优势,比如 Logstash 对于日志的格式化处理能力,FileBeat 只是将日志从日志文件中读取出来,当然如果收集的日志本身是有一定格式的,FileBeat 也可以格式化,但是相对于Logstash 来说,效果差很多。
三、实验目的
- 使用EFK 的架构,去收集机器上docker 容器的日志
- 容器日志,主要包括 业务微服务本身暴漏出来 的 标准输出日志,直接输出在控制台上
- 使用 filebeat 去采集容器机器的标准输出日志,
/var/lib/docker/containers/*/*.log
filebeat.docker.yml
官方示例配置文件,可参考https://raw.githubusercontent.com/elastic/beats/8.15/deploy/docker/filebeat.docker.yml
四、部署
4.1 环境信息
efk 的镜像没有托管至dockerhub,请自行下载镜像
IP | 系统版本 | 软件名称+版本 | 镜像地址 |
---|---|---|---|
172.24.0.229 | openeuler 22.03 LTS SP4 | docker-20.10.24,filebeat:7.6.2 | docker.elastic.co/beats/filebeat:7.6.2 |
172.22.33.204 | openeuler 22.03 LTS SP4 | docker-20.10.24,docker-compose-2.10.2,elasticsearch-8.15.1,kibana:8.15.1,filebeat:7.6.2 | docker.elastic.co/elasticsearch/elasticsearch:8.15.1,docker.elastic.co/kibana/kibana:8.15.1,docker.elastic.co/beats/filebeat:7.6.2 |
4.2 安装docker,docker-compose
安装过程省略,可参考:
- CentOS 7安装docker并配置镜像加速 https://srebro.cn/archives/1709614927551
- Cenotos7 安装docker-compose https://srebro.cn/archives/Cenotos7%20%E5%AE%89%E8%A3%85docker-compose
4.3 使用docker-compose 编排EFK
以下操作在172.22.33.204 机器上完成
4.3.1 创建EFK 工作目录/数据目录/配置文件
4.3.1.1 创建elasticsearch 数据目录,并授权777
#创建efk工作目录
$ mkdir -p /home/application/efk
$ mkdir -p /home/application/efk/elasticsearch/data
$ chmod 777 /home/application/efk/elasticsearch/data
4.3.1.2 创建kibana数据目录,并授权777
$ mkdir -p /home/application/efk/kibana/data
$ chmod 777 /home/application/efk/kibana/data
4.3.1.3 创建filebeat配置文件
⚠️需要指定setup.kibana.host 根据自己的实际情况填写kibana地址
#创建 filebeat 工作目录
$ mkdir -p /home/application/efk/filebeat
$ vim /home/application/efk/filebeat/filebeat.docker.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
processors:
- add_host_metadata: ~ #用于将主机的元数据添加到每条日志记录中。这些元数据包括主机的名称、IP 地址、操作系统等信息。
- drop_fields:
ignore_missing: true # 字段不存在时不报错
fields: #过滤掉下面的字段
- "input_type"
- "log.offset"
- "host.name"
- "input.type"
- "agent.hostname"
- "agent.type"
- "ecs.version"
- "agent.ephemeral_id"
- "agent.id"
- "agent.version"
- "fields.ics"
- "log.file.path"
- "log.flags"
- "host.os.version"
- "host.os.platform"
- "host.os.family"
- "host.os.name"
- "host.os.kernel"
- "host.os.codename"
- "host.id"
- "host.containerized"
- "host.hostname"
- "host.architecture"
- "docker.container.labels.license"
- "docker.container.labels.com_docker_compose_image"
- "docker.container.labels.maintainer"
- "docker.container.labels.com_docker_compose_config-hash"
- "docker.container.labels.org_label-schema_schema-version"
- "docker.container.labels.org_label-schema_url"
- "docker.container.labels.org_label-schema_usage"
- "docker.container.labels.org_label-schema_vcs-url"
- "docker.container.labels.org_label-schema_vendor"
- "docker.container.labels.org_label-schema_license"
- "docker.container.labels.org_label-schema_vcs-ref"
- "docker.container.labels.org_opencontainers_image_documentation"
- "docker.container.labels.com_docker_compose_version"
- "docker.container.labels.com_docker_compose_service"
- "docker.container.labels.org_opencontainers_image_created"
- "docker.container.labels.org_label-schema_build-date"
- "docker.container.labels.org_label-schema_name"
- "docker.container.labels.org_label-schema_version"
- "docker.container.labels.org_opencontainers_image_licenses"
- "docker.container.labels.org_opencontainers_image_revision"
- "docker.container.labels.org_opencontainers_image_source"
- "docker.container.labels.org_opencontainers_image_title"
- "docker.container.labels.org_opencontainers_image_url"
- "docker.container.labels.org_opencontainers_image_vendor"
- "docker.container.labels.org_opencontainers_image_version"
- drop_event:
when:
or:
- contains:
container.name: "filebeat"
setup.kibana.host: "172.22.33.204:5601"
# 自定义模板和索引模式
setup.template.name: "srebro-log" # 定义索引模板的名称为 "srebro-log"。这个名称用于标识和应用模板。
setup.template.pattern: "srebro-*" # 定义索引名称的模式为 "srebro-*"。匹配所有以 "srebro-" 开头的索引名称。
setup.template.overwrite: true # 设置为 true 时,如果模板已经存在,将会覆盖现有模板。确保模板更新被应用。
setup.template.enabled: true # 启用模板设置,允许 filebeat 创建或更新索引模板。
# Elasticsearch 输出配置
output.elasticsearch:
hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
# 自定义索引前缀
index: "srebro-log-docker-%{+yyyy.MM.dd}"
indices:
- index: "srebro-log-docker-%{+yyyy.MM.dd}"
4.3.2 编写docker-compose 文件
⚠️ output.elasticsearch.hosts 根据自己的实际情况填写elasticsearch地址
$ cat >> /home/application/efk/docker-compose.yaml << EOF
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.1
container_name: elasticsearch
environment:
- node.name=elasticsearch
- discovery.type=single-node
- cluster.name=docker-cluster
- bootstrap.memory_lock=true
- xpack.security.enabled=false
# - ES_JAVA_OPTS=-Xms512m -Xmx512m
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
networks:
- elk-network
restart: always
kibana:
image: docker.elastic.co/kibana/kibana:8.15.1
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- I18N_LOCALE=zh-CN
volumes:
- ./kibana/data:/usr/share/kibana/data/
ports:
- "5601:5601"
networks:
- elk-network
restart: always
filebeat:
image: docker.elastic.co/beats/filebeat:7.6.2
container_name: filebeat
user: root
command: filebeat -e -strict.perms=false -E output.elasticsearch.hosts=["172.22.33.204:9200"]
volumes:
- ./filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- elk-network
restart: always
networks:
elk-network:
driver: bridge
EOF
4.3.2 运行EFK
#切换到efk工作目录下
$ cd /home/application/efk/
#下载镜像
$ docker-compose pull
#运行docker-compose
$ docker-compose up -d
[+] Running 4/4
⠿ Network elk_elk-network Created 0.1s
⠿ Container elasticsearch Started 0.6s
⠿ Container kibana Started 0.6s
⠿ Container filebeat Started 0.4s
$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
elasticsearch "/bin/tini -- /usr/l…" elasticsearch running 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp
filebeat "/usr/bin/tini -- /u…" filebeat running
kibana "/bin/tini -- /usr/l…" kibana running 0.0.0.0:5601->5601/tcp, :::5601->5601/tcp
4.4 使用docker 运行filebeat 采集器
以下操作在172.24.0.229 机器上完成
-
准备filebeat配置文件
⚠️ 需要指定kibana的地址
#创建 filebeat 工作目录
$ mkdir -p /home/application/efk/filebeat
$ vim /home/application/efk/filebeat/filebeat.docker.yml
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
processors:
- add_host_metadata: ~ #用于将主机的元数据添加到每条日志记录中。这些元数据包括主机的名称、IP 地址、操作系统等信息。
- drop_fields:
ignore_missing: true # 字段不存在时不报错
fields: #过滤掉下面的字段
- "input_type"
- "log.offset"
- "host.name"
- "input.type"
- "agent.hostname"
- "agent.type"
- "ecs.version"
- "agent.ephemeral_id"
- "agent.id"
- "agent.version"
- "fields.ics"
- "log.file.path"
- "log.flags"
- "host.os.version"
- "host.os.platform"
- "host.os.family"
- "host.os.name"
- "host.os.kernel"
- "host.os.codename"
- "host.id"
- "host.containerized"
- "host.hostname"
- "host.architecture"
- "docker.container.labels.license"
- "docker.container.labels.com_docker_compose_image"
- "docker.container.labels.maintainer"
- "docker.container.labels.com_docker_compose_config-hash"
- "docker.container.labels.org_label-schema_schema-version"
- "docker.container.labels.org_label-schema_url"
- "docker.container.labels.org_label-schema_usage"
- "docker.container.labels.org_label-schema_vcs-url"
- "docker.container.labels.org_label-schema_vendor"
- "docker.container.labels.org_label-schema_license"
- "docker.container.labels.org_label-schema_vcs-ref"
- "docker.container.labels.org_opencontainers_image_documentation"
- "docker.container.labels.com_docker_compose_version"
- "docker.container.labels.com_docker_compose_service"
- "docker.container.labels.org_opencontainers_image_created"
- "docker.container.labels.org_label-schema_build-date"
- "docker.container.labels.org_label-schema_name"
- "docker.container.labels.org_label-schema_version"
- "docker.container.labels.org_opencontainers_image_licenses"
- "docker.container.labels.org_opencontainers_image_revision"
- "docker.container.labels.org_opencontainers_image_source"
- "docker.container.labels.org_opencontainers_image_title"
- "docker.container.labels.org_opencontainers_image_url"
- "docker.container.labels.org_opencontainers_image_vendor"
- "docker.container.labels.org_opencontainers_image_version"
- drop_event:
when:
or:
- contains:
container.name: "filebeat"
setup.kibana.host: "172.22.33.204:5601"
# 自定义模板和索引模式
setup.template.name: "srebro-log" # 定义索引模板的名称为 "srebro-log"。这个名称用于标识和应用模板。
setup.template.pattern: "srebro-*" # 定义索引名称的模式为 "srebro-*"。匹配所有以 "srebro-" 开头的索引名称。
setup.template.overwrite: true # 设置为 true 时,如果模板已经存在,将会覆盖现有模板。确保模板更新被应用。
setup.template.enabled: true # 启用模板设置,允许 filebeat 创建或更新索引模板。
# Elasticsearch 输出配置
output.elasticsearch:
hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}'
# 自定义索引前缀
index: "srebro-log-docker-%{+yyyy.MM.dd}"
indices:
- index: "srebro-log-docker-%{+yyyy.MM.dd}"
- docker run 运行
⚠️ 需要指定elasticsearch的地址
$ docker run -d --name=filebeat --user=root --restart=always --volume="/home/application/efk/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" docker.elastic.co/beats/filebeat:7.6.2 filebeat -e -strict.perms=false -E output.elasticsearch.hosts=["172.22.33.204:9200"]
- 查看filebeat 的日志
$ docker logs -f filebeat
五、登录 kibana控制台,检索日志
- kibana web 控制台: http://172.22.33.204:5601/
- 创建索引
可以看到所有索引 srebro-log-docker*
- 创建数据视图
- 检索日志