ELK 8.x 版本增加了安全特性,默认开启了xpack模式,在安装上跟低版本有一些不同的地方 本案例采用Docker方式安装ELK相关镜像 ELK镜像版本必须保持一致
ELK的介绍和低版本的安装请参考我之前写的文章 安装与搭建ELK架构实现日志同步
好了,现在开始真正的表演了
一、创建网络
创建自定义的网络(用于同一网络的服务之间可以相互通信)
创建网络有两种方式:
1)普通方式
2)设置子网络方式:主要解决容器重启ip变化的问题
# 普通方式(本案例采用方式)docker network create elastic# 设置子网络方式docker network create --subnet=172.19.0.0/24 elastic
二、安装Elasticsearch
- 创建Elasticsearch容器
为避免数据丢失等问题,安装es容器一般情况会将容器data目录映射到本地
为方便复用容器安装过的插件,可以将容器plugins目录映射到本地
# 创建映射目录
mkdir /u01/data/elk/elasticsearch/data
mkdir /u01/data/elk/elasticsearch/plugins
# 映射目录添加权限
chmod -R 777 /u01/data/elk/elasticsearch/data
chmod -R 777 /u01/data/elk/elasticsearch/plugins
# 创建并启动容器
docker run -p 9200:9200 -p 9300:9300 --name elasticsearch --net elastic \
-e "discovery.type=single-node" \
-e "cluster.name=elasticsearch" \
-v /u01/data/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-v /u01/data/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-v /etc/localtime:/etc/localtime \
-d elasticsearch:8.2.0
- 安装中文分词插件
ES本身自带分词器,但是对中文的分词效果并不好,因此我们需要安装中文分词器实现对中文的分词
插件下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
下载完将中文分词插件拷贝到ES容器进行安装
# 第1步:拷贝插件到容器
docker cp /home/zqy/elasticsearch-analysis-ik-8.2.0.zip elasticsearch:/tmp
# 第2步:进入容器
docker exec -it elasticsearch bash
# 第3步:在容器中切换到bin/elasticsearch-plugin目录,直接安装插件
bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-8.2.0.zip
- 生成密码
xpack模式访问es和kibana需要输入用户名和密码,用户名和密码在es容器内生成
生成方式主要有两种:
1)自动生成密码
2)手动生成密码
# 第1步:进入elasticsearch容器
docker exec -it elasticsearch /bin/bash
# 第2步:进入容器后设置es相关账号密码
# 手动生成密码方式(本案例采用方式)
./bin/elasticsearch-setup-passwords interactive
# 自动生成密码方式
./bin/elasticsearch-setup-passwords auto
本案例采用第二种方式生成密码,生成密码过程及结果如图
- 生成enrollment-token
用于后续kibana登陆验证(token需在有效期内使用,过期需重新生成)
# 进入elasticsearch容器,执行以下命令生成token
./bin/elasticsearch-create-enrollment-token --scope kibana
生成token结果如图
- 拷贝证书
切换到宿主主机,复制容器es证书到本地
证书主要用途:
1)访问es地址,https方式访问需要导入证书
2)logstash连接es,https方式连接需要配置ca证书
docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt /u01/data/elk/elasticsearch/config/
- 导入证书
由于es使用xpack安全模式,通过https方式访问需导入证书
本案例使用firefox浏览器导入证书,流程如图

- 登陆访问es页面
首次访问es页面https://192.168.xxx.xxx:9200/会提示输入账号和密码,登陆成功会显示欢迎页面,代表整个es安装及配置流程全部完成,撒花。。。

三、安装kibana
创建kibana容器
# 安装kibana容器,指定网络 docker run -d --name kibana --net elastic -p 5601:5601 kibana:8.2.0登陆kibana
容器启动成功后,访问http://192.168.xxx.xxxx:5601/
首次登陆会提示输入enrollment-token
输入token后,点击Configure Elastic,弹出verification-code输入框,如图:

生成认证码
./bin/kibana-verification-code
认证码生成结果如图<br />
将生成的verification code输入并验证成功后,弹出登陆页面<br />此时输入elastic账号及密码,登陆成功会显示欢迎页面<br />至此整个kibana安装及配置流程全部完成,继续撒花。。。<br /><br />
<a name="y3UY5"></a>
### 四、安装logstash
本案例使用监听端口的方式,将日志同步到es
- 创建logstash容器
```shell
# 网络、端口、配置文件根据实际情况设置
docker run --name logstash -p 4560:4560 -p 4561:4561 -p 4562:4562 -p 4563:4563 -p 5044:5044 \
--net elastic \
-v /u01/data/elk/logstash/logstash-new.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /u01/data/elk/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /etc/localtime:/etc/localtime \
-d logstash:8.2.0
- 拷贝ES证书到logstash容器
用于配置logstash.conf连接es时使用
docker cp /u01/data/elk/elasticsearch/config//http_ca.crt logstash:/usr/share/logstash/config
- 获取ES容器IP
用于配置logstash.conf连接es时使用
ps aux|grep 9200
图中container-ip则为容器IP
- 编辑logstash.yml
由于我们使用xpack模式,需将host和xpack信息屏蔽掉或将xpack设置为【https://容器ip:9200】,否则会导致容器启动时直接连接[http://elasticsearch:9200](http://elasticsearch:9200),报连接异常
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "https://172.19.0.2:9200" ]
- 编辑logstash.conf
在input插件中添加TCP监听端口
在output插中添加es配置,主要配置容器IP、容器证书路径、ES账号密码
input{
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
type => "debug"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4561
codec => json_lines
type => "error"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4562
codec => json_lines
type => "business"
}
tcp {
mode => "server"
host => "0.0.0.0"
port => 4563
codec => json_lines
type => "record"
}
}
output {
elasticsearch {
hosts => ["https://172.19.0.2:9200"]
index => "logstash-springboot-%{type}-log"
user => "elastic"
password => "20220616"
cacert => '/usr/share/logstash/config/http_ca.crt'
#ssl => true
#ssl_certificate_verification => false
}
}
注意:
- logstash连接docker环境的Elasticserarch 8.x版本时,hosts设置本地IP或localhost、127.0.0.1无法正常连接es,需设置为es容器的IP(非docker环境和低版本没有这种问题)
- 另外,ELK容器重启时,需确保es容器是第一个启动,否则es的容器IP可能会发生变化导致logstash和kibana无法正常连接es(通过设置子网络方式,在容器创建时绑定容器ip可避免此问题)
- 重启logstash容器
docker restart logstash
查看logstash日志,如果出现开始监听端口的日志,说明logstash配置成功生效
docker logs logstash --tail=100

此时我们可以在kibana界面看到,logstash通过监听端口,将日志同步到es,并最终展示在kibana界面。如图
至此整个ELK安装及配置流程就全部结束了,疯狂撒花。。。
本案例最后采用的是端口监听的方式收集日志 高版本的Elastic已经提供了功能更强大的日志收集插件Fleet,Elastic官方博客已经写得很详细了,大家可以参考一下 本人对Fleet研究不深,暂时还无法通过Fleet监听自定义日志文件,只能通过Filebeat组件的方式,将日志监听并转发到logstash或es上
