+ 使用 Docker Compose 安装 ELK +
+ + +印象里每次安装 ElK
组件的体验都不是很好,或多或少都遇到过奇奇怪怪的问题。本文几乎完全按照官方文档:Getting started with the Elastic Stack and Docker Compose: Part 1 通过 docker compose
安装 elasticsearch
、kibana
、metricbeat
、filebeat
和 logstash
,但是移除了 ssl
相关的配置。你可以直接按照原文档进行安装,但是对照本文可以帮助你更快速地移除不需要的配置以及绕开可能踩到的坑。
此安装方式尽量使用环境变量代替编写配置文件,便于在备份和分享时将敏感信息留存在本地。本次安装时间为 2023-12-14
,使用官方镜像,版本为 8.11.2
。
++如果不考虑持久化配置,直接进入容器手动修改配置文件可能也很合适。
+
文件结构
+1 | ├── .env |
环境文件
我们可以在 .env
文件中定义一些准备传递给 docker-compose
文件的变量,比如密码、版本和端口号等等。
++将敏感或者重复使用的信息放在
+.env
文件中,并在.gitignore
文件中忽略该文件,就可以更方便地将docker-compose
文件备份到GitHub
或者分享给他人。
1 | # Project namespace (defaults to the current folder name if not set) |
++在官方文档中,使用了一个名为
+setup
的容器,用于做一些前置准备工作,比如ssl
相关的配置和账号密码的设置。以下因为不需要配置ssl
所以不使用setup
容器,Kibana
的账号密码另行手动设置。
ElasticSearch
在 docker-compose.yml
文件中添加 ElasticSearch
部分。
1 | version: '3.8' |
健康检测
对 Elasticsearch
进行健康检测的方式是对其发起 HTTP
请求,在本示例中目标地址为 http://localhost:9200
,因为启用了密码,因此返回结果里会带有 ‘missing authentication credentials’ 字样,成功匹配。
在官方文档中的示例是携带 --cacert
参数发起 HTTPS
请求:
1 | curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 |
如果在后续启动时发现 elasticsearch
容器长时间处于 waiting
状态,不能转为 healthy
:
-
+
- 检查是不是写成
https
+ - 手动执行命令查看返回结果是否符合期望,像我原先复制了
Kibana
中配置的测试命令,最后发现多了一个-I
参数导致启动一直不能完成。
+
限制内存失败
你可能会遇到以下警告:
+1 | WARNING: Your kernel does not support cgroup swap limit. WARNING: Your |
原因是系统默认未开启 swap
限制。开启后即使 Docker
未运行,内存和交换计算也会产生约 1%
的总可用内存的开销和 10%
的整体性能下降。开启方式如下:
-
+
- 编辑配置文件
sudo vim /etc/default/grub
+ - 设置
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1
+ sudo update-grub
+- 重启
sudo reboot
(直接关闭虚拟机再启动似乎不能生效)
+
验证 Elasticsearch 启动成功
在启动后,访问 http://localhost:9200/
,会弹出验证登录对话框,代表 elasticsearch
启动成功
输入账号密码后显示 Elasticsearch
信息,代表正常运行。
1 | { |
Kibana
在 docker-compose.yml
文件中添加 Kibana
部分。
1 | kibana: |
设置 Kibana 密码
配置的账号密码是给 Kibana
用于连接 Elasticsearch
的,并非用于登录 Kibana
的,也不可用于登录。elastic
的账号密码才是登录 Kibana
的账号密码。
在官方文档中,是通过 setup
容器完成 kibana_system
账号的密码设置,脚本中执行的命令如下:
1 | curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" |
仿照脚本手动发起请求,设置 kibana_system
的密码。
1 | curl -s -X POST -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" http://localhost:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" |
++你也可以进入容器使用
+elasticsearch-setup-passwords
设置密码。
设置密钥
密钥部分如果不配置,会影响 Kibana
的功能使用:
查看日志会看到以下报错信息。
+1 | [2023-12-14T18:02:17.493+00:00][ERROR][plugins.observabilityAIAssistant] Error: Unable to create actions client because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command. |
你可以通过以下方式自己生成:
+1 | 进入 kibana 容器 |
结果如下:
+1 | Kibana is currently running with legacy OpenSSL providers enabled! For details and instructions on how to disable see https://www.elastic.co/guide/en/kibana/8.11/production.html#openssl-legacy-provider |
Kibana 未准备就绪
你可能访问 Kibana
时还会遇到 Kibana server is not ready yet
的报错信息,这次我在使用原先的 bitnami
的镜像时怎么都解决不了这个问题。可以参考Kibana 最常见的“启动报错”或“无法连接ES集群服务”的故障原因及解决方案汇总,或者像我一样直接换镜像换版本试试。
++如果成功完成以上安装,几乎就没有硬坑了。以下部分是完全照搬官方文档,可以不安装。如果想要快速在视觉上有一些感受,也可以安装体验。
+
metricbeat
在 docker-compose.yml
文件中添加 metricbeat
部分。
1 | metricbeat: |
metricbeat.yml
和官方文档相比,移除了 ssl
相关的配置。
1 | metricbeat.config.modules: |
容器退出
你可能会遇到 metricbeat
容器启动完毕就立即退出的问题,查看容器日志可知,metricbeat.yml
文件必须属于 uid=0
的用户或者 root
用户。
1 | Exiting: error loading config file: config file ("metricbeat.yml") must be owned by the user identifier (uid=0) or root |
执行命令:
+1 | sudo chown root metricbeat.yml |
在修改完你可能会发现问题还是没有被解决,再次查看日志可知,metricbeat.yml
文件的权限必须为 “-rw-rw-r--
“。
1 | Exiting: error loading config file: config file ("metricbeat.yml") can only be writable by the owner but the permissions are "-rw-rw-r--" (to fix the permissions use: 'chmod go-w /usr/share/metricbeat/metricbeat.yml') |
执行命令:
+1 | sudo chmod 0644 metricbeat.yml |
+++
filebeat.yml
文件存在相同的问题,可以提前解决。
前往“左侧菜单栏->Management->堆栈监测” 查看集群概览,Kibana
会提示可以使用开箱即用的规则。
filebeat
在 docker-compose.yml
文件中添加 filebeat
部分。
1 | filebeat: |
filebeat.yaml
1 | filebeat.inputs: |
前往“左侧菜单栏->Observability->日志->Stream” 查看流式传输。
+ + +logstash
在 docker-compose.yml
文件中添加 logstash
部分。
1 | logstash: |
logstash.conf
1 | input { |
前往“左侧菜单栏->Analytics->Discover”,查看数据视图。
+ + +++ +每一次不顺利的安装都是一场折磨。
+