环境与前言

centos7.x docker 20.x elk+filebeat 统一是7.14.0 本人大三,在一家小公司实习,最近公司里发版测试环境使用docker,觉得是时候学习一下docker了 于是学习了一下docker 不得不说上手之后很香。推荐到菜鸟教程学习,连接:Docker教程。学习完了部署了一下elk,也是在实习的时候接触到的,elk可以收集过滤分析日志,学习了一下。附上官网连接:ElasticSearch: 权威指南 Logstash 文档 Kibana 文档 Filebeat 文档 目前来说我只是单纯的使用,没有太过认真的去攻读这些文档,我只读了我用到的和一些配置的章节。以后有时间在慢慢学习下去吧,对这一块还算有点兴趣。

架构简介

简介与他们之间的联系

  • Elasticsearch : 是一个分布式、RESTful 风格的搜索数据分析引擎。
  • Logstash : 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据转换数据,然后将数据发送到您最喜欢的“存储库”中。
  • Kibana : 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。
  • Filebeat : 无论是从安全设备、云、容器、主机还是 OT 进行数据收集Filebeat 都将为您提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁杂。

联系草图:

描述: 通过filebeat从文件控制台等日志源中收集日志,发送给logstash,logstash进行过滤存储到elasticsearch,kibanaelasticsearch中读取数据进行分析处理等。

个人认为日志这东西是非常重要的,开发过程中程序跑不完善的日志可以快速排查定位错误原因。线上就更不用说了,没有错误日志咋死的都不知道。用过log4j的都说好,本次实验就使用log4j将日志输出到文本中。然后通过filebeat收集日志,再通过filebeat输出到logstash,logstash有过滤的能力,在通过logstash输出到elasticsearch进行存储,在通过Kibana查看分析什么的。废话讲完下面开始操作。

镜像下载

说明也许多年后的你看到这篇文章这里的很多东西都已经过时了,但整个流程应该不会相差甚远,希望能帮你找到真个思路而不是ctrl cv。

ElasticSearch

docker 中查找镜像 docker search [你想找地镜像]

1
docker search elasticearch

'控制台中搜索'

也可以去

Docker Hub

搜索:

'dockerhub中搜索'

点进去能看到版本号 我直接下载最新版7.14.0

1
docker pull elasticearch:7.14.0

access denied for elasticearch, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied 报这个错你就docker login登录 至于没有账号就去注册。下面的下载都是这样不在赘述。

filebeat

拉取镜像:

1
docker pull docker.elastic.co/beats/filebeat:7.14.0

logstash

拉取镜像:

1
docker pull logstash:7.14.0

kibana

拉取镜像:

1
docker pull kibana:7.14.0

下载完成运行命令看一眼

1
docker images

配置运行

顺序说明

说一下,按我的习惯是按照依赖的顺序来启动的。聪明的你想按照什么顺序都一样。

1 . Elasticsearch

启动

1
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d --net elk-net --name es elasticsearch:7.14.0

参数说明 : -p : 端口映射,将本机的9200映射到容器里的9200端口,访问localhost:9200就会访问到容器的9200. -e 环境变量 意思是将elasticsearch设置成单机运行 -d : 后台运行,–net :设置网络属于elk-net (你要是没有的话去简历或者不填这个配置)–name 设置容器的名字,不然的话默认一大串字母每次看日志还要ps一下多恶心你说是吧。

查看启动情况

两种方式:

  1. docker ps -a

STATUS 顾名思义状态,是UP就ok,不是的话使用第二种方式看启动日志看看报的什么错然后去百度怎么解决。

  1. docker logs -f es

当然可以直接访问机器ip:9200查看有没有跑起来。

到此为止用来存储的Elasticsearch启动完成丢在一边就完事了。值得一提的是,写这篇文章的时候,作者仅仅在摸鱼时(实习除了crud还是想弄一弄其他东西的,嘎嘎嘎)刚搭建完成最基本的elk,能跑,有许多配置包括安全什么的作者都没有去配置,这仅仅只是一篇没有营养的搭建教程。

2 . Kibana

编辑配置文件

在本地新建一个kibana的配置文件对应kibana中的/config/kibana.yml

1
2
3
4
// 递归创建文件夹
mkdir -p /home/docker/elk/kibana
// 创建编辑配置文件
vi /home/docker/elk/kibana/kibana.yml

这是kibana.yml内容:

1
2
3
4
server.host: "0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://你的ip:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

朋友,记得把‘’你的ip‘’换成你的机器ip

启动

