ELK保姆级安装部署教程

7,875 阅读9分钟

一、ELK简介

在后台开发中,日志系统是一个很重要的系统,一个架构良好的日志系统,可以帮助开发者更清楚的了解服务器的状态和系统安全状况,从而保证服务器的稳定运行。日志主要包括系统日志和应用程序日志,运维和开发人员可以通过日志了解服务器中软硬件的信息,检查应用程序或系统的故障,了解故障出现的原因,以便解决问题。

目前,在大型的后端架构中,一个标准的数据采集方案通常被称为ELK,即ElasticSearch、Logstash和Kibana。

  • Elasticsearch:分布式搜索引擎。具有高可伸缩、高可靠、易管理等特点,可用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 使用Java 基于 Lucene 开发,是现在使用最广的开源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它来构建的。
  • Logstash:数据收集处理引擎。支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。
  • Kibana:可视化化平台。它能够搜索、展示存储在 Elasticsearch 中索引数据。使用它可以很方便的用图表、表格、地图展示和分析数据。

当然,除了ELK,行业内还有一些轻量型数据采集方案,比如Beats、Loki。

  • Filebeat:轻量级数据收集引擎。相对于Logstash所占用的系统资源来说,Filebeat 所占用的系统资源几乎是微乎及微。它是基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 Agent 的第一选择。  

二、ELK常见架构

在实际使用ELK有几种常见的架构方式:

  • Elasticsearch + Logstash + Kibana:这种架构,通过Logstash收集日志,Elasticsearch分析日志,然后在Kibana中展示数据。这种架构虽然是官网介绍里的方式,但是在生产中却很少使用。
  • Elasticsearch + Logstash + filebeat + Kibana:与上一种架构相比,增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,用来部署在客户端,优势是消耗非常少的资源(较logstash)就能够收集到日志。所以在生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。
  • Elasticsearch + Logstash + filebeat + redis + Kibana:此种架构是上面架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。

 

所以,我们此次选择Elasticsearch + Logstash + filebeat + Kibana架构来进行演示。

 

三、安装与部署

3.1 Elasticsearch

elasticsearch的主要作用就是全文检索、结构化检索和分析。首先,安装Docker,并创建docker网络。

docker network create -d bridge elastic

然后,拉取elasticsearch,此处使用的是8.4.3版本。

docker pull elasticsearch:8.4.3

接着,执行docker脚本。

docker run -it \
    -p 9200:9200 \
    -p 9300:9300 \
    --name elasticsearch \
    --net elastic \
    -e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
    -e "discovery.type=single-node" \
    -e LANG=C.UTF-8 \
    -e LC_ALL=C.UTF-8 \
    elasticsearch:8.4.3

注意,第一次执行脚本不要加-d这个参数,否则看不到服务首次运行时生成的随机密码和随机enrollment token。我们需要将生成的随机密码和token保存起来,以便后面使用。

image.png

接着,创建一个Elasticsearch挂载目录,并给创建的文件夹授权。

mkdir /home/xxx/elk8.4.3/elasticsearch
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/elasticsearch

接下来,我们将容器内的文件复制到主机上,涉及的命令如下。

docker cp elasticsearch:/usr/share/elasticsearch/config /home/xxx/elk8.4.3/elasticsearch/        
docker cp elasticsearch:/usr/share/elasticsearch/data /home/xxx/elk8.4.3/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/plugins /home/xxx/elk8.4.3/elasticsearch/
docker cp elasticsearch:/usr/share/elasticsearch/logs /home/xxx/elk8.4.3/elasticsearch/

如果要删除容器中的内容,那么可以使用rm -f。

docker rm -f elasticsearch

然后,我们修改docker脚本,增加-v挂载目录和-d参数。

docker run -it \
    -d \
    -p 9200:9200 \
    -p 9300:9300 \
    --name elasticsearch \
    --net elastic \
    -e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
    -e "discovery.type=single-node" \
    -e LANG=C.UTF-8 \
    -e LC_ALL=C.UTF-8 \
    -v /home/xxx/elk8.4.3/elasticsearch/config:/usr/share/elasticsearch/config \
    -v /home/xxx/elk8.4.3/elasticsearch/data:/usr/share/elasticsearch/data \
    -v /home/xxx/elk8.4.3/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
    -v /home/xxx/elk8.4.3/elasticsearch/logs:/usr/share/elasticsearch/logs \
    elasticsearch:8.4.3

打开配置文件elasticsearch.yml,具体位于/home/xxx/elk8.4.3/elasticsearch/config/elasticsearch.yml文件中。并且需要将xpack.monitoring.collection.enabled配置设置成true,添加这个配置以后在kibana中才会显示联机状态,否则会显示脱机状态,如下图所示。

