elk7.9.3版本容器化部署
ELK-V7.9.3 部署
为什么⽤到ELK?
平时我们需要进⾏⽇志分析的时候,可以直接在⽇志⽂件中 grep、awk 就可以过滤出⾃⼰想要的信息及关键字,但规模较⼤的场景中,此⽅法极⼤的减低了效率,⾯临的问题,包括⽇志量过⼤,如何归完整的集中式⽇志系统,需要包含以下⼏个主要特点:
1、收集-能够采集多种来源的⽇志数据
2、传输-能够稳定的把⽇志数据传输到中央系统
3、存储-如何存储⽇志数据
4、分析-可以⽀持 UI 分析
5、警告-能够提供错误报告,监控机制
ELK提供了⼀套优越的解决⽅案,并且开源,互相配合使⽤,完美衔接,⾼效的满⾜了很多场合的应⽤。
⽬前主流的⼀种⽇志系统
ELK是三款开源软件的缩写,分别表⽰:Elasticsearch , Logstash, Kibana , 新增了⼀个FileBeat,轻量级的⽇志收集处理⼯具(Agent),Filebeat占⽤资源少,适合于在各个服务器上搜集⽇志后传输给Lo
1、Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三⼤功能。它的特点有:分布式,零配置,⾃动发现,索引⾃动分⽚,索引副本机制,restful风格接⼝,多数据源,⾃动搜索负载
2、Logstash 主要是⽇志的搜集、分析、过滤⽇志的⼯具,⽀持⼤量的数据获取⽅式。⼀般⼯作⽅式为c/s架构,client端安装在需要收集⽇志的主机,server端负责将收到的各节点⽇志进⾏过滤、修改等
3、Kibana 是开源和免费的⼯具,Kibana可以为 Logstash 和 ElasticSearch 提供的⽇志分析友好的 Web 界⾯,可以帮助汇总、分析和搜索重要数据⽇志。
4、Filebeat 涉及两个组件:查器prospector和采集器harvester,来读取⽂件(tail file)并将事件数据发送到指定的输出elasticsearch中或者Kibana;
5、概述:
filebeat⾪属于beats,⽬前Beats包含⼯具有:Packetbeat(搜集⽹络流量数据),Topbeat(搜集系统
、进程和⽂件系统级别的 CPU 和内存使⽤情况等数据)Filebeat(搜集⽂件,⽇志数据汇总),W 官⽅⽂档
Filebeat:
/cn/products/beats/filebeat
/guide/en/beats/filebeat/5.6/index.html
Logstash:
/cn/products/logstash
/guide/en/logstash/5.6/index.html
Kibana:
/cn/products/kibana
/guide/en/kibana/5.5/index.html
Elasticsearch:
/cn/products/elasticsearch
/guide/en/elasticsearch/reference/5.6/index.html
elasticsearch中⽂社区:
elasticsearch/
此⽂档以容器化部署elk,es为集,除filebeat为源码包的⽅式
Centos 7.x 系统
2.4Hz 8核32G内存
注意内存需给⼤,否则会出现es挂的情况
容器化部署elk
elasticsearch+filebeat+kibana v7.9.3(最新)
docker 服务安装
# 更新yum源
yum update
# 删除旧版本的docker
yum remove docker  docker-common docker-selinux docker-engine -y
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 下载安装docker源
yum-config-manager --add-repo mirrors.aliyun/docker-ce/linux/po
# 安装docker
yum -y install docker-ce
# 启动docker服务
systemctl start docker && systemctl enable docker
# 查看docker版本
docker version
下载elasticsearch,kibana镜像
docker pull elasticsearch:7.9.3
docker pull kibana:7.9.3
docker pull lmenezes/cerebro:latest (es索引管理⼯具)
创建elk数据⽬录,⽤于映射容器数据到宿主机
# 创建存放配置⽂件,数据,⽇志⽬录
mkdir -p /data/elk/{conf,data,logs}
为什么使用bootstrap?# 由于我们ES是以集的⽅式,所以数据跟⽇志要创建master,slave1,slave2三个节点⽬录
mkdir -p /data/elk/data/{master,slave1,slave2}
mkdir -p /data/elk/logs/{master,slave1,slave2}
创建es-master,slave1,slave2节点配置⽂件
# master:/data/elk/conf/l
cluster.name: yunwei_cluster
node.name: master
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- 172.17.0.2:9300  # master,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
- 172.17.0.3:9301  # slave1,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
- 172.17.0.4:9301  # slave2,此处是es容器的ip,,如不缺则容器启动之后查看并修改即可
cluster.initial_master_nodes:
- 172.17.0.2        # 此IP为master容器ip地址,主节点
abled: false
<_lock: false
bootstrap.system_call_filter: false
# slave1:/data/elk/conf/l
cluster.name: yunwei_cluster
node.name: slave1
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9201
transport.port: 9301
discovery.seed_hosts:
-
172.17.0.2:9300    # master
- 172.17.0.3:9302    # slave1
- 172.17.0.4:9301    # slave2
cluster.initial_master_nodes:
- 172.17.0.2
abled: false
<_lock: false
bootstrap.system_call_filter: false
# slave2:/data/elk/conf/l
cluster.name: yunwei_cluster
node.name: slave2
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9202
transport.port: 9302
discovery.seed_hosts:
- 172.17.0.2:9300  # master
- 172.17.0.3:9302  # slave2
- 172.17.0.4:9301  # slave3
cluster.initial_master_nodes:
- 172.17.0.2
abled: false
<_lock: false
bootstrap.system_call_filter: false
启动elasticsearch容器: master,slave1,slave2节点
# master
docker run -d --name=master -p 9200:9200 -p 9300:9300 -v /data/elk/l:/usr/share/elasticsearch/l -v /data/elk/data/master:/usr/share/elasticsearch/data -v /data/elk # slave1
docker run -d --name=slave1 -p 9201:9201 -p 9301:9301 -v /data/elk/l:/usr/share/elasticsearch/l -v /data/elk/data/slave1:/usr/share/elasticsearch/data -v /data/elk # slave2
docker run -d --name=slave2 -p 9201:9201 -p 9301:9301 -v /data/elk/l:/usr/share/elasticsearch/l -v /data/elk/data/slave2:/usr/share/elasticsearch/data -v /data/elk 修改es的运⾏内存,防⽌出现内存溢出,es挂的情况
# 进⼊es容器:master,slave1,slave2
docker exec -it master/slave1/slave2 /bin/bash
# 修改es启动内存
/usr/share/elasticsearch/config/jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms3g  # 根据实际内存分配
-Xmx3g
# 重启master,slave1,slave2容器
浏览器访问测试::{9200,9201,9202}
cerebro容器的创建及启动
docker run -d -p 9001:9000 --name=cerebro lmenezes/cerebro
浏览器访问cerebro:
kibana容器的创建及启动
docker run -d -p 5601:5601 --name=kibana -e  "I18N_LOCALE=zh-CN" -e "ELASTICSEARCH_URL=物理机的IP地址或域名:9200" kibana:7.3.1修改kibana配置⽂件,添加elasticsearch地址
# 登录kibana容器,修改配置⽂件
docker exec -it kibana /bin/bash
/usr/share/kibana/l
# 添加elasticsearch
elasticsearch.hosts: [ "宿主机IP:9200" ]
# 重启kibana容器
docker restart kibana
查看已创建启动的容器:docker ps
浏览器访问kibana:
filebeat 收集汇总⽇志
⽇志在单个⽂件:根据不同的服务编写不同的yml⽂件并在主配置⽂件中导⼊⼦yml加载执⾏采集即可;
⽇志在多个⽂件:直接可以在主配置yml⽂件中编写采集动作即可;
filebeat 源码包下载:
# 下载filebeat源码包 -- elk官⽹下载即可  filebeat-7.9.3-linux-x86_
⽇志收集端服务节点:/srv/filebeat-7.9.3-linux-x86_
# 解压
tar -zxf filebeat-7.9.3-linux-x86_
cd filebeat-7.9.3
⽰例⼀:⽇志在单个⽂件(采集详细级别的⽇志: debug,info,warn,error)
⽬录结构:
filebeat-7.9.3
- modules  # ⼦yml⽂件、具体某个服务⽇志
- l
- l
- l  # 主yml⽂件
主yml配置⽂件:l
path:
modules/*.yml    # 导⼊⼦服务配置⽂件
reload.period: 10s    # 每10秒检查⼀次
# ⾃定义索引名
abled: false
# 删除索引中不需要的字段
processors:
- drop_fields:
fields: ["input","agent"]
# 收集⽇志输出到elasticsearch
output.elasticsearch:
hosts: ["IP地址:9200"]
index: "test-%{+yyy.MM.dd}"
⼦服务yml配置⽂件:l
# DEBUG ⽇志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
# 过滤debug⽇志
include_lines: ['DEBUG']
# 项⽬环境
tags: ["tangpiao","pro"]
# 定义字段
fields:
level: DEBUG
module: asset
# 如果设置为true,则在es中新增的字段格式为:"level":"debug","module":"asset"
fields_under_root: true
# 处理⼀⾏⽇志占据多⾏的情况
# 多⾏⽇志开始的那⼀⾏的pattern
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.match:  after
# ERROR ⽇志过滤输出
- type: log
enabled: true
paths:
-
/home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['ERROR']
tags: ["tangpiao","pro"]
fields:
level: ERROR
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.match:  after
# WARN ⽇志过滤输出
-
type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['WARN']
tags: ["tangpiao","pro"]
fields:
level: WARN
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.match:  after
# INFO ⽇志过滤输出
- type: log
enabled: true
paths:
- /home/opsprod/deploy/debug-logs/asset-service/debug-log
include_lines: ['INFO']
tags: ["tangpiao","pro"]
fields:
level: INFO
module: asset
fields_under_root: true
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
multiline.match:  after
⽰例⼆:⽇志在多个⽂件(采集详细级别的⽇志: debug,info,warn,error)
主配置⽂件:l
# 创建新的filebeat收集模板配置⽂件,不在原有的l修改:  l filebeat.inputs:
- type: log
enabled: true
# # 指定要监控的⽇志,可以指定具体得⽂件或者⽬录
paths:
- /home/opsabc/deploy/debug/user-service/debug-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义⽇志级别,添加新的字段
fields:
level: DEBUG
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"debug"
fields_under_root: true
# 处理⼀⾏⽇志占据多⾏的情况
# 多⾏⽇志开始的那⼀⾏的pattern
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['  ate:  true
multiline.match:  after
- type: log
enabled: true
# # 指定要监控的⽇志,可以指定具体得⽂件或者⽬录
paths:
- /home/opsabc/deploy/error/user-service/error-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义⽇志级别,添加新的字段
fields:
level: ERROR
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理⼀⾏⽇志占据多⾏的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['  ate:  true
multiline.match:  after
- type: log
enabled: true
# # 指定要监控的⽇志,可以指定具体得⽂件或者⽬录
paths:
- /home/opsabc/deploy/info/user-service/info-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义⽇志级别,添加新的字段
fields:
level: INFO
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理⼀⾏⽇志占据多⾏的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['  ate:  true
multiline.match:  after
- type: log
enabled: true
# # 指定要监控的⽇志,可以指定具体得⽂件或者⽬录
paths:
- /home/opsabc/deploy/warn/user-service/warn-log
# 定义tags,可设置多个,以逗号分隔
tags: ["test"]
# 定义⽇志级别,添加新的字段
fields:
level: WARN
servicename: user
# 如果设置为true,则在es中新增的字段格式为:"level":"error"
fields_under_root: true
# 处理⼀⾏⽇志占据多⾏的情况
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['  ate:  true
multiline.match:  after
# ⾃定义索引名
abled: false
# 删除索引中不需要的字段
processors: