elk 7.9.3 版本容器化部署

时间:2021-08-20
本文章向大家介绍elk 7.9.3 版本容器化部署,主要包括elk 7.9.3 版本容器化部署使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

ELK-V7.9.3 部署

  • 为什么用到ELK?
平时我们需要进行日志分析的时候,可以直接在日志文件中 grep、awk 就可以过滤出自己想要的信息及关键字,但规模较大的场景中,此方法极大的减低了效率,面临的问题,包括日志量过大,如何归档、文本搜索太慢、如何多维度查询,需要集中化的日志管理,所有服务器上的日志并收集汇总。常见解决思路就是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问,一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率;
  • 完整的集中式日志系统,需要包含以下几个主要特点:
1、收集-能够采集多种来源的日志数据
2、传输-能够稳定的把日志数据传输到中央系统
3、存储-如何存储日志数据
4、分析-可以支持 UI 分析
5、警告-能够提供错误报告,监控机制
  • ELK提供了一套优越的解决方案,并且开源,互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统
ELK是三款开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 新增了一个FileBeat,轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash
1、Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
2、Logstash 主要是日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机,server端负责将收到的各节点日志进行过滤、修改等操作一并发送至elasticsearch。
3、Kibana 是开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
4、Filebeat 涉及两个组件:查找器prospector和采集器harvester,来读取文件(tail file)并将事件数据发送到指定的输出elasticsearch中或者Kibana;
5、概述:
   filebeat隶属于beats,目前Beats包含工具有:Packetbeat(搜集网络流量数据),Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)Filebeat(搜集文件,日志数据汇总),Winlogbeat(搜集 Windows 事件日志数据)等;
  • 官方文档
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html

Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html

Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html

Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html

elasticsearch中文社区:
https://elasticsearch.cn/
此文档以容器化部署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 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装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}
# 由于我们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/master/master.yml
cluster.name: yunwei_cluster 
node.name: master
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
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地址,主节点
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave1:/data/elk/conf/slave1/slave1.yml
cluster.name: yunwei_cluster 
node.name: slave1
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
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
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave2:/data/elk/conf/slave2/slave2.yml
cluster.name: yunwei_cluster 
node.name: slave2
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
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
xpack.security.enabled: false
bootstrap.memory_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/config/master.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/master:/usr/share/elasticsearch/data -v /data/elk/logs/master:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave1
docker run -d --name=slave1 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave1:/usr/share/elasticsearch/data -v /data/elk/logs/slave1:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave2
docker run -d --name=slave2 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave2:/usr/share/elasticsearch/data -v /data/elk/logs/slave2:/usr/share/elasticsearch/logs elasticsearch:7.3.1
  • 修改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容器
  • 浏览器访问测试:http://ip:{9200,9201,9202}
  • cerebro容器的创建及启动
docker run -d -p 9001:9000 --name=cerebro lmenezes/cerebro
docker run -d -p 5601:5601 --name=kibana -e  "I18N_LOCALE=zh-CN" -e "ELASTICSEARCH_URL=http://物理机的IP地址或域名:9200" kibana:7.3.1
  • 修改kibana配置文件,添加elasticsearch地址
# 登录kibana容器,修改配置文件
docker exec -it kibana /bin/bash
/usr/share/kibana/config/kibana.yml
# 添加elasticsearch
elasticsearch.hosts: [ "http://宿主机IP:9200" ]
# 重启kibana容器
docker restart kibana
  • 查看已创建启动的容器:docker ps

filebeat 收集汇总日志

  • 日志在单个文件:根据不同的服务编写不同的yml文件并在主配置文件中导入子yml加载执行采集即可;

  • 日志在多个文件:直接可以在主配置yml文件中编写采集动作即可;

  • filebeat 源码包下载:

# 下载filebeat源码包 -- elk官网下载即可   filebeat-7.9.3-linux-x86_64.tar.gz
日志收集端服务节点:/srv/filebeat-7.9.3-linux-x86_64.tar.gz
# 解压
tar -zxf filebeat-7.9.3-linux-x86_64.tar.gz
cd filebeat-7.9.3
  • 示例一:日志在单个文件(采集详细级别的日志: debug,info,warn,error)
目录结构:
filebeat-7.9.3
   - modules   # 子yml文件、具体某个服务日志
     - asset-service.yml
     - user-service.yml
   - filebeat-new.yml  # 主yml文件
  • 主yml配置文件:filebeat-new.yml
filebeat.config.inputs:
  path:
    modules/*.yml    # 导入子服务配置文件
  reload.enabled: true  # 启动加载
  reload.period: 10s    # 每10秒检查一次

# 自定义索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true

# 删除索引中不需要的字段
processors:
- drop_fields:
    fields: ["input","agent"]
    
# 收集日志输出到elasticsearch
output.elasticsearch:
  hosts: ["IP地址:9200"]
  index: "test-%{+yyy.MM.dd}"
  • 子服务yml配置文件:asset-service.yml
# 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.negate:  true
  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.negate:  true
  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.negate:  true
  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.negate:  true
  multiline.match:   after
  • 示例二:日志在多个文件(采集详细级别的日志: debug,info,warn,error)
  • 主配置文件:filebeat-new.yml
# 创建新的filebeat收集模板配置文件,不在原有的filebeat.yml修改:  vim filebeat-new.yml
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}.* \['
  multiline.negate:  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}.* \['
  multiline.negate:  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}.* \['
  multiline.negate:  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}.* \['
  multiline.negate:  true
  multiline.match:   after
    
# 自定义索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true

# 删除索引中不需要的字段
processors:
- drop_fields:
    fields: ["input","agent"]

# 收集日志输出到elasticsearch
output.elasticsearch:
  hosts: ["IP地址:9200"]
  index: "test-%{+yyy.MM.dd}"
  • 启动filebeat进行日志监控收集
nohup /srv/filebeat-7.9.3/filebeat -e -c /srv/filebeat-7.9.3/filebeat-new.yml &
  • Stack Management ——> 索引管理

原文地址:https://www.cnblogs.com/Anesthesia-is/p/15165917.html