docker-compose 搭建 单机版ELK

时间:2024-05-30 18:41:03

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 是否启动成功

image-20240523100136814

访问 5601 端口查看 Kibana 容器是否启动

image-20240523100518010

整合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 查看是否成功推送日志

image-20240523105534647

配置索引模式

这里使用通配符 整合查看所有 *-* 开头的索引

image-20240523103407051

查看使用日志索引

image-20240523104724412

image-20240523105206661

参考资料

  • 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