为何要使用ELK呢?公司产品、项目贼多,部署到不一样的服务器上,当系统出现故障时,工程师须要登陆到各个服务器上,使用 grep / sed / awk 等 Linux 脚本工具去日志里查找故障缘由。在没有日志系统的状况下,首先须要定位处理请求的服务器,若是这台服务器部署了多个实例,则须要去每一个应用实例的日志目录下去找日志文件。每一个应用实例还会设置日志滚动策略(如:天天生成一个文件),还有日志压缩归档策略等。这样一系列流程下来,对于咱们排查故障以及及时找到故障缘由,形成了比较大的麻烦。所以,若是咱们能把这些日志集中管理,并提供集中检索功能,不只能够提升诊断的效率,同时对系统状况有个全面的理解,避免过后救火的被动。
docker pull sebp/elk
# 查看elk版本信息以下
docker inspect sebp/elk
复制代码
notes: 启动前要保证内存足够
默认启动(内存占用将会接近2G)
nginx
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk复制代码
自定义启动
web
# 参数解释:docker
TZ:默认Etc/UTC
ES_HEAP_SIZE:默认elaticsearch堆的最大值1G,最小值256M
LS_HEAP_SIZE:默认Logstash的堆大小是500M
ELASTICSEARCH_START: 是否启动elasticsearch, 0-不启动 1-启动
LOGSTASH_START:是否启动Logstash, 0-不启动 1-启动
KIBANA_START:是否启动Kibana, 0-不启动 1-启动复制代码
# 端口:shell
5601:访问Kibana的web端口
9200:elasticsearch API查询接口
5044:Logstash Beats接口,接收来自Beats(如Filebeat)的日志复制代码
docker run
-p 5601:5601
-p 9200:9200
-p 5044:5044
-it
-e TZ="Asia/Shanghai"
-e ES_HEAP_SIZE="256m"
-e LS_HEAP_SIZE="256m"
--name elk sebp/elk复制代码
启动可能遇到的问题: centos
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] bash
解决办法:服务器
在/etc/sysctl.conf文件末尾添加配置vm.max_map_count=262144
网络
移除ELK容器后重启可能会出现以下问题:
service endpoint with name xxx already exists.
elasticsearch
解决办法: 清理ELK容器的网络占用
docker network disconnect --force bridge elk
tips: 服务器有防火墙firewall,请先开放端口5601再进行访问。
firewall-cmd --zone=pubic --add-port=5601/tcp --permanent复制代码
# 访问以下端口:tcp
# 至此则搭建完成~
# 进入ELK容器shell终端
docker exec -it elk /bin/bash复制代码
# 打开Logstash日志输入控制台
/opt/logstash/bin/logstash --path.data /tmp/logstash/data -e 'input{ stdin{} } output{ elasticsearch{hosts=>["localhost"]} }'复制代码
docker pull docker.elastic.co/beats/filebeat:7.0.1复制代码
docker run docker.elastic.co/beats/filebeat:7.0.1 setup -E setup.kibana.host=192.168.184.134:5601 -E output.elasticsearch.hosts=["192.168.184.134:9200"]复制代码
# 进入ELK容器shell终端
docker exec -it elk /bin/bash复制代码
# 修改配置文件(/etc/logstash/conf.d/02-beats-input.conf)以下
input {
beats {
port => 5044
}
}复制代码
这里删除的ssl证书配置,由于此处不须要证书。
# 建立配置文件以下: /opt/filebeat/filebeat.docker.yml
filebeat:
# 日志输入源
inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
# 日志输出源Logstash
output:
logstash:
hosts: ["192.168.184.134:5044"] 复制代码
# 启动容器
docker run -d
--name=filebeat
--user=root
# 配置文件(输入、输出、模块nginx?)
--volume="/opt/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro"
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro"
--volume="/var/run/docker.sock:/var/run/docker.sock:ro"
# 映射本地nginx日志文件到docker容器
--volume="/var/log/nginx:/var/log/nginx"
docker.elastic.co/beats/filebeat:7.0.1
filebeat
-e -strict.perms=false 复制代码
docker run -d --name=filebeat --user=root --volume="/opt/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" --volume="/var/log/nginx:/var/log/nginx" docker.elastic.co/beats/filebeat:7.0.1 filebeat -e -strict.perms=false复制代码
# 打开Kibana -> Logs查询nginx日志
# 建立配置文件以下: /opt/filebeat/filebeat.docker.yml (收集镜像名为gold的全部容器的日志)
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
templates:
- condition:
contains:
docker.container.image: gold
output:
logstash:
hosts: ["192.168.184.134:5044"]复制代码
# 启动Filebeat容器
docker run -d
--name=filebeat-gold
--user=root
# 挂载本地配置文件(输入、输出、模块nginx?)
--volume="/opt/gold/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro"
# 挂载容器
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro"
--volume="/var/run/docker.sock:/var/run/docker.sock:ro"
docker.elastic.co/beats/filebeat:7.0.1
filebeat
-e -strict.perms=false 复制代码
docker run -d --name=filebeat-gold --user=root --volume="/opt/gold/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" docker.elastic.co/beats/filebeat:7.0.1 filebeat -e -strict.perms=false 复制代码
# 打开Kibana查看gold日志