目录
0、引言
学习记录 :Docker搭建 Elasticsearch + Logstash + Kibana + Filebeat
ELKB :7.7.0
服务器 : Centos 7.7.1908
本次主要介绍简单安装和收集配置,之后会整理从Redis,Mysql收集数据的思路及实测可用的配置。
每一项安装时我碰到的问题,我都会总结在最下面了。>>问题整理<<
1、流程
日志流规划
2、安装
拉取镜像就不啰嗦了,直接docker pull xxx;
2.1 创建bridge网络
# 创建网络,设置子网,网关
docker network create --driver bridge --subnet=172.28.0.0/16 --gateway=172.28.0.1 elkb
# 查看网络列表,可以看到刚刚创建的 名称为elkb的网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
43d968dd5106 bridge bridge local
ed78d4b05185 elkb bridge local
27d34658c92c host host local
8aabc48398e4 none null local
2.2 创建Elasticsearch容器
- 容器创建命令
指定容器网络,指定网络ip,绑定主机端口9200,9300
docker run -d --name elasticsearch --net elkb --ip 172.28.0.2 \
-p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:7.7.0
- 结果展示,浏览器直接访问 ip:9200
2.3 创建Kibana容器
- 容器创建命令
指定容器网络,指定网络ip,绑定主机端口5601
docker run -d --name kibana --net elkb --ip 172.28.0.3 \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:7.7.0
- 结果展示,直接浏览器访问 ip:5601
2.3 创建Logstash容器
- 容器创建命令
指定容器网络,指定网络ip,绑定主机端口5044
这个容器需要绑定目录,到服务器目录,因为需要修改配置文件
docker run -it -d --name logstash \
-p 5044:5044 --net elkb --ip 172.28.0.4 \
-v /mnt-docker/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /mnt-docker/logstash/conf.d/:/usr/share/logstash/conf.d/ \
docker.elastic.co/logstash/logstash:7.7.0
- 结果展示 : 因为logstash没有界面,而且启动很慢,所以需要等一下,查看容器的状态。
- 编辑配置文件
配置文件编辑完成,重启容器 docker restart logstash(名称/id)
# ===============logstash.yml logstash配置主文件=====
vim /mnt-docker/logstash/logstash.yml
# 写入下面的内容
# 加载目录下的所有以.conf结尾的规则文件
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
# ===============test.conf 第一个规则文件============
vim /mnt-docker/logstash/conf.d/test.conf
# 写入下面的内容
# 从beats接收数据,并输出到elasticsearch
input {
beats {
port => 5044
codec => "json"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "test-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
2.4 创建Filebeat容器
- 容器创建命令
指定容器网络,指定网络ip,
这个容器需要绑定目录,到服务器目录,因为需要修改配置文件
还多绑定了一个nginx目录方便收集日志测试
docker run --name filebeat --user=root -d --net elkb --ip 172.28.0.5 \
-v /var/log/nginx/:/var/log/nginx \
-v /mnt-docker/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /var/lib/docker/containers:/var/lib/docker/containers \
-v /var/run/docker.sock:/var/run/docker.sock \
docker.elastic.co/beats/filebeat:7.7.0
- 编辑配置文件
配置文件编辑完成,重启容器 docker restart filebeat(名称/id)
# ===============filebeat.yml filebeat收集日志============
vim /mnt-docker/filebeat/filebeat.yml
# 写入下面的内容 收集nginx运行日志,并写入logstash 172.18.0.4对应容器的ip
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
output.logstash:
hosts: ['172.18.0.4:5044']
好了,基础安装已经结束。
3、流程测试
软件已经安装好了,正常到这里,有访问日志,我们的Elasticsearch就已经收到数据了,可以通过Kibana创建Index patterns去分析检索了。
3.1 问题排查:docker logs
通过docker logs 命令查看容器启动和运行的输出日志。
使用logstash将收集的日志输出到控制台,通过logs 我们也可以查看数据格式。
# 查看某个容器的log输出 xxx替换成对应的 容器名称/容器id
docker logs -f -t xxx --tail 100
# 查看elasticsearch输出
docker logs -f -t elasticsearch --tail 100
通过logs,大多数运行中的问题都可以发现,我遇到的问题回忆整理下:
- 端口开放问题(我用的是阿里云的服务器,需要在防火墙和ECS控制台都操作下)
- 对应docker服务,ip写入错误(filebeat output配置,写错了logstash的ip)
4、问题整理
4.1 内存问题
因为我使用的阿里云2G内存的服务器,对。。。嗯。。。。
Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid132.log
error:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.tools.launchers.JvmErgonomics.flagsFinal(JvmErgonomics.java:126)
at org.elasticsearch.tools.launchers.JvmErgonomics.finalJvmOptions(JvmErgonomics.java:88)
at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:59)
at org.elasticsearch.tools.launchers.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:139)
at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:95)
解决方法:
# 搜索找到下面的文件,修改配置信息
find /var/lib/docker/overlay2/ -name jvm.options
# 结果
/var/lib/docker/overlay2/ee28c4597cf0691e769deb1b1e3d2a6e8192ec2127ee352eae9e838b875bbc02/diff/usr/share/logstash/config/jvm.options
/var/lib/docker/overlay2/91c5c75d5317968f899078644cf47bb98a8f2ff6428c4a57be4d40b8b9917abe/diff/usr/share/logstash/config/jvm.options
/var/lib/docker/overlay2/85e6a8ce14bbb386c13b82963c2fdb5527fa1227fbbe8e9854f09be9b4f848a0/diff/usr/share/elasticsearch/config/jvm.options
# 怎么操作,改什么
# vim 对应的路径
vim /var/lib/docker/overlay2/ee28c4597cf0691e769deb1b1e3d2a6e8192ec2127ee352eae9e838b875bbc02/diff/usr/share/logstash/config/jvm.options
# 找到到配置
-Xms2g
-Xmx2g
# 修改为 512m 或者更小的 256m
-Xms512m
-Xmx512m
4.2 容器冲突问题
报错如下 :
/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint
问题原因:
实际上并没有冲突的容器存在。
Docker服务启动时定义的自定义链Docker由于某种原因被清掉。
重启Docker服务即可重新生成自定义链Docker。
解决方法:
# 相关命令
systemctl restart docker 重启docker服务
systemctl stop docker 关闭docker
systemctl start docker 启动docker