Docker快速部署ELK

前言

因为最近需要部署日志收集系统,而网上部署elk的方式多种多样,参差不齐,在尝试后总结出一种快速有效的部署方法

ELK简介

ELK Stack是软件集合ElasticsearchLogstashKibana的简称,由这三个软件及其相关的组件可以打造大规模日志实时处理系统

  • Elasticsearch 是一个基于 Lucene 的、支持全文索引的分布式存储和索引引擎,主要负责将日志索引并存储起来,方便业务方检索查询

  • Logstash是一个日志收集、过滤、转发的中间件,主要负责将各条业务线的各类日志统一收集、过滤后,转发给 Elasticsearch 进行下一步处理

  • Kibana是一个可视化工具,主要负责查询 Elasticsearch 的数据并以可视化的方式展现给业务方,比如各类饼图、直方图、区域图等

Docker部署

最好使用4G内存40G磁盘的服务器,是在没有可以暂时使用虚拟机进行实验

创建容器之间的通信网络

1
docker network create docker_elk_test

拉取镜像

1
2
3
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.0
docker pull docker.elastic.co/kibana/kibana:7.3.0
docker pull docker.elastic.co/logstash/logstash:7.3.0

部署elasticsearch

1
2
3
4
创建配置文件,文件位置可有自己选择
mkdir /usr/elk/elastic
cd /usr/elk/elastic
vim elasticsearch.yml
1
2
3
4
5
6
7
cluster.name: "docker-cluster"
#配置elasticsearch远程访问
network.host: 0.0.0.0
#不允许es根据磁盘情况来分配shard 防止磁盘不够时不能写数据
#cluster.routing.allocation.disk.threshold_enabled: false
#磁盘占有率达到99%时将不允许往es写数据,只能读数据 默认95%
#cluster.routing.allocation.disk.watermark.flood_stage: 99%

docker 部署

1
docker run -it -d --name es_test -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 -v /usr/elk/elastic/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml --network docker_elk_test -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.3.0
1
2
3
4
5
6
# 指定jjvm运行参数 最大最小内存
-e ES_JAVA_OPTS="-Xms256m -Xmx256m"
# 指定通信网络
--network docker_elk_test
# 指定单节点部署
-e "discovery.type=single-node"

启动后在本机上查看 localhost:9200

image-20211015092848637

部署kibana

1
2
3
mkdir /usr/elk/kibana
cd /usr/elk/kibana
vim kibana.yml
1
2
3
4
5
6
7
8
server.name: kibana
# 配置Kibana的远程访问
server.host: "0.0.0.0"
# 配置es访问地址
elasticsearch.hosts: [ "http://xx.xx.xx.xx:9200" ]
# 汉化界面
i18n.locale: "zh-CN"
xpack.monitoring.ui.container.elasticsearch.enabled: true

docker 部署

1
docker run -it -d -p 5601:5601  -v /usr/elk/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml -v /etc/localtime:/etc/localtime -e ELASTICSEARCH_URL=http://xx.xx.xx.xx:9200 --network=docker_elk_test --name kibana_test docker.elastic.co/kibana/kibana:7.3.0

启动后本机查看 localhost:5601

image-20211015093911524

部署logstash

1
2
3
4
5
6
mkdir /usr/elk/logstash/config
cd /usr/elk/logstash/config
vim logstash.yml
mkdir /usr/elk/logstash/pipeline
cd /usr/elk/logstash/pipeline
vim logstash.conf

logstash.yml

1
2
3
4
# 配置logstash远程访问
http.host: "0.0.0.0"
# 配置es访问地址
xpack.monitoring.elasticsearch.hosts: [ "http://xx.xx.xx.xx:9200" ]

logstash.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
input {
file {
type => "systemlog-localhost"
#指定文件采集路径
path => "/var/log/game/*.log"
#指定收集json格式
codec => json {
charset => "UTF-8"
}
#开始收集点
start_position => "beginning"
#扫描间隔时间,默认是1s,建议5s
stat_interval => "5"
}
}

output {
elasticsearch {
hosts => ["xx.xx.xx.xx:9200"]
# 指定输出es的index
index => "game_test"
}
}

docker部署

1
docker run -it -d --name logstash_test --network=docker_elk_test -p 5000:5000 -v /usr/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v /usr/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /usr/log/game:/var/log/game docker.elastic.co/logstash/logstash:7.3.0 
1
2
# 一定要指明收集地址,上面配置文件的路径是容器内部的,一定要建立与外部的数据卷
-v /usr/log/game:/var/log/game

现在在文件 /usr/log/game/xxx.log 在kibana创建索引index后就可以查看

image-20211015094607601

总结

上文只是elk的初步部署方式

logstash中还有很多采集日志的小技巧,特别是grok中的正则

logstash官网 中可以进一步查看相应内容


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!