一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集

news/2024/12/21 21:09:13/

一、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

image-20240912182231392

四、部署

4.1 环境信息

efk 的镜像没有托管至dockerhub,请自行下载镜像

IP系统版本软件名称+版本镜像地址
172.24.0.229openeuler 22.03 LTS SP4docker-20.10.24,filebeat:7.6.2docker.elastic.co/beats/filebeat:7.6.2
172.22.33.204openeuler 22.03 LTS SP4docker-20.10.24,docker-compose-2.10.2,elasticsearch-8.15.1,kibana:8.15.1,filebeat:7.6.2docker.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/*.ymlreload.enabled: falsefilebeat.autodiscover:providers:- type: dockerhints.enabled: trueprocessors:- 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.1container_name: elasticsearchenvironment:- node.name=elasticsearch- discovery.type=single-node- cluster.name=docker-cluster- bootstrap.memory_lock=true- xpack.security.enabled=false# - ES_JAVA_OPTS=-Xms512m -Xmx512mvolumes:- ./elasticsearch/data:/usr/share/elasticsearch/dataports:- "9200:9200"networks:- elk-networkrestart: alwayskibana:image: docker.elastic.co/kibana/kibana:8.15.1container_name: kibanaenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200- I18N_LOCALE=zh-CNvolumes:- ./kibana/data:/usr/share/kibana/data/ports:- "5601:5601"networks:- elk-networkrestart: alwaysfilebeat:image: docker.elastic.co/beats/filebeat:7.6.2container_name: filebeatuser: rootcommand: 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:ronetworks:- elk-networkrestart: alwaysnetworks:elk-network:driver: bridgeEOF

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/*.ymlreload.enabled: falsefilebeat.autodiscover:providers:- type: dockerhints.enabled: trueprocessors:- 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

image-20240913191451112

五、登录 kibana控制台,检索日志

  • kibana web 控制台: http://172.22.33.204:5601/

image-20240912213801915

  • 创建索引

image-20240912213944463

可以看到所有索引 srebro-log-docker*

image-20240913191704488

  • 创建数据视图

image-20240913191737522

image-20240913191820949

  • 检索日志

image-20240913191916799


http://www.ppmy.cn/news/1527263.html

相关文章

RFID射频模块(MFRC522 STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 MFRC522.h文件 MFRC522.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 RC522 RFID射频模块是一款广泛应用于非接触式RFID系统中的核心组件&#xff0c;由NXP&…

裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么

目录 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么 裸金属服务器提供者怎么做 租户怎样使用 共享平台需要搭建什么 裸金属服务器怎么实现算力共享,裸金属服务器提供者怎么做,租户怎样使用,共享平台需要搭建什么 裸金属…

xshell密钥方式连接阿里云Linux

前提条件 有阿里云ECS linux实例安装好xshell工具 步骤 创建密钥对并绑定ECS实例 浏览器登录阿里云-->控制台-->ECS服务器-->网络与安全-->密钥对-->创建密钥对 根据提示填写密钥名称-->选中默认资源组-->创建 创建完成&#xff0c;会自动下载密钥对的…

【Qt笔记】QScrollArea控件详解

目录 引言 一、QScrollArea 的基本概念 二、QScrollArea 的主要属性 2.1 设置内容大小是否随滚动区域变化 2.2 设置水平与垂直滚动条 2.3 设置视口外边距 三、QScrollArea 的常用方法 3.1 设置显示小部件 3.2 返回当前设置的小部件 3.3 设置内部小部件是否可以填充…

一、机器学习算法与实践_02KNN算法笔记

1、KNN基本介绍 1.1 定义 KNN&#xff08;K-NearestNeighbor&#xff0c;即&#xff1a;K最邻近算法&#xff09;是一种基于实例的学习方法&#xff0c;用于分类和回归任务&#xff0c;它通过查找一个数据点的最近邻居来预测该数据点的标签或数值。 所谓K最近邻&#xff0c;…

yolov8-obb中存在的一个bug

yolov8支持OBB目标检测,且能提供较好的性能。 但是最近在使用yolov8-obb的过程中,发现yolov8-obb存在一个bug。即训练数据如果包含不带旋转角度的水平目标时,训练出的模型,经常会输出垂直的检测框,需要旋转90度以后才能得到最终结果。把yolov8-obb相关的源码阅读一遍才发…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

集群聊天服务器项目【C++】(三)muduo库的简单介绍

在上一讲中介绍了Json库的相关知识&#xff0c;本次接着介绍muduo库的相关内容&#xff0c;这些知识在本项目中都会使用到。 1.muduo库简介 muduo库顶层就是epoll&#xff08;IO复用技术&#xff09; Linux的pthread多线程&#xff0c;所以只能安装在Linux系统中。此外它依赖…