
首先必须指出的是,在我之前的文章 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x”,我有详述根据官方文档如何创建一个带有三个节点的安全 Elasticsearch 集群。本文基于著名的 Deviatony 存储库和 Elastic 的官方说明。 建议先通读这些说明,如果你已经可以根据这些说明开始搭建你自己的 Elastic Stack,则可以跳过本指南。
Elastic Stack(以前称为 ELK stack)是三个开放及免费产品的集合 —— Elasticsearch、Logstash 和 Kibana。
使用 Elastic Stack 的好处:
与 Deviatony 的 repo 相比,本文所使用的 Elastic Stack 有更多的附加功能:
将此存储库克隆到你的 Docker 主机并 check out 分支 single-node-cluster:
- git clone https://github.com/Uhuynh/elastic-stack-docker.git
- git checkout single-node-cluster
主项目结构如下:
- $ pwd
- /Users/liuxg/data/elastic-stack-docker
- $ tree -L 3
- .
- ├── LICENSE
- ├── Makefile
- ├── docker-compose.setup.yml
- ├── docker-compose.yml
- ├── elasticsearch
- │ ├── Dockerfile
- │ ├── config
- │ │ └── elasticsearch.yml
- │ └── entrypoint.sh
- ├── kibana
- │ ├── Dockerfile
- │ ├── config
- │ │ └── kibana.yml
- │ └── entrypoint.sh
- ├── logstash
- │ ├── Dockerfile
- │ ├── config
- │ │ ├── logstash.yml
- │ │ └── pipelines.yml
- │ ├── entrypoint.sh
- │ ├── log_files
- │ │ └── test.log
- │ └── pipeline
- │ └── test_logs.conf
- ├── markdown
- │ ├── login_page.png
- │ └── user-page.png
- └── setup
- └── elasticsearch
- ├── Dockerfile
- ├── certs.sh
- ├── entrypoint.sh
- ├── helpers.sh
- ├── initialize.sh
- └── roles
elasticsearch.yml、kibana.yml 和 logstash.yml 是 Elastic Stack 中每个服务的主要配置文件。
从 Elasticsearch 8.0 开始,默认启用安全性。 启用安全性后,Elastic Stack 安全功能需要对传输网络层进行 TLS 加密,否则你的集群将无法启动。
要开始使用 Elasticsearch 安全性,你需要生成证书颁发机构 (CA),然后使用它为集群中的每个节点生成证书:
docker-compose -f docker-compose.setup.yml run --rm es_certs
- $ docker-compose -f docker-compose.setup.yml run --rm es_certs
- [+] Running 1/0
- ⠿ Network elastic-stack-docker_default Create... 0.0s
- [+] Running 11/11
- ⠿ es_certs Pulled 40.2s
- ⠿ 95e9c9b381a6 Pull complete 5.2s
- ⠿ 9a45f418de13 Pull complete 5.3s
- ⠿ 00871d1ebcfa Pull complete 5.4s
- ⠿ 89732bc75041 Pull complete 5.4s
- ⠿ f2cd942089ee Pull complete 33.1s
- ⠿ 311f3ae295d1 Pull complete 33.1s
- ⠿ e0351d108cd0 Pull complete 33.2s
- ⠿ a88cdf3ed11e Pull complete 33.2s
- ⠿ c168e6f97f22 Pull complete 33.3s
- ⠿ 81858e17f7f1 Pull complete 33.3s
- Creating Certificate Authority...
- Archive: /certs/ca.zip
- creating: /certs/ca/
- inflating: /certs/ca/ca.crt
- inflating: /certs/ca/ca.key
- Creating certs...
- Archive: /certs/certs.zip
- creating: /certs/es/
- inflating: /certs/es/es.crt
- inflating: /certs/es/es.key
- Setting file permissions
- Setup certs done!
这将启动 es_certs 容器,然后执行 ./setup/elasticsearch/certs.sh 中的 Bash 脚本。 请注意,容器必须由 root 用户运行。
成功运行后,你应该会在项目目录的 ./certs 文件夹中看到生成的证书和密钥:
- $ ls
- LICENSE docker-compose.yml markdown
- Makefile elasticsearch setup
- certs kibana
- docker-compose.setup.yml logstash
- $ pwd
- /Users/liuxg/data/elastic-stack-docker
- $ tree certs -L 2
- certs
- ├── ca
- │ ├── ca.crt
- │ └── ca.key
- ├── es
- │ ├── es.crt
- │ └── es.key
- └── instances.yml
然后,你可以将 Elasticsearch 配置为在与其他节点通信时使用这些证书进行身份验证和加密。
elasticsearch.yml
- # in elasticsearch.yml
-
- # Transport Protocol (inter-node communication)
- # note: production nodes won't start without this feature
- xpack.security.transport.ssl.enabled: true
- xpack.security.transport.ssl.verification_mode: certificate
- xpack.security.transport.ssl.key: certs/es/es.key
- xpack.security.transport.ssl.certificate: certs/es/es.crt
- xpack.security.transport.ssl.certificate_authorities: certs/ca/ca.crt
-
- # HTTP Protocol (communication between ES and Kibana / Logstash)
- xpack.security.http.ssl.enabled: true
- xpack.security.http.ssl.verification_mode: certificate
- xpack.security.http.ssl.key: certs/es/es.key
- xpack.security.http.ssl.certificate: certs/es/es.crt
- xpack.security.http.ssl.certificate_authorities: certs/ca/ca.crt
kibana.yml
- # in kibana.yml
-
- ## Communications between Kibana and Elasticsearch
- ## see https://www.elastic.co/guide/en/kibana/current/configuring-tls.html#configuring-tls-kib-es
- elasticsearch.ssl.certificateAuthorities: config/certs/ca/ca.crt.crt
我们在 terminal 中打入如下的命令:
docker-compose up -d
除了用于 Elasticsearch、Logstash 和 Kibana 的 3 个主要容器之外,还有一个设置容器,它运行一个初始脚本来为系统用户(kibana_system、logstash_system)设置密码并创建一个 logstash_internal 用户以将数据写入 Elasticsearch。
你应该从设置容器中看到以下日志:
- $ pwd
- /Users/liuxg/data/elastic-stack-docker
- $ ls
- LICENSE docker-compose.yml markdown
- Makefile elasticsearch setup
- certs kibana
- docker-compose.setup.yml logstash
- $ docker-compose up -d
- [+] Running 4/4
- ⠿ Container elastic-stack-docker-es-1 Ru... 0.0s
- ⠿ Container elastic-stack-docker-setup-1 Started 0.3s
- ⠿ Container elastic-stack-docker-kibana-1 Running 0.0s
- ⠿ Container elastic-stack-docker-logstash-1 Started 0.3s
最后我们看到如下的信息:
- $ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- de558e082f4a elastic-stack-docker-logstash "/opt/setup/entrypoi…" 41 seconds ago Up 40 seconds 5044/tcp, 9600/tcp, 0.0.0.0:5100->5100/tcp elastic-stack-docker-logstash-1
- 78b590b1e6c7 elastic-stack-docker-kibana "/opt/setup/entrypoi…" 3 minutes ago Up 3 minutes 0.0.0.0:5601->5601/tcp elastic-stack-docker-kibana-1
- ef4e93ed4c16 elastic-stack-docker-es "/opt/setup/entrypoi…" 3 minutes ago Up 3 minutes (healthy) 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elastic-stack-docker-es-1
我们可以看到如上的三个容器正在运行。
注意:在没有定义 elastic 超级用户密码的情况下,它的默认密码是:elastic-pass。我们可以使用这个密码来登录 Kibana。
要自定义此初始脚本,你可以查看文件 ./setup/elasticsearch/initialize.sh
等待 1 到 2 分钟让堆栈完成设置,然后在浏览器中访问 Kibana localhost:5601 并使用 docker-compose.yml 中定义的用户 elastic 和密码登录

堆栈中已经配置了一个 Logstash 管道,用于将日志从 ./logstash/log_files/test.log 加载到 Elasticsearch 中。
导航到 Management -> Stack Management -> Kibana -> Data View 为这些日志条目创建 data view。

然后你可以导航到 Kibana Analytics -> Discover 以查看、搜索、分析日志条目并创建可视化。

使用 Elastic Stack 进行愉快的测试!希望对你学习之旅有所帮助!