My logo
Published on

docker-compose 运行 Elasticsearch 堆栈 (ELK)

使用 Docker 和 Docker Compose 运行 [Elastic 堆栈][elk-stack] 的最新版本。

更多信息可以从 Docker - ELK 7.6 : 使用 Docker Compose 的 Elastic 堆栈 获得。

它使我们能够通过使用 Elasticsearch 的搜索/聚合功能和 Kibana 的可视化能力来分析任何数据集。

基于 Elastic 的官方 Docker 镜像:

目录

  1. 要求
  2. 使用
  3. 配置
  4. JVM 调优
  5. 更进一步
  6. 注意

要求

主机设置

默认情况下,堆栈暴露以下端口:

  • 5000: Logstash TCP 输入
  • 9200: Elasticsearch HTTP
  • 9300: Elasticsearch TCP 传输
  • 5601: Kibana

使用

版本选择

本仓库尝试与 Elastic 堆栈的最新版本保持一致。master 分支跟踪当前主要版本 (7.x)。

要使用核心 Elastic 组件的不同版本,只需更改 .env 文件中的版本号。如果我们正在升级现有堆栈,请仔细阅读下一节中的注意事项。

启动堆栈

将此仓库克隆到将运行堆栈的 Docker 主机上,然后使用 Docker Compose 在本地启动服务:

$ docker-compose up

我们也可以通过在上述命令中添加 -d 标志来在后台运行所有服务(分离模式)。

:warning: 每当我们切换分支或更新已存在堆栈的版本时,都必须使用 docker-compose build 重建堆栈镜像。

要首次启动堆栈,请仔细阅读下面的章节。

清理

默认情况下,Elasticsearch 数据会持久化在一个卷中。

要完全关闭堆栈并删除所有持久化数据,请使用以下 Docker Compose 命令:

$ docker-compose down -v

初始设置

设置用户认证

:information_source: 请参考 如何启用付费功能 来启用认证。

堆栈预先配置了以下特权引导用户:

  • 用户: elastic
  • 密码: changeme

尽管所有堆栈组件都可以与此用户一起开箱即用,但我们强烈建议使用非特权 [内置用户][builtin-users] 以提高安全性。

  1. 为内置用户初始化密码
$ docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch

所有 6 个内置用户的密码将被随机生成。请记下它们。

  1. 取消设置引导密码 (可选)

从 Compose 文件 (docker-compose.yml) 中的 elasticsearch 服务中删除 ELASTIC_PASSWORD 环境变量。它仅用于在 Elasticsearch 初始启动期间初始化密钥库。

  1. 替换配置文件中的用户名和密码

在 Kibana 配置文件 (kibana/config/kibana.yml) 中使用 kibana 用户,在 Logstash 配置文件 (logstash/config/logstash.yml) 中使用 logstash_system 用户,替换现有的 elastic 用户。

替换 Logstash 管道文件 (logstash/pipeline/logstash.conf) 中 elastic 用户的密码。

:information_source: 不要在 Logstash 管道 文件中使用 logstash_system 用户,它没有足够的权限来创建索引。按照 [在 Logstash 中配置安全][ls-security] 中的说明创建具有适当角色的用户。

另请参阅下面的 配置 部分。

  1. 重启 Kibana 和 Logstash 以应用更改
$ docker-compose restart kibana logstash

:information_source: 在 [教程: 开始使用安全][sec-tutorial] 中了解更多关于 Elastic 堆栈安全性的信息。

注入数据

给 Kibana 大约一分钟初始化,然后用 web 浏览器访问 http://localhost:5601 的 Kibana web UI,并使用以下默认凭据登录:

  • 用户: elastic
  • 密码: <生成的 elastic 密码>

现在堆栈正在运行,我们可以继续注入一些日志条目。附带的 Logstash 配置允许我们通过 TCP 发送内容:

# 使用 BSD netcat (Debian, Ubuntu, MacOS system, ...)
$ cat /path/to/logfile.log | nc -q0 localhost 5000
# 使用 GNU netcat (CentOS, Fedora, MacOS Homebrew, ...)
$ cat /path/to/logfile.log | nc -c localhost 5000

我们还可以加载 Kibana 安装提供的样本数据。

创建默认 Kibana 索引模式

当 Kibana 首次启动时,它没有配置任何索引模式。

通过 Kibana web UI

:information_source: 在能够通过 Kibana web UI 配置 Logstash 索引模式之前,我们需要向 Logstash 注入数据。

