基于docker的ELK+filebeat+kafka环境部署
- ELK以及常用模式
- 环境部署
- 一、docker
- 二、centos
- 三、kafka
- 四、filebeat(centos容器中)
- 五、logstash
- 六、elasticsearch(es)
- 七、kibana
- 八、最后走一遍过程
- 九、docker-compose和dockerfile
ELK以及常用模式
什么是elk以及常用模式
环境部署
顺序:和log走向一直filebeat->kafka->logstash
环境:centos7虚拟机(首先要关闭防火墙,然后要关闭防火墙,最后关闭防火墙)
centos6.x用的是iptable,centos7.x用的是firewall
不关闭防火墙会导致容器之间不能通讯
一、docker
1、安装docker
yum install docker -y
2、启动docker
systemctl start docker
二、centos
- 拉取centos镜像
产生的log文件和filebeat运行在这个centos容器中
拉取镜像:
docker pull centos
完成之后可以使用docker images
查看镜像情况
- 制作centos容器
docker run -itd --name centos --privileged=true centos /sbin/init
这里需要使用–privileged=true获得root权限,才能使用systemctl等指令
使用docker ps
查看容器情况
三、kafka
主要参考了这篇文章
快速搭建kafka集群
可以再通过python操作一次kafka确定是可以正常工作的,同时要开启一个终端运行kafka的消费者脚本
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='10.211.55.4:32771') # 连接kafka
msg = "hello python kafka"".encode('utf-8')
producer.send('mykafka', msg)
producer.close()
遇到的坑:
- 创建容器,创建kafka的topic一切顺利,就是在生产者生产消息的时候报LEADER_NOT_AVALIBLE的错误,找了很多资料,无果。最后发现其实就是防火墙的问题,因为kafka基于zookeeper,需要在集群之间通讯。
- 在把防火墙设置为开机关闭后,重启虚拟机之后启动kafka容器,又报/var/run/docker.sock权限不足的问题,找了很多原因,也无果,回忆了一下,也就做了关闭防火墙这个操作,于是把防火墙又打开,重新创建了容器,又好了,具体为什么还不太清楚。
四、filebeat(centos容器中)
进入centos容器:
docker exec -it --privileged=true centos /bin/bash
安装wget:
yum install wget -y
在elastic官网找到下载地址
进入自己filebeat的目录
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.9.3-linux-x86_64.tar.gz
解压即安装
配置(.yml)如下:
filebeat.inputs:
- type: logenabled: truepaths:- /usr/log/elk.log
output.kafka:hosts: ["10.211.55.4:32770","10.211.55.4:32771","10.211.55.4:32769"]topic: 'mykafka'
- 默认的output是elasticsearch,需要注释掉
- output.kafka里的hosts的ip就是虚拟机的ip,端口需要在虚拟机上
docker ps
看一下映射的端口,这个端口可能根据kafka启动的情况变动,一定要注意,不然也会报错。后续应该要改一下这个端口映射,不可能一直修改配置。
配置完成之后启动filebeat
./filebeat -e -c filebeat.yml
然后向日志文件里加东西试试
echo "filebeat test" >> /usr/log/elk.log
kafka这边的消费者终端能收到东西就说明filebeat到kafka这里是好了
五、logstash
- 拉取logstash镜像
logstash的镜像没法直接pull logstash来拉取
我们在dockerhub中找到需要的版本,找到对应的dockerfile中的版本全名,如:docker.elastic.co/logstash/logstash:7.9.3
docker pull docker.elastic.co/logstash/logstash:7.9.3
完成之后可以使用docker images
查看镜像情况
- 制作logstash容器
docker run -itd -p 5044:5044 -p 5045:5045 --name logstash -e ES_JAVA_OPTS="-Xms1G -Xmx1G" logstash:7.9.3
使用docker ps
查看容器情况
进入logstash容器修改配置文件(也可以通过映射文件,在外面直接修改然后再启动容器)
logstash.yml:
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://10.211.55.4:9200" ]
elk.config:
input {kafka {bootstrap_servers => ["10.211.55.4:32771,10.211.55.4:32769,10.211.55.4:32770"]consumer_threads => 1topics => ["mykafka"]auto_offset_reset => "earliest"auto_commit_interval_ms => 1000}
}
output {stdout{}elasticsearch {hosts => "http://10.211.55.4:9200"index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"#user => "elastic"#password => "changeme"}
}
测试阶段可以在input里面加一个stdin{},可以通过控制台输入
启动logstash:
bin/logstash -f config/elk.config
可能会遇到这个报错
Logstash could not be started because there is already another instance using the
configured data directory. If you wish to run multiple instances, you must changethe "path.data" setting.
到data目录下删除.lock文件即可
六、elasticsearch(es)
es的镜像没法直接pull elasticsearch来拉取
我们在dockerhub中找到需要的版本,找到对应的dockerfile中的版本全名,如:docker.elastic.co/elasticsearch/elasticsearch:7.9.3
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.9.3
创建需要挂载的文件夹和配置文件
mkdir -p /opt/es/config
mkdir -p /opt/es/data
echo "http.host: 0.0.0.0" >> /opt/es/config/elasticsearch.yml
docker run --name es --privileged=true -p 9200:9200 -p 9300:9300-e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /opt/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/es/data:/usr/share/elasticsearch/data -v /opt/es/plugins:/usr/share/elasticsearch/plugins -d docker.elastic.co/elasticsearch/elasticsearch:7.9.3 /usr/sbin/init
- 要注意一点,这些相关的文件夹和elasticsearch.yml一定要自己创建出来,不然docker会帮你创建一个叫elasticsearch.yml的文件夹,又报一些莫名其妙的错误
- data文件夹需要给权限
chmod -R 777
不然没法创建下面相应的文件夹,大概就是会报node之类的文件夹没权限
其他没什么了,可以直接访问9200端口看看能不能用
七、kibana
和es一样,拉镜像,建容器
docker pull docker.elastic.co/kibana/kibana:7.9.3
docker run -d --restart=always --log-driver json-file
--log-opt max-size=100m --log-opt max-file=2 --name xinyar-kibana -p 5601:5601
-v /opt/elk/kibana.yml:/usr/share/kibana/config/kibana.yml
docker.elastic.co/kibana/kibana::7.9.3
也是直接浏览器访问5601端口即可,需要添加一些索引搜索之类的,需要自己研究一下,写起来比较麻烦,略过。
八、最后走一遍过程
filebeat加入日志
echo "elktest" >> /usr/log/elk.log
kafka消费:
bash-4.4# kafka-console-consumer.sh --bootstrap-server kafka_kafka-cluster_1:9092 from-beginning --topic mykafka
{"@timestamp":"2020-11-04T11:14:13.688Z","@metadata":{"beat":"filebeat","type":"_doc","version":"7.9.3"},"input":{"type":"log"},"agent":{"type":"filebeat","version":"7.9.3","hostname":"a630f42b741e","ephemeral_id":"fa366576-e93b-4c97-bda3-8ee53078552a","id":"b523dfc7-956b-4b17-a272-50befeccbd38","name":"a630f42b741e"},"ecs":{"version":"1.5.0"},"host":{"hostname":"a630f42b741e","architecture":"x86_64","os":{"name":"CentOS Linux","kernel":"3.10.0-1127.el7.x86_64","codename":"Core","platform":"centos","version":"8 (Core)","family":"redhat"},"id":"a630f42b741edd05d37d5cf9bb264c66","containerized":true,"ip":["172.17.0.3","fe80::42:acff:fe11:3"],"name":"a630f42b741e","mac":["02:42:ac:11:00:03"]},"message":"elktest","log":{"file":{"path":"/usr/log/elk.log"},"offset":6}}
logstash的stdout:
{"@timestamp" => 2020-11-04T11:14:16.176Z,"@version" => "1","message" => "{\"@timestamp\":\"2020-11-04T11:14:13.688Z\",\"@metadata\":{\"beat\":\"filebeat\",\"type\":\"_doc\",\"version\":\"7.9.3\"},\"input\":{\"type\":\"log\"},\"agent\":{\"type\":\"filebeat\",\"version\":\"7.9.3\",\"hostname\":\"a630f42b741e\",\"ephemeral_id\":\"fa366576-e93b-4c97-bda3-8ee53078552a\",\"id\":\"b523dfc7-956b-4b17-a272-50befeccbd38\",\"name\":\"a630f42b741e\"},\"ecs\":{\"version\":\"1.5.0\"},\"host\":{\"hostname\":\"a630f42b741e\",\"architecture\":\"x86_64\",\"os\":{\"name\":\"CentOS Linux\",\"kernel\":\"3.10.0-1127.el7.x86_64\",\"codename\":\"Core\",\"platform\":\"centos\",\"version\":\"8 (Core)\",\"family\":\"redhat\"},\"id\":\"a630f42b741edd05d37d5cf9bb264c66\",\"containerized\":true,\"ip\":[\"172.17.0.3\",\"fe80::42:acff:fe11:3\"],\"name\":\"a630f42b741e\",\"mac\":[\"02:42:ac:11:00:03\"]},\"message\":\"elktest\",\"log\":{\"file\":{\"path\":\"/usr/log/elk.log\"},\"offset\":6}}"
}
最后就是kibana的web界面,内容都差不多,截图不太方便,就不发了
九、docker-compose和dockerfile
后续看看能不能把这些合并起来