Docker安装部署FELK简单实践

简介

ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。

  1. Elasticsearch:分布式搜索和分析引擎,具有高可伸缩、高可靠和易管理等特点。基于 Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作。

  2. Logstash:数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;

  3. Kibana:数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示;

  4. Filebeat作为一个轻量级的日志传输工具,是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。
      Filebeat 的可靠性很强,可以保证日志 At least once 的上报,同时也考虑了日志搜集中的各类问题,例如日志断点续读、文件名更改、日志 Truncated 等。
      Filebeat 并不依赖于 ElasticSearch,可以单独存在。我们可以单独使用Filebeat进行日志的上报和搜集。filebeat 内置了常用的 Output 组件, 例如 kafka、ElasticSearch、redis 等,出于调试考虑,也可以输出到 console 和 file 。我们可以利用现有的 Output 组件,将日志进行上报。目前Beats包含以下几种种工具:

  • filebeat(搜集日志文件)
  • Metricbeat(将系统和服务的指标和统计数据(例如 CPU、内存、Redis 等等)发送至 Elasticsearch(或 Logstash))
  • Packetbeat(搜集网络流量数据)
  • Winlogbeat(搜集 Windows 事件日志数据)
  • Auditbeat(收集 Linux 审计框架数据,对消息进行解析和标准化,并检测文件的完整性)
  • Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
  • Heartbeat(通过主动探测来监控服务可用性)
  • Functionbeat(针对云端数据的无服务器式全新采集器)

准备工作

本次暂时没有添加Logstash,只是使用了Filebeat+ElasticSearch+kibana,通过Filebeat收集日志信息发送到Es,通过Es存储数据,通过Kibana展示数据。

  1. 下载镜像

由于ELK作为一组服务,在下载镜像或者下载软件时候一定要注意保证版本统一,否则可能导致不同版本不兼容的情况。

#Elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.6.1

#Logstash
docker pull docker.elastic.co/logstash/logstash:7.6.1

#Kibana
docker pull docker.elastic.co/kibana/kibana:7.6.1

#Filebeat
docker pull docker.elastic.co/beats/filebeat:7.6.1

#elasticsearch-head  es的ui
docker pull mobz/elasticsearch-head:5
  1. 目录结构

添加目录结构如下:
Docker安装部署FELK简单实践_第1张图片

command.txt为每个软件启动的命令,.bak为备份的配置文件,elasticsearch/data/nodes为挂载的数据盘生成的数据,password.txt为es生成密码保存的文件,其他则为需要提前准备好的配置文件或者挂在目录,

  1. 配置文件
  • elasticsearch.yml
# 配置es的集群名称
cluster.name: "docker-cluster"
# 0.0.0.0为不限制,生产环境请设置为固定IP
network.host: 0.0.0.0
# 开启x-pack安全验证 访问时需要密码
xpack.security.enabled: true
# 关闭跨域验证(可以不开启)
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length

易错点
此处有一个我在搭建过程中卡了很长时间的问题,就是es和eshead启动成功,通过head连接es怎么连接都报错,但是直接访问es是好的,打开eshead前端页面控制台查看发现是报了跨域,然后在网上找了很多帖子,都说只需要配置上面的配置文件中的http.cors.enabled和http.cors.allow-origin这两行就行,但是我在开始配置的就加上了,但是还是报跨域,最终通过qq群里一个大神提醒,加上了最后一行配置重启,立马解决,在此感谢。

  • filebeat.yml
filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

# 收集系统日志
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages/fp_epower-info-2022-07-15*.log
  #多行换行配置(如果日志存在多行的情况需要配置)现在配置的意思就是不为[开头的都是上面一行的结尾,不作为单独行
  multiline:
    #将以不为[开头
    pattern: '^\['
    #定义模式是否被否定
    negate: true
    #如何吧多行合并成一行
    match: after

    #filebeat.autodiscover:
    #  providers:
    #    - type: docker
    #      hints.enabled: true
    #processors:
        #- add_cloud_metadata: ~
