docker方式部署ELK

    技术2022-07-11  83

    1.拉取原始镜像: docker pull sebp/elk:660

    2.启动下镜像方便进入,进行自定义配置修改:

    docker run -dit --name elk \

    -p 5601:5601 \

    -p 9200:9200 \

    -p 5044:5044 \

    -v /data/elasticsearch:/var/lib/elasticsearch \

    -v /etc/localtime:/etc/localtime \

    sebp/elk:660

    这里说明下5601是kibana的端口,9200是ES的端口,5044是logstash的端口

    /data/elasticsearch 要修改为你自己的索引存放目录

    3.进入到容器中,进行自定义配置修改:

    docker exec -it elk /bin/bash

    我们先修改logstash的配置,进入到如下目录:

    cd /etc/logstash/conf.d

    因为我们打算使用filebeat来发送数据给logstash,我们只保存一个配置文件: 02-beats-input.conf 其余的都删除掉

    编辑02-beats-input.conf的内容,我的内容如下:

    beats {

    port => 8871

    }

    }

    filter {

    grok {

    patterns_dir => ["/etc/logstash/patterns"]

    match => {

    "message" => "\[%{LOGEVL:level}\]\s*%{DAYTIME:day}\s*%{THREAD:thread}\s*%{JAVACLASS:class}\s*-"

    }

    }

    date {

    match => [ "day", "yyyy-MM-dd HH:mm:ss,SSS", "ISO8601" ]

    locale => "en"

    target => [ "@timestamp" ]

    timezone => "Asia/Shanghai"

    }

    }

    output {

    elasticsearch {

    hosts => ["localhost:9200"]

    index => "log_collection_%{+YYYY.MM.dd}"

    document_type => "logs"

    }

    }

    这里我们使用了 filter 和 date .详细配置可以参考 https://blog.csdn.net/hushukang/article/details/84423184

    这里我们的目的是为了使符合要求的日志能解析出来特殊的字段.然后我们用日志中的时间代替了timestamp方便索引的排序

    这里我们完成了对数据接收的端口进行了修改,现在用8871进行数据接受了

    patterns_dir => ["/etc/logstash/patterns"] 中定义了我们自己的正则匹配规则,文件内容如下:

    DAYTIME \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{1,2}.\d{1,4}

    LOGEVL [a-zA-Z]{4,5}

    THREAD \[http-nio-\d{4}-exec-\d{1,3}\]|\[pool-\d{1,2}-thread-\d{1,5}\]

    如果对kibana端口有要求的话,还可以进行关修改:

    vim /opt/kibana/config/kibana.yml

    这里我修改为:8872

    # Kibana is served by a back end server. This setting specifies the port to use.

    server.port: 8872

     

    4.将自定义完成后的镜像发送到我们自己的镜像仓库中:

    docker ps | grep elk # 查看正在运行的 docker 的 container id docker commit container id xxxxxxx/log_collection:v1 # 生成一个新的 image docker push xxxxxxx/log_collection:v1 # 将 image push 到 docker 仓库

     

    5.将镜像部署到线上,这里各个公司的平台不同,需要根据自己的平台来写脚本了.不在描述

       部署的物理机需要执行如下命令:

       echo "vm.max_map_count=262144" > /etc/sysctl.conf

    sysctl -p

    6.配置相关项目,使用filebeat将日志.在打docker时加入如下内容:

     

    RUN tar xzvf filebeat-6.7.1-linux-x86_64.tar.gz ##这里自己下载filebeat加入到docker中

     

    RUN echo 'filebeat.inputs:' > /nerv.app/filebeat.yml

    RUN echo '- type: log' >> /nerv.app/filebeat.yml

    RUN echo ' enabled: true' >> /nerv.app/filebeat.yml

    RUN echo ' paths:' >> /nerv.app/filebeat.yml

    RUN echo ' - /home/servlets/logs/${ONEBOX}/${ONEBOX}.log' >> /nerv.app/filebeat.yml

    RUN echo ' tags: [\"${ONEBOX}\"]' >> /nerv.app/filebeat.yml

    RUN echo 'output.logstash:' >> /nerv.app/filebeat.yml

    RUN echo ' hosts: [\"部署elk的机器:8871\"]' >> /nerv.app/filebeat.yml

     

    RUN echo '#!/bin/bash' > /nerv.app/start.sh

    RUN echo '/filebeat-6.7.1-linux-x86_64/filebeat -e -c /nerv.app/filebeat.yml -d \"sendinglog\" 1> /dev/null &' >> /nerv.app/start.sh

    RUN echo '\$@ |tee /home/servlets/logs/${ONEBOX}/${ONEBOX}.log' >> /nerv.app/start.sh

    RUN chmod u+x /nerv.app/start.sh

    这里其实主要是加入了filebeat服务和写了一个filebeat的启动配置,具体配置信息可以网上找找.然后写了一个启动filebeat的启动脚本

     

    7.部署服务发送数据到elk中.这步和你原来部署服务没有区别,只是在执行脚本前面加入 /nerv.app/start.sh 用来启动filebeat服务即可

     

    8.效果展示:

     

    9.定期索引删除:考虑磁盘使用.我们写个脚本定期删除索引,释放磁盘空间.内容如下

     

    delete_index=`date -d '10 days ago' +%Y.%m.%d`

    echo $delete_index

    index_data={\"indices\":[\"log_collection_$delete_index\"]}

    echo $index_data

    curl 'http://elk机器名:8872/api/index_management/indices/delete' -H 'Content-Type: application/json;charset=utf-8' -H 'kbn-version: 6.6.0' --data $index_data

     

    我这里是只保存10天的日志内容.到这里基本大的流程结束.后面都是日志格式的微调了.

     

    Processed: 0.009, SQL: 9