ELK 8.x 版本增加了安全特性,默认开启了xpack模式,在安装上跟低版本有一些不同的地方 本案例采用Docker方式安装ELK相关镜像 ELK镜像版本必须保持一致

ELK的介绍和低版本的安装请参考我之前写的文章 安装与搭建ELK架构实现日志同步
好了,现在开始真正的表演了

一、创建网络

创建自定义的网络(用于同一网络的服务之间可以相互通信)
创建网络有两种方式:
1)普通方式
2)设置子网络方式:主要解决容器重启ip变化的问题

  1. # 普通方式(本案例采用方式)
  2. docker network create elastic
  3. # 设置子网络方式
  4. 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

本案例采用第二种方式生成密码,生成密码过程及结果如图
图片.png

  • 生成enrollment-token

用于后续kibana登陆验证(token需在有效期内使用,过期需重新生成)

# 进入elasticsearch容器,执行以下命令生成token
./bin/elasticsearch-create-enrollment-token --scope kibana

生成token结果如图
图片.png

  • 拷贝证书

切换到宿主主机,复制容器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浏览器导入证书,流程如图
图片.png图片.png

  • 登陆访问es页面

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


图片.png图片.png

三、安装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输入框,如图:
图片.png图片.png

  • 获取verification-code ```shell

    进入kibana容器内容

    docker exec -it kibana /bin/bash

生成认证码

./bin/kibana-verification-code


认证码生成结果如图<br />![图片.png](https://cdn.nlark.com/yuque/0/2022/png/21474187/1655369722311-1b5961ce-f079-437b-9436-bc27da6a1c28.png#clientId=u209094b5-5caf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=91&id=u2209efc7&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=91&originWidth=673&originalType=binary&ratio=1&rotation=0&showTitle=false&size=10683&status=done&style=none&taskId=u0b8d6ac1-0d6d-4b12-bb09-2001a9a2e4f&title=&width=673)

将生成的verification code输入并验证成功后,弹出登陆页面<br />此时输入elastic账号及密码,登陆成功会显示欢迎页面<br />至此整个kibana安装及配置流程全部完成,继续撒花。。。<br />![图片.png](https://cdn.nlark.com/yuque/0/2022/png/21474187/1655427855401-0ac6842f-70d0-4594-8f8e-dfe2ccbcdf23.png#clientId=u3fb7a5b0-ad46-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=698&id=u6f2f46f1&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=698&originWidth=678&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45180&status=done&style=none&taskId=u331677e3-57f9-40b0-8ee7-3055e2ff13b&title=&width=678)<br />![图片.png](https://cdn.nlark.com/yuque/0/2022/png/21474187/1655370058882-dd28b645-cebd-4ee9-b464-d65d35b9cef1.png#clientId=u209094b5-5caf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=630&id=ue7cc5e2b&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=630&originWidth=866&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33904&status=done&style=none&taskId=ue7740e25-f9e4-486f-ae4a-ef9107727f9&title=&width=866)![图片.png](https://cdn.nlark.com/yuque/0/2022/png/21474187/1655370275961-d7e9687f-07ae-486c-aab4-e25dd389704e.png#clientId=u209094b5-5caf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=887&id=u5aca8ae4&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=887&originWidth=1893&originalType=binary&ratio=1&rotation=0&showTitle=false&size=189336&status=done&style=none&taskId=uab5b609b-4592-4913-a4ce-dfa025ea00a&title=&width=1893)
<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
图片.png

  • 编辑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
    }
}

注意:

  1. logstash连接docker环境的Elasticserarch 8.x版本时,hosts设置本地IP或localhost、127.0.0.1无法正常连接es,需设置为es容器的IP(非docker环境和低版本没有这种问题)
  2. 另外,ELK容器重启时,需确保es容器是第一个启动,否则es的容器IP可能会发生变化导致logstash和kibana无法正常连接es(通过设置子网络方式,在容器创建时绑定容器ip可避免此问题)
  • 重启logstash容器
    docker restart logstash
    

查看logstash日志,如果出现开始监听端口的日志,说明logstash配置成功生效

docker logs logstash --tail=100

图片.png
此时我们可以在kibana界面看到,logstash通过监听端口,将日志同步到es,并最终展示在kibana界面。如图
图片.png

至此整个ELK安装及配置流程就全部结束了,疯狂撒花。。。

本案例最后采用的是端口监听的方式收集日志 高版本的Elastic已经提供了功能更强大的日志收集插件Fleet,Elastic官方博客已经写得很详细了,大家可以参考一下 本人对Fleet研究不深,暂时还无法通过Fleet监听自定义日志文件,只能通过Filebeat组件的方式,将日志监听并转发到logstash或es上

参考资料

运用 Fleet 来轻松地导入 Nginx 日志及指标