image.png

最后,我们再重启Docker容器,使上面的配置生效。

docker restart elasticsearch

接下来,我们打开https://ip:9200进行测试。其中,用户名是elastic, 密码是第一次启动时保存下来的信息中生成的密码。

image.png

3.2 Kibana

Kibana是一个可视化化平台,它能够搜索、展示存储在 Elasticsearch 中索引数据。首先,在Docker中拉取镜像。

docker pull kibana:8.4.3

接着,在docker中执行启动脚本命令。

docker run -it \
	-d \
	--restart=always \
	--log-driver json-file \
	--log-opt max-size=100m \
	--log-opt max-file=2 \
	--name kibana \
	-p 5601:5601 \
	--net elastic \
	kibana:8.4.3

和elasticsearch的创建过程类似,kibana需要创建挂载目录,然后给创建的文件授权。

mkdir /home/xxx/elk8.4.3/kibana
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/kibana

然后,再使用下面的命令将容器内的文件复制到主机上。

docker cp kibana:/usr/share/kibana/config /home/xxx/elk8.4.3/kibana/        
docker cp kibana:/usr/share/kibana/data /home/xxx/elk8.4.3/kibana/        
docker cp kibana:/usr/share/kibana/plugins /home/xxx/elk8.4.3/kibana/        
docker cp kibana:/usr/share/kibana/logs /home/xxx/elk8.4.3/kibana/        