1
docker run -v /home/docker/elk/kibana:/config -p 5601:5601 -d --net elk-net --name kibana kibana:7.14.0

参数解释: :-v : 挂载本地的文件夹到容器中config文件夹 -p : 端口映射 -d : 后台运行 --net :将容器加入指定网络 --name : 给容器起个名字。

查看启动效果

  1. docker ps -a
  2. docker logs -f kibana
  3. 浏览器访问 http://你的ip:5601
    如果一切顺利你将看到如下画面:

小提示: 也许你在按照上面步骤ctrl cv之后并没有达到预期的效果,这是很正常的,生活总会事与愿违,你可能会看到页面一行没有准备好的英文,你在logs看到日志里有error告诉你elasticsearch节点信息查询不到等等等等。直接百度。作者也做过很多尝试,给你看看history,最后在es节点自测没有问题的情况下,我给你提供一个最终的解决方案。进入容器,直接修改容器里的配置文件,保存退出后重启容器,命令如下:进入容器:bash docker exec -it kibana /bin/bash打开/config/kibana.yml配置文件:bash vi /config/kibana.yml如果你打开看到elasticsearch.hosts: [ "elasticsearch:9200" ]那说明问题就出现在这,这是默认的,你只需要把elasticsearch改成你自己的地址,保存退出:wq输入exit退出容器,输入docker restart kibana重启容器即可。

至此elasticsearch和kibana启动完成。至于在kibana中操作查看es的内容自行百度,或者直接看官网也是可以的。
下面是filebeatlogstash的启动:

3 . Logstash

配置文件

1
2
3
4
5
// 创建配置文件的文件夹
mkdir -p /home/docker/elk/logstash/
// 创建并编辑配置文件
vim /home/docker/elk/logstash/logstash.yml
vim /home/docker/elk/logstash/logstash.conf

logstash.yml

1
2
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: elasticsearch机器的ip:9200

logstash.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input {
beats {
port => 4567
}
}
filter {
#Only matched data are send to output.
}
output {
elasticsearch {
hosts => ["http://elasticsearch机器ip:9200"] #ElasticSearch host, can be array.
index => "logapp-%{+YYYY.MM}" #The index to write data to.
}
}

启动

1
docker run -d -p 4567:4567 --net elk-net --name logstash -p 5044:5044 -p 5045:5045 -v /home/docker/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /home/docker/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml logstash:7.14.0

小提示:配置文件中分为三个模块,input,filter,output很好理解,就是把东西通过input输入,通过filter过滤,通过output输出。其中input中的beats插件就是我们下面要启动的filebeatfilebeat通过4567端口将收集的日志发送给logstash,当然想用哪个端口随便你。
启动完别忘了看看有没有启动成功,docker ps …,docker logs ….

4 . Filebeat

配置文件

新建需要收集的日志文件:

1
2
mkdir -p /var/log/logapp
vim /var/log/logapp/app.info.log

然后在里面随便写点东西,我就写了一个test,真实环境中我们往往会收集nginx,java应用等的日志文件,这里我们就直接新建模拟一下了。

1
2
mkdir -p /home/docker/elk/filebeat/
vim /home/docker/elk/filebeat/filebeat.yml

filebeat.yml

1
2
3
4
5
6
filebeat.inputs:
- type: log
paths:
- /var/log/logapp/app.info.log
output.logstash:
hosts: ["logstash的ip:4567"]

注意:这里把你的ip换上去,这就是前面logstash配置文件input1beats监听的端口。
这里的缩进什么的都别丢了,严格按照yaml格式,不然就会报错。input中就是要收集的东西,我们收集一个刚刚我们新建的日志,paths里填上刚刚新建的日志文件的地址。

启动

1
docker run -u root -v /var/log/logapp:/var/log/logapp:rw -v /home/docker/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro -e setup.kibana.host=你的kibana机器的ip:5601 -d --name filebeat --net elk-net docker.elastic.co/beats/filebeat:7.14.0

注意:记得把ip换成你的kibana的ip。
到此全部正常的话就算是整合完成了。让我们打开kibana操作一波看一下效果。

查看效果

浏览器输入http://kibana的ip:5601进入kibana:

选择管理:

选择索引配置:

创建:

输入之前配置文件中写的logapp下一步:

选择时间戳创建:

点击侧边栏,选择Discover:

选择刚刚创建的pattern:

这一条数据就是创建文件是写的test:

这时去echo写入一条hello elk回到kibana查看:


搜索一下:

好了,至此elk的基础搭建就完成了。至少是跑起来了,至于想要实现些什么,就去配置文件里配置就行。