docker-compose 搭建 单机版ELK
前言
本次部署将使用ElasticSearch官方的镜像和Docker-Compose来创建单节点的ELK,用于学习ELK操作。在k8s集群内,如果每天的日志量超过20G以上,建议部署在k8s集群外部,以支持分布式集群的架构。在这种情况下,我们将采用有状态部署的方式,并且使用动态存储进行持久化。在运行该yaml文件之前,需要提前创建好存储类。本文档将仅使用常用的ElasticSearch + LogStash + Kibana组件。
准备
环境
- 操作系统:Centos 7(虚拟机)
- Docker:26.0.0
- Docker-Compose:2.25.0
- ELK Version:7.17.2
文件目录
/docker/
├── elk
│ ├── docker-compose.yml
│ ├── elasticsearch
│ ├── kibana
│ │ └── config
│ │ └── kibana.yml
│ └── logstash
│ ├── config
│ │ └── logstash.yml
│ └── pipeline
│ └── logstash.conf
部署流程
创建 Docker-Compose 的配置文件。
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.2
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
restart: always
environment:
# 设置集群名称
cluster.name: elasticsearch
# 以单一节点模式启动
discovery.type: single-node
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /docker/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
networks:
- elk
logstash:
image: logstash:7.17.2
container_name: logstash
restart: always
ports:
- "4560:4560"
volumes:
- /docker/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- /docker/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- elasticsearch
links:
#可以用es这个域名访问elasticsearch服务
- elasticsearch:es
networks:
- elk
kibana:
image: kibana:7.17.2
container_name: kibana
restart: always
ports:
- "5601:5601"
depends_on:
# kibana在elasticsearch启动之后再启动
- elasticsearch
environment:
#设置系统语言文中文
I18N_LOCALE: zh-CN
# 访问域名
# SERVER_PUBLICBASEURL: https://kibana.cloud.com
volumes:
- /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
links:
#可以用es这个域名访问elasticsearch服务
- elasticsearch:es
networks:
- elk
networks:
elk:
name: elk
driver: bridge
在 Services 中声明了三个服务:
- elasticsearch
- logstash
- kibana
ElasticSearch 服务的配置注意事项:
- environment 环境设置中 discovery.type 属性设置成 ‘single-node’ ,主要目的是将 ES 的集群发现模式配置为单节点模式。
- environment 环境设置中 ES_JAVA_OPTS 的 Xms 属性和 Xmx 属性建议设置成大于 ‘-Xms512m -Xmx512m’ ,主要是为了防止 ES 启动成功后,无法查询消息。
- volumes 持久卷设置中的 /etc/localtime:/etc/localtime 主要目的是将 Docker 容器中的时间与宿主机同步。
- volumes 持久卷设置中的 ./es/data:/usr/share/elasticsearch/data 主要目的是将 ES 的数据映射到对应的宿主机中,并做持久化设置。
LogStash 服务的配置注意事项:
- volumes 持久卷中的 ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:将宿主机本地的 LogStash 配置映射至 Logstash 容器内部。
- volumes 持久卷设置中的 /etc/localtime:/etc/localtime 主要目的是将 Docker 容器中的时间与宿主机同步。
- environment 环境设置中 MONITORING_ENABLED 属性设置成 false ,主要目的是关闭 LogStash 监控功能,避免容器崩溃。
- environment 环境设置中 ES_JAVA_OPTS 的 Xms 属性和 Xmx 属性建议设置成 ‘-Xms1024m’ ‘-Xmx1024m’ ,主要是为了防止 Logstash 消费消息时突然崩溃。
- depends_on 设置,设置成 elasticsearch,表示 LogStash 容器的启动必须依赖于 ES 容器启动,如果 ES 启动失败,则 LogStash 启动也失败。
Kibana 服务的配置注意事项:
- volumes 持久卷设置中的 /etc/localtime:/etc/localtime 主要目的是将 Docker 容器中的时间与宿主机同步。
- volumes 持久卷中的./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml,主要目的是 Kibana 容器启动使用外部配置文。
- environment 环境设置中 ELASTICSEARCH_URL 属性设置成 ‘http://elasticsearch:9200’ ,主要目的是连接 ES 容器,监控 ES 服务。
- environment 环境设置中 I18N_LOCALE 属性设置成 zh-CN ,主要目的将 Kibana 的系统语言设置成中文,可视化页面同时也是中文语言。
- depends_on 设置,设置成 elasticsearch,表示 Kibana 容器的启动必须依赖于 ES 容器启动,如果 ES 启动失败,则 Kibana 启动也失败。
Kibana 配置
创建 kibana.yml 文件
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
- server.host:设置成 0.0.0.0 表示 允许所有机器访问
- elasticsearch.hosts:设置成 ES 服务地址,可以是单机地址,也可以是服务地址
- monitoring.ui.container.elasticsearch.enabled:是否开启对 ES 进行容器监控
LogStash 配置
创建服务主体配置 logstash.yml 文件
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
- http.host:设置成 0.0.0.0 表示Elasticsearch绑定的主机地址
- elasticsearch.hosts:指定了用于监控Elasticsearch实例的地址
传输管道配置 logstash.conf
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "%{[spring.application.name]}-%{+YYYY.MM.dd}"
}
}
部署测试
docker-compose 启动
docker-compose up -d elasticsearch kibana logstash
访问 9200 端口查看 elasticsearch 是否启动成功
访问 5601 端口查看 Kibana 容器是否启动
整合SpringBoot
在项目中引入Maven依赖
<!-- logstash -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
修改项目内的 logback.xml
文件 增加 logstash
配置
<!-- logstash -->
<springProperty scope="context" name="appName" source="spring.application.name"/>
<!--输出到logstash的appender-->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>${logstash.host:logstash.port}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"spring.application.name":"${appName}"}</customFields>
</encoder>
</appender>
<root level="info">
<appender-ref ref="logstash"/>
</root>
访问 Kibana 查看是否成功推送日志
配置索引模式
这里使用通配符 整合查看所有 *-*
开头的索引
查看使用日志索引
参考资料
- https://lionli.blog.****.net/article/details/125743132
- https://juejin.cn/post/7143974532766760990
- https://www.bilibili.com/video/BV1zm4y1i7WW/?share_source=copy_web&vd_source=bb5feb0740121cd1369c48b793f9c393