• 使用 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

    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 环境,如何与项目结合使用后续再分享

  • 相关阅读:
    Python 既是解释型语言,也是编译型语言
    kubeadm方式部署单节点kubernetes环境
    CentOS7使用技巧
    【线性代数】第四章-n维向量:向量、向量组、线性表出、极大无关组与向量组的秩等
    cs夏令营经验分享
    LeetCode //C - 46. Permutations
    SpringBoot使用spring.config.import多种方式导入配置文件
    Rust借用几种变化情况分析
    聊聊Hystrix的源码
    云原生、Serverless、微服务概念
  • 原文地址:https://www.cnblogs.com/morang/p/17976704/devops-docker-elk-install-nginx-config