使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)

前言

ELK 是指 Elasticsearch、Logstash 和 Kibana 这三个开源软件的组合。

Elasticsearch 是一个分布式的搜索和分析引擎,用于日志的存储,搜索,分析,查询。

Logstash 是一个数据收集、转换和传输工具,用于收集过滤和转换数据,然后将其发送到 Elasticsearch 或其他目标存储中。

Kibana 是一个数据可视化平台,通过与 Elasticsearch 的集成,提供了强大的数据分析和仪表盘功能。

Filebeat 是 Elastic Stack(ELK)中的一个组件,用于轻量级的日志文件收集和转发。它能够实时监控指定的日志文件,并将其发送到 Elasticsearch 或 Logstash 进行处理和分析。

ELK的架构有多种,本篇分享使用的架构如图所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生产环境一天几千万的日志,内存占用大概 10G 左右

特点

  • 开源免费
  • 灵活性和可扩展性,高可用性,易扩展,支持集群
  • 高效的搜索和分析功能
  • 实时性
  • 易于使用

使用情况

  • 目前微服务项目使用,ELK单机部署,处理千万级日志无压力
  • 使用 Kibana 做了面板,根据面板监控系统情况
  • 使用 Docker 部署,方便快捷
  • 上手用还算简单,但是弄懂这一套,就不是那么容易了
  • 提炼出 docker compose 配置,分分钟部署好

实践

准备

  • 一台 linxu 服务器,内存 8G+
  • 安装 docker,docker compose
  • 新机器搭建后的运行情况,限制了Elasticsearch的jvm参数 4g

安装

本篇 ELK 的版本为 v7.8.1,本篇使用的容器网络为 devopsnetwork ,需创建 docker network create devopsnetwork

Elasticsearch 使用 docker compose 安装

  • 官方使用 Docker 安装文档

  • compose.yml

    • 指定了jvm参数:4g

    • 暴露端口 9200:该端口是Elasticsearch REST API的默认端口。

    • 暴露端口 9300:该端口是Elasticsearch节点之间的内部通信端口,默认用于节点之间的集群通信

    • 挂载数据目录 ./data及配置文件./config/elasticsearch.yml

    • 需要对两个目录进行授权,这里直接用了777,也可以根据官网使用对应es的用户id 1000

      version: '3.1'
      services:
      elk_elasticsearch:
      image: elasticsearch:7.8.1
      container_name: elk_elasticsearch
      restart: always
      environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms4096m -Xmx4096m
      ports:
      - 9200:9200
      - 9300:9300
      volumes:
      # 授权 chmod 777 ./config/ && chmod 777 ./data/
      - ./data:/usr/share/elasticsearch/data
      - ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      networks:
      - devopsnetwork

      networks:
      devopsnetwork:
      external: true

  • config/elasticsearch.yml

    network.host: 0.0.0.0
    xpack:
    ml.enabled: false
    monitoring.enabled: false
    security.enabled: false
    watcher.enabled: false

将其拷贝到服务器执行启动即可

复制代码
#cd /app/elasticsearch
mkdir ./config
mkdir ./data
chmod 777 ./config/ && chmod 777 ./data/
docker compose up -d

验证访问

Logstash 使用 docker compose 安装

  • 官方使用 Docker 安装 文档

  • compose.yml

    • 暴露端口5044:用于接收来自其他主机的日志数据、

    • 挂载的 ./pipeline./config目录可以运行容器复制出来

    • 需要将./config/logstash.yml 和 ./pipeline/logstash.conf 改成es地址,参考

      version: '3.1'
      services:
      elk_logstash:
      image: logstash:7.17.16
      container_name: elk_logstash
      restart: always
      ports:
      - 5044:5044
      volumes:
      # 授权 chmod 777 ./logs/ && chmod 777 ./data/ && chmod 777 ./pipeline/ && chmod 777 ./config/
      - /etc/timezone:/etc/timezone
      - /etc/localtime:/etc/localtime:ro
      - ./logs:/usr/share/logstash/logs
      - ./data:/usr/share/logstash/data
      - ./pipeline:/usr/share/logstash/pipeline
      - ./config:/usr/share/logstash/config
      networks:
      - devopsnetwork

      networks:
      devopsnetwork:
      external: true

  • pipeline/logstash.conf

    • 根据需要修改 output ,这里将推送到es地址中

    • 输出插件文档

      input {
      beats {
      port => 5044
      codec => json {
      charset => "UTF-8"
      }
      }

      }

      filter {

      }

      output {
      elasticsearch {
      hosts => ["http://192.168.123.102:9200"]
      index => "%{[app]}-%{+YYYY.MM.dd}"
      }
      stdout {
      codec => rubydebug
      }
      }

将其拷贝到服务器执行启动即可

复制代码
mkdir ./data
mkdir ./logs
chmod 777 ./logs/ && chmod 777 ./data/ && chmod 777 ./pipeline/ && chmod 777 ./config/ 
docker compose up -d

