本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

一、前言

ELK 是三个开源软件的缩写,分别是 Elasticsearch、Logstash、Kibana,一般情况下会结合 FileBeat 使用
Elasticsearch:是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源,自动搜索负载等。
Kibana:是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Logstash:主要是用来日志的搜集、分析、过滤日志的工具,支持多种多样的数据获取方式。一般工作方式为 c/s 架构,Client 端安装在需要收集日志的服务器上,Server 端负责将收到的各节点日志进行过滤、修改等操作,再一并发往 Elasticsearch 上去。
Filebeat:轻量级数据收集引擎,隶属于 Beats。是一个轻量级的日志收集处理工具 (Agent),Filebeat 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstash,官方也推荐此工具。目前 Beats 包含四种工具:Packetbeat(搜集网络流量数据)、Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)、Filebeat(搜集文件数据)、Winlogbeat(搜集 Windows 事件日志数据)。

二、准备工作

2.1 安装 Docker

因为本文介绍的是基于 docker 安装 Yapi,所以先决条件是系统必须先安装好 docker 才能往下走,如果对 docker 的安装还不熟悉的可以查看我的另一篇文章【Linux 安装最新版 Docker 完整教程】,安装完之后再往下看。

2.2 安装 Docker-Compose

#下载最新版docker-compose
curl -L https://github.com/docker/compose/releases/download/2.16.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#添加可执行权限
chmod +x /usr/local/bin/docker-compose
#查看版本信息
docker-compose --version

三、Docker-Compose 编排部署 ELK

3.1 创建所需的挂载目录

#创建es挂载目录
mkdir -p /usr/local/src/other/elk/es/{config,data,logs,plugins}
#赋予777权限
chmod 777 /usr/local/src/other/elk/es/{config,data,logs,plugins}
#创建kibana挂载目录
mkdir -p /usr/local/src/other/elk/kibana/{config,plugins}
#赋予777权限
chmod 777 /usr/local/src/other/elk/kibana/{config,plugins}
#创建logstash挂载目录
mkdir -p /usr/local/src/other/elk/logstash/{config,pipeline}
#赋予777权限
chmod 777 /usr/local/src/other/elk/logstash/{config,pipeline}
#创建filebeat挂载目录
mkdir -p /usr/local/src/other/elk/filebeat/{config,logs}
#赋予777权限
chmod 777 /usr/local/src/other/elk/filebeat/{config,logs}

3.2 创建相应的配置文件

在 /usr/local/src/other/elk/es/config 目录下创建 elasticsearch.yml 文件,内容如下:

network.host: 0.0.0.0  #使用的网络
http.cors.enabled: true #跨域配置
http.cors.allow-origin: "*"
#xpack.security.enabled: true  #开启密码配置

在 /usr/local/src/other/elk/kibana/config 目录下创建 kibana.yml

i18n.locale: "zh-CN"  #汉化
server.name: "kibana"
server.host: "0.0.0.0"
#server.shutdownTimeout: "10s" #新版本中已移除
elasticsearch.hosts: ["http://elasticsearch:9200"]
#elasticsearch.username: "kibana_system" #注意不能用elastic超管账号登录
#elasticsearch.password: "在es中设置kibana_system的密码"

在 /usr/local/src/other/elk/logstash/pipeline 目录下创建 logstash.conf 文件,内容如下:

input {
  beats {
    port => 5044
  }
}
filter {
    grok {
        match => {
            "message" => "(?m)^\[%{INT:pid}\]%{SPACE}%{TIMESTAMP_ISO8601:createTime}%{SPACE}\[%{DATA:threadName}\]%{SPACE}%{LOGLEVEL:LEVEL}%{SPACE}%{JAVACLASS:javaClass}#(?<methodName>[a-zA-Z_]+):%{INT:linenumber}%{SPACE}-%{GREEDYDATA:msg}"
        }
    }  
}
output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "test-log"
    user => "elastic"
    password => "XXXXXX"
  }
}

在 /usr/local/src/other/elk/logstash/config 目录下创建 logstash.yml 文件,内容如下:

http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]
#xpack.monitoring.elasticsearch.username: "elastic"
#xpack.monitoring.elasticsearch.password: "在es中设置elastic的密码"

在 /usr/local/src/other/elk/filebeat/config 目录下创建 filebeat.yml 文件,内容如下:

