特点:
- 单结点(E/L/K各一个容器),单主机
- 整个系统只有Kibana的网页端暴露在公网上,其他都在内网。
- Kibana使用https访问网页。Elastic使用账号密码登录,但不是https(因为按官方文档,给Elastic配内部访问的SSL特别麻烦),我觉得只配浏览器端公网访问用的Kibana的https就够了。
- Kibana支持网页端账号密码登录(实际上是与Elastic的账号密码系统完全绑定的,准确说是Elastic使用账号密码访问,Kibana自动侦测到了所以要求在网页上也登陆,而不是在Kibana里直接配)
- E/L/K 三个容器都映射出了config文件夹,可以任意改配置不丢失。
- E额外映射了data(数据不能丢)和plugins(为了安ik分词器,安分词器就不记录了,直接上github走流程,记得安完要给index或field加analyzer配置才能使用),基本实现全部重要内容的持久化。
- L额外映射了conf文件夹和my-dep文件夹,分别放管道配置和依赖(比如jdbc的架包),由于还映射了config,所以`pipeline.yml`等配置也是可以持久存储的,基本可以实现Logstash的全部配置内容的持久化,可以随便造。
- 他们仨用一个专用网络,通信很方便,也有利于以后扩展。
# 第一步:docker-compose
> 博文所有代码内容已脱敏处理,在需要的地方把<尖括号>里的内容替换成自己的,才能跑通。
不多说了,第一步,上 compose:
(盗别人的,自己改了点)
```yml
version: '2'
services:
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- xpack.security.enabled=true
- "ES_JAVA_OPTS=-Xms512m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
- elasticsearch_config:/usr/share/elasticsearch/config
- /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:7.17.5
container_name: kibana
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
volumes:
- kibana_config:/usr/share/kibana/config
- <你的ssl证书路径>:/cert
ports:
- <你的Kibana公网端口>:5601
networks:
- elastic
logstash:
image: docker.elastic.co/logstash/logstash:7.17.5
container_name: logstash
ports:
- 5044:5044
volumes:
- /root/logstash/pipeline/:/usr/share/logstash/pipeline/:ro
- /root/logstash/my-dep/:/usr/share/logstash/my-dep
- logstash_config:/usr/share/logstash/config
networks:
- elastic
networks:
elastic:
driver: bridge
```
# 第二步:配置Elastic用户密码机制
`elasticsearch.yml`:
```yml
cluster.name: "docker-cluster"
discovery.type: single-node
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.transport.ssl.verification_mode: none
xpack.security.transport.ssl.client_authentication: none
network.host: 0.0.0.0
action.auto_create_index: true
```
配完Elastic,先重启Elastic,然后终端打进容器去(`docker exec`),执行以下命令:
```bash
bin/elasticsearch-setup-passwords interactive
```
然后会让你输入好几个系统用户角色的密码,里面每个密码最好都记住,并且不同,最重要的是一个叫`elastic`的用户,它将自动成为Kibana网页端的管理员。
然后再重启。
# 第三步:配置L/K + 公网HTTPS
`logstash.yml`:
```yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "<你的elastic用户密码>"
```
当然 Logstash 不加工作流配置的话是跑不起来的,这里不多赘述,有一个好地方可以参考:[Logstash最佳实践](https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html)
`kibana.yml`:
```yml
server:
host: "0.0.0.0"
shutdownTimeout: "5s"
publicBaseUrl: "<你准备配置的公网URL地址>"
ssl:
enabled: true
key: /cert/<你的SSL证书>.key
certificate: /cert/<你的SSL证书>.pem
elasticsearch:
hosts: [ "http://elasticsearch:9200" ]
username: 'elastic'
password: '<你的elastic用户密码>'
xpack.security.encryptionKey: "something_at_least_32_characters"
```
最后,全部重启,应该就完成了。`https://你的Kibana公网URL地址`,访问Kibana提示需要输入密码,这时输入用户名elastic,密码就是刚刚设置的密码。
---
另外如果有其他的`beats`工具(`filebeats`、`metricbeats`),或者`APM`,要链接到Elastic,也都是需要密码的,否则会 HTTP Status 401。如果你觉得不太安全,随时加减用户(在网页端的设置界面)。