接下来,修改kibana.yml配置文件,配置文件的路径为/home/xxx/elk8.4.3/kibana/config/kibana.yml,主要修改的内容包括:

  • i18n.locale: “zh-CN”
  • elasticsearch.hosts: [‘https://172.20.0.2:9200’],将IP改成elasticsearch的docker ip,注意一定要用https
  • xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [‘https://172.20.0.2:9200’], ca_trusted_fingerprint: xxxxxxxxxx}]

 

image.png  

如果我们要删除kibana,可以使用下面的命令:

docker rm -f kibana

然后,我们修改docker启动脚本,增加挂载目录。

docker run -it \
	-d \
	--restart=always \
	--log-driver json-file \
	--log-opt max-size=100m \
	--log-opt max-file=2 \
	--name kibana \
	-p 5601:5601 \
	--net elastic \
	-v /home/xxx/elk8.4.3/kibana/config:/usr/share/kibana/config \
	-v /home/xxx/elk8.4.3/kibana/data:/usr/share/kibana/data \
	-v /home/xxx/elk8.4.3/kibana/plugins:/usr/share/kibana/plugins \
	-v /home/xxx/elk8.4.3/kibana/logs:/usr/share/kibana/logs \
	kibana:8.4.3

如果我们想要查看kibana中的日志,可以使用下面的命令:

docker logs -f kibana

然后打开浏览器,输入地址:http://ip:5601,使用elastic用户的密码进行认证登录。

image.png

如果忘记token了,可以重置token进入容器执行。

/bin/elasticsearch-create-enrollment-token -s kibana --url "https://127.0.0.1:9200"    

输入token以后会看到一个验证码框,验证码从kibana的日志中获取。

image.png

然后,再次输入用户名elastic,密码是第一次启动elasticsearch保存的密码就可以登录到kibana后台了。

3.3 Logstash

Logstash是数据收集处理引擎,支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储以供后续使用。首先,我们在容器中安装logstash,注意版本号的一致性。

docker pull logstash:8.4.3

然后,在docker执行启动脚本。

docker run -it \
	-d \
	--name logstash \
	-p 9600:9600 \
	-p 5044:5044 \
	--net elastic \
	logstash:8.4.3

接着,再创建logstash挂载目录,并且给创建的文件授权。

mkdir /home/xxx/elk8.4.3/logstash
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/logstash

接着,将容器内的文件复制到主机上。

docker cp logstash:/usr/share/logstash/config /home/xxx/elk8.4.3/logstash/ 
docker cp logstash:/usr/share/logstash/pipeline /home/xxx/elk8.4.3/logstash/ 

然后,我们将/home/xxx/elk8.4.3/logstash/elasticsearch/config/certs复制到/home/xxx/elk8.4.3/logstash/config/certs。

sudo cp /home/xxx/elk8.4.3/logstash/elasticsearch/config/certs /home/xxx/elk8.4.3/logstash/config/certs

修改logstash.yml的文件的默认配置,配置文件的路径为:/home/xxx/elk8.4.3/logstash/config/logstash.yml。

http.host: "0.0.0.0"
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.hosts: [ "https://172.20.0.2:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "第一次启动elasticsearch是保存的信息中查找"
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/share/logstash/config/certs/http_ca.crt"
xpack.monitoring.elasticsearch.ssl.ca_trusted_fingerprint: "第一次启动elasticsearch是保存的信息中查找"

需要注意的是,https://172.20.0.2:9200必须是https,IP是elasticsearch的docker IP。接着,再修改logstash.conf配置,目录为/home/xxx/elk8.4.3/logstash/pipeline/logstash.conf。

input {
  beats {
    port => 5044
  }
}


filter {
  date {
    match => [ "@timestamp", "yyyy-MM-dd HH:mm:ss Z" ]
  }
  mutate {
    remove_field => ["@version", "agent", "cloud", "host", "input", "log", "tags", "_index", "_source", "ecs", "event"]
  }
}


output {
  elasticsearch {
    hosts => ["https://172.20.0.2:9200"]
    index => "server-%{+YYYY.MM.dd}"
    ssl => true
    ssl_certificate_verification => false
    cacert => "/usr/share/logstash/config/certs/http_ca.crt"
    ca_trusted_fingerprint => "第一次启动elasticsearch是保存的信息中查找"
    user => "elastic"
    password => "第一次启动elasticsearch是保存的信息中查找"
  }
}

如果需要删除Docker容器中的logstash,可以使用下面的命令:

docker rm -f logstash

接着,再修改docker启动命令,加上-v挂载目录。

docker run -it \
	-d \
	--name logstash \
	-p 9600:9600 \
	-p 5044:5044 \
	--net elastic \
	-v /home/appuser/docker-images/elk8_4_3/logstash/config:/usr/share/logstash/config \
	-v /home/appuser/docker-images/elk8_4_3/logstash/pipeline:/usr/share/logstash/pipeline \
	logstash:8.4.3

 

3.4 filebeat

Filebeat是一个轻量级数据收集引擎,相对于Logstash所占用的系统资源来说,Filebeat 所占用的系统资源几乎是微乎及微,主要是为了解决logstash数据丢失的场景。首先,在Docker中安装Filebeat镜像。

docker pull elastic/filebeat:8.4.3

然后,执行docker启动脚本。

docker run -it \
	-d \
	--name filebeat \
	--network host \
	-e TZ=Asia/Shanghai \
	elastic/filebeat:8.4.3 \
	filebeat -e  -c /usr/share/filebeat/filebeat.yml

接着,创建filebeat挂载目录,并给创建的文件授权。

mkdir /home/xxx/elk8.4.3/filebeat
sudo chown -R 1000:1000 /home/xxx/elk8.4.3/filebeat

然后,将容器内的文件复制到主机上。

docker cp filebeat:/usr/share/filebeat/filebeat.yml /home/xxx/elk8.4.3/filebeat/ 
docker cp filebeat:/usr/share/filebeat/data /home/xxx/elk8.4.3/filebeat/ 
docker cp filebeat:/usr/share/filebeat/logs /home/xxx/elk8.4.3/filebeat/ 

接着,修改filebeat.yml配置文件,目录为/home/xxx/elk8.4.3/filebeat/filebeat.yml。

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false


processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~


output.logstash:
  enabled: true
  # The Logstash hosts
  hosts: ["localhost:5044"]


filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/target/*/*/*.log. # 这个路径是需要收集的日志路径,是docker容器中的路径
  scan_frequency: 10s
  exclude_lines: ['HEAD']
  exclude_lines: ['HTTP/1.1']
  multiline.pattern: '^[[:space:]]+(at|.{3})\b|Exception|捕获异常'
  multiline.negate: false
  multiline.match: after

如果要删除容器中的Filebeat,使用如下命令。

docker rm -f filebeat

接着,修改docker启动脚本,增加-v挂载目录。

docker run -it \
	-d \
	--name filebeat \
	--network host \
	-e TZ=Asia/Shanghai \
	-v /home/xxx/log:/usr/share/filebeat/target \
	-v /home/xxx/elk8.4.3/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
	-v /home/xxx/elk8.4.3/filebeat/data:/usr/share/filebeat/data \
  -v /home/xxx/elk8.4.3/filebeat/logs:/usr/share/filebeat/logs \
	elastic/filebeat:8.4.3 \
	filebeat -e  -c /usr/share/filebeat/filebeat.yml

需要注意的是, -v /home/xxx/log:/usr/share/filebeat/target 这个是需要收集的日志目录,需要挂载到容器中。

 

3.5 最终效果

完成前面软件的安装后,ELK所需的软件就安装完成。接下来,我们登录kibana就可以查看信息了。

image.png

然后,我们打开索引,打开Stack Manager。如果能看到自己配置的索引说明安装配置成功。

image.png

如果还没有日志,可以先创建数据视图,然后选择创建的索引。

image.png