#输出到es
output.elasticsearch:
  hosts: '192.168.100.98:9200'
  username: 'elastic'
  password: '4BT5mSA2Weshq4zbNH1U'
  indices:
    #索引
    - index: "filebeat-%{+yyyy.MM}"
  #输出到文件
  #output.file:
  #  path: "/var/log/messages"
  #  filename: "filebeat.txt"

我的日志文件的格式如下:

[2022-07-15 16:25:56:056] [f4bce5afd8214a988095590f61d9c9b9] [INFO ] [http-nio-9003-exec-8] [LogRequestInterceptor.java:54] : [调用接口:/market/mapData/getWeather] [调用请求参数:{"cityCode":"140100"}] 
[2022-07-15 16:29:32:032] [f3d82c0d0e8c497190266004ff1ab70a] [INFO ] [http-nio-9003-exec-1] [LogRequestInterceptor.java:54] : [调用接口:/market/mapData/getWeather] [调用请求参数:{"cityCode":"140100"}] 
  • kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.100.98:9200" ]
elasticsearch.username: elastic
elasticsearch.password: 4BT5mSA2Weshq4zbNH1U
xpack.monitoring.ui.container.elasticsearch.enabled: true
#汉化
i18n.locale: "zh-CN"
  1. 启动
  • elasticsearch
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -v /usr/local/amx/elk/elasticsearch/data:/usr/share/elasticsearch/data -v /usr/local/amx/elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --privileged=true docker.elastic.co/elasticsearch/elasticsearch:7.6.1
  • filebeat
docker run -d --name=filebeat --restart=always -v /usr/local/amx/elk/filebeats/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /usr/local/epower/huaneng/test/logs:/var/log/messages docker.elastic.co/beats/filebeat:7.6.1
  • kibana
docker run -d -p 5601:5601 --name=kibana -v /usr/local/amx/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml docker.elastic.co/kibana/kibana:7.6.1
  • elasticsearch-head
docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5

启动以后连接es,在浏览器输入http://192.168.100.98:9100/?auth_user=elastic&auth_password=4BT5mSA2Weshq4zbNH1U
然后再界面输入es的ip和端口点击“连接”,如果集群健康值出现黄色或者绿色代表已经连接成功。

大坑

在我配置好了filebeat和es和eshead并且启动以后,通过查看eshead发现索引可以出现,但是通过索引查看数据就是一直查询,又通过页面的控制台查看报错,这次的报错为{“error”:“Content-Type header [application/x-www-form-urlencoded] is not supported”,“status”:406} 又是一顿分析和查资料,最终发现eshead中发起请求定义的是就是application/x-www-form-urlencoded,我们需要改成application/json;charset=UTF-8,修改步骤如下:

#进入eshead的容器
docker exec -it 容器id bash

#更新源
apt-get update

#安装vim编辑器

apt-get install vim

#进入 _site
cd _site

# 打开vendor.js,需要修改文件中的6886 和 7575两行中的application/x-www-form-urlencoded为application/json;charset=UTF-8
# vi直接到某一行的快捷方式,在命令模式下输入 :行号即可。
vi vendor.js


# 退出容器
exit

#重启容器
docker restart 容器id
  1. 查看数据
  • elastichseach
    通过eshead连接好es以后,在页面选择“基本查询”,搜索中选择你在filebeat中制定的index,点击“搜索”,如果看到数据说明filebeat已经收集到数据并且传送给es。
  • kibana
    通过ip:5601打开kibana页面,用es的账号密码登录
    1. 在首页选择“索引模式”
    2. 创建索引模式
    3. 定义索引模式,此时正常情况下下面列表已经出现es的索引
    4. 配置设置
    5. 索引模式创建完成,
    6. 左侧菜单“discover” 就可以看到日志的分析情况了。

你可能感兴趣的:(运维,elasticsearch,搜索引擎,Filebeat,Kibana,Elk)