# 定义应用的input类型、以及存放的具体路径
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/logapp/*.log #日志输出地址
  tags: ["test-log"]
#============================= Filebeat modules ===============================
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
# ============================== logstash =====================================  
output.logstash:
  hosts: ["logstash:5044"]
  enabled: true

在 /usr/local/src/other/elk 目录下创建 docker-compose.yml 文件,内容如下:

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.8.1  #镜像
    container_name: elasticsearch  #定义容器名称
    restart: always  #开机启动,失败也会一直重启
    privileged: true
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms4096m -Xmx8192m" #设置使用jvm内存大小
    volumes:
      - /usr/local/src/other/elk/es/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
      - /usr/local/src/other/elk/es/data:/usr/share/elasticsearch/data #数据文件挂载
      - /usr/local/src/other/elk/es/logs:/usr/share/elasticsearch/logs #日志文件挂载
      - /usr/local/src/other/elk/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /usr/local/src/other/elk/es/config:/usr/share/elasticsearch/config
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - elk_net
  kibana:
    image: kibana:7.8.1
    container_name: kibana
    restart: always
    privileged: true
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #设置访问elasticsearch的地址
    volumes:
      - /usr/local/src/other/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
    networks:
      - elk_net
  logstash:
    image: logstash:7.8.1
    container_name: logstash
    restart: always
    privileged: true
    volumes:
      - /usr/local/src/other/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      - /usr/local/src/other/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    ports:
      - 5044:5044
    networks:
      - elk_net
  filebeat:
    container_name: filebeat
    image: elastic/filebeat:7.8.1
    user: "root"
    depends_on:
      - elasticsearch
      - logstash
      - kibana
    restart: on-failure
    privileged: true
    volumes:
      - /usr/local/src/other/elk/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /usr/local/src/other/elk/filebeat/logs:/var/log/logapp
    networks:
      - elk_net
networks:
  elk_net:
    driver: bridge

3.3 启动 docker-compose

  1. 改变设置
sysctl -w vm.max_map_count=262144
  1. 设置内核参数
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
  1. 使立即生效
sysctl -p
  1. 重启 docker,让内核参数对docker服务生效
systemctl restart docker
  1. 进入ELK容器编排文件所在目录
cd /usr/local/src/other/elk
  1. 启动ELK容器编排
docker-compose up -d
  1. 查看容器启动情况
docker-compose ps
  1. 进入es容器设置账号密码登录
  • 先开启配置文件中的密码配置
    修改elasticsearch.yml
xpack.security.enabled: true
  • 重启es容器
docker restart elasticsearch
  • 进入容器
docker exec -it elasticsearch /bin/bash 
  • 执行设置:elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user共6个用户账号密码
./bin/elasticsearch-setup-passwords interactive -u 'http://192.168.1.123:9200'
  • 重启es容器
docker restart elasticsearch 
  1. 修改kibana.yml配置文件使用密码登录es
monitoring.ui.container.elasticsearch.username: "kibana_system"
monitoring.ui.container.elasticsearch.password: "刚刚在es中设置kibana_system的密码"
  1. 重启kibana容器
docker restart kibana
  1. logstash容器安装json_lines插件
docker exec -it logstash /bin/bash
cd bin
logstash-plugin install logstash-codec-json_lines
#等待执行完成后退出容器
exit
  1. 修改配置 /usr/local/src/other/elk/logstash/config/logstash.yml
vim /usr/local/src/other/elk/logstash/config/logstash.yml
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "在es中设置elastic的密码"
  1. 重启logstash容器
docker restart logstash

解决安装filebeat挂载配置文件报错

Exiting: error loading config file: config file ("/opt/filebeat/filebeat.yml") can only be writable by the owner but the permissions are "-rwxrwxrwx" (to fix the permissions use: 'chmod go-w /opt/filebeat/filebeat.yml')

报错是因为安全原因不要其他用户写的权限,去掉写的权限就可以了,我把777修改成755,转码后是493
根据提示 对挂载的配置文件执行 chmod go-w /usr/local/src/other/elk/filebeat/config/filebeat.yml')
然后重启filebeat容器

docker restart filebeat

四、访问 Kinaba 地址:http://192.168.1.123:5601


查看索引管理

往 /usr/local/src/other/elk/filebeat/logs 添加日志文件 test.log


进入视图管理器查看收集到的日志信息