从左侧边栏导航到 Kibana 的 Discover 视图。我们将被提示创建一个索引模式。输入 logstash-* 以匹配 Logstash 索引,然后在下一页选择 @timestamp 作为时间过滤字段。最后,点击 创建索引模式 并返回 Discover 视图以检查我们的日志条目。

有关索引模式配置的详细说明,请参阅 [连接 Kibana 与 Elasticsearch][connect-kibana] 和 [创建索引模式][index-pattern]。

在命令行上

通过 Kibana API 创建索引模式:

$ curl -XPOST -D- 'http://localhost:5601/api/saved_objects/index-pattern' \
    -H 'Content-Type: application/json' \
    -H 'kbn-version: 7.6.2' \
    -u elastic:<生成的 elastic 密码> \
    -d '{"attributes":{"title":"logstash-*","timeFieldName":"@timestamp"}}'

创建的模式将在首次打开 Kibana UI 时自动被标记为默认索引模式。

配置

:information_source: 配置不会动态重新加载,在任何配置更改后,我们需要重新启动单个组件。

如何配置 Elasticsearch

Elasticsearch 配置存储在 [elasticsearch/config/elasticsearch.yml][config-es] 中。

我们还可以通过在 Compose 文件中设置环境变量来指定要覆盖的选项:

elasticsearch:

  environment:
    network.host: _non_loopback_
    cluster.name: my-cluster

有关如何在 Docker 容器中配置 Elasticsearch 的更多详细信息,请参阅以下文档页面: [使用 Docker 安装 Elasticsearch][es-docker]。

如何配置 Kibana

Kibana 的默认配置存储在 [kibana/config/kibana.yml][config-kbn] 中。

也可以映射整个 config 目录而不是单个文件。

有关如何在 Docker 容器中配置 Kibana 的更多详细信息,请参阅以下文档页面: [在 Docker 上运行 Kibana][kbn-docker]。

如何配置 Logstash

Logstash 配置存储在 [logstash/config/logstash.yml][config-ls] 中。

也可以映射整个 config 目录而不是单个文件,但是我们必须注意 Logstash 将期望有一个 [log4j2.properties][log4j-props] 文件用于其自身的日志记录。

有关如何在 Docker 容器中配置 Logstash 的更多详细信息,请参阅以下文档页面: [为 Docker 配置 Logstash][ls-docker]。

如何启用付费功能

将 Elasticsearch 的 xpack.license.self_generated.type 选项的值从 basic 切换到 trial(参见 [许可设置][trial-license])。

如何扩展 Elasticsearch 集群

按照 Wiki 中的说明操作: 扩展 Elasticsearch

可扩展性

如何添加插件

要向任何 ELK 组件添加插件,我们必须:

  1. 向相应的 Dockerfile 添加一个 RUN 语句 (例如 RUN logstash-plugin install logstash-filter-json)
  2. 将相关的插件代码配置添加到服务配置中 (例如 Logstash 输入/输出)
  3. 使用 docker-compose build 命令重建镜像

JVM 调优

如何指定服务使用的内存量

默认情况下,Elasticsearch 和 Logstash 都以 [主机总内存的 1/4][default_heap_size] 分配给 JVM 堆大小启动。

Elasticsearch 和 Logstash 的启动脚本可以从环境变量的值附加额外的 JVM 选项,允许用户调整每个组件可以使用的内存量:

服务环境变量
ElasticsearchES_JAVA_OPTS
LogstashLS_JAVA_OPTS

为了适应内存稀缺的环境 (Docker for Mac 默认只有 2 GB 可用),在 docker-compose.yml 文件中每个服务的堆大小分配默认限制为 256MB。如果我们想覆盖默认的 JVM 配置,请编辑 docker-compose.yml 文件中匹配的环境变量。

例如,要增加 Logstash 的最大 JVM 堆大小:

logstash:

  environment:
    LS_JAVA_OPTS: -Xmx1g -Xms1g

如何启用到服务的远程 JMX 连接

与 Java 堆内存一样 (见上文),我们可以指定 JVM 选项来启用 JMX 并在 Docker 主机上映射 JMX 端口。

使用以下内容更新 {ES,LS}_JAVA_OPTS 环境变量 (我已将 JMX 服务映射到端口 18080,我们可以更改它)。不要忘记用我们 Docker 主机的 IP 地址更新 -Djava.rmi.server.hostname 选项 (替换 DOCKER_HOST_IP):

logstash:

  environment:
    LS_JAVA_OPTS: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=18080 -Dcom.sun.management.jmxremote.rmi.port=18080 -

🔊🔊 注意:要先创建 /var/log/colonial-spring 文件夹,不然启动会报错。

🔗🔗 这里的内容主要是参考实践翻译了- docker-compose-elk-stack