Kibana 使用 docker compose 安装

  • 官方使用 Docker 安装文档

  • compose.yml

    • 指定es节点是单节点,多节点使用zen

    • 挂载配置文件 ./config/kibana.yml

    • 暴露端口 5601:面板访问端口

      version: '3.1'
      services:
      elk_kibana:
      image: kibana:7.8.1
      container_name: elk_kibana
      restart: always
      environment:
      - discovery.type=single-node
      ports:
      - 5601:5601
      volumes:
      - ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
      networks:
      - devopsnetwork

      networks:
      devopsnetwork:
      external: true

  • config/kibana.yml

    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://192.168.123.102:9200/"]
    i18n.locale: "zh-CN"
    xpack:
    apm.ui.enabled: false
    graph.enabled: false
    ml.enabled: false
    monitoring.enabled: false
    reporting.enabled: false
    security.enabled: false
    grokdebugger.enabled: false
    searchprofiler.enabled: false

将其拷贝到服务器执行启动即可

复制代码
docker compose up -d

Filebeat 使用 docker compose 安装

  • compose.yml

    • 挂载filebeat的配置文件,数据目录及日志目录,需要设置权限

    • 挂载容器外的日志到容器内的日志采集目录

      version: '3.1'
      services:
      elk_filebeat:
      image: elastic/filebeat:7.8.1
      container_name: elk_filebeat
      restart: always
      volumes:
      # 授权 chmod 777 ./config/ && chmod 777 ./data/ && chmod 777 ./logs/ && chmod 777 /app/logs
      - ./config/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - ./data:/usr/share/filebeat/data
      - ./logs:/usr/share/filebeat/logs
      - /app/logs:/app/logs
      networks:
      - devopsnetwork

      networks:
      devopsnetwork:
      external: true

  • config/filebeat.yml

    • hosts 节点需要配置 logstash 地址

    • paths 指定日志目录

      output.logstash:
      #logstash hosts
      hosts: ["192.168.123.102:5044"]
      fields_under_root: true
      filebeat.inputs:

      • type: log
        enabled: true
        paths:
        - /app/logs//.log
        close_older: 24h
        ignore_older: 24h
        json.keys_under_root: true
        json.overwrite_keys: true
        encoding: utf-8
        filebeat.config.modules:
        path: ${path.config}/modules.d/*.yml
        reload.enabled: false
        setup.template.settings:
        index.number_of_shards: 3
        processors:
      • add_host_metadata: ~
      • add_cloud_metadata: ~
      • drop_fields:
        fields: ["log","@version","ecs","agent","beat","host","beat.hostname","beat.version","beat.name","prospector.type","input.type","host.id","host.name","host.os.build","host.os.family","host.os.name","host.os.platform","host.os.platform","log.file.path","tags","offset","host.architecture","host.os.version"]

安全使用

配置 nginx 域名转发

复制代码
server {

    listen 80;
    listen       443 ssl;
    server_name kibana.devops.test.com;  # 自行修改成你的域名

    ssl_certificate      /certs/kibana.devops.test.com/server.crt;
    ssl_certificate_key  /certs/kibana.devops.test.com/server.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
            proxy_pass http://192.168.123.102:5601;
            proxy_http_version 1.1;
            proxy_buffering off;
            proxy_request_buffering off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
}

配置完成,即可使用域名访问

配置 nginx 基本认证

在Nginx配置文件中添加以下内容

复制代码
location / {
    auth_basic "Restricted Content";
    auth_basic_user_file /certs/kibana.devops.test.com/passwd;
    ...
}

添加对应的passwd文件,使用 htpasswd 生成,如账号密码是 root devops666 的配置文件

复制代码
root:WvesKBTr22.wY

可以使用我 metools 工具的 密码生成器 生成

配置完成,重载配置后刷新页面就提示输入账号密码了

配置 nginx IP白名单

复制代码
location / {
    allow 192.168.123.201;   # 允许的IP地址
    deny all;              # 拒绝所有其他IP地址
}

后语

本篇只针对 ELK 的安装进行了介绍及整理对应的 Docker Compose 配置文件,后续即可快速安装配置 ELK 环境,如何与项目结合使用后续再分享

相关推荐
绝不偷吃2 小时前
ELK日志分析系统
运维·elk·jenkins
无敌暴龙兽z8 小时前
离线环境安装elk及设置密码认证
运维·elk
再看扣你眼8 小时前
ELK 日志分析系统
elk·日志分析系统
高山莫衣12 小时前
Docker Desktop导致存储空间不足时的解决方案
docker·容器·eureka
鹏大师运维12 小时前
在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
linux·运维·docker·容器·麒麟·统信uos·中科方德
lovely_nn12 小时前
docker 介绍
docker·k8s
Ahlson13 小时前
【fnNAS】docker的nginx配置html
nginx·docker·容器·fnnas
LuckyLay13 小时前
Compose 常用命令详解——AI教你学Docker
docker·容器·eureka
moppol13 小时前
容器化 vs 虚拟机:什么时候该用 Docker?什么时候必须用 VM?
运维·docker·容器
没有名字的小羊13 小时前
7.可视化的docker界面——portainer
docker·容器·eureka