美文网首页
Make it works(2) 从零开始的Docker ELK

Make it works(2) 从零开始的Docker ELK

作者: 默而识之者 | 来源:发表于2018-09-28 08:11 被阅读0次

    我们自己的地图服务会打印如下json格式的日志:(时间字段和位置字段已针对ELK的处理)

    {"apikey":"XXXXXXX","ip":"192.168.3.208","tilesize":"512","x":100,"y":100,"z":10,"layer":"XXX","apiversion":"XXX","location":"33.1582,112.0155","@timestamp":"2018-09-25T10:50:20+08:00"}
    

    准备搭建一个地图服务的日志统计管理系统,我需要搭建一个怎样的环境呢?

    Elasticsearch(以下简称ES):作为核心引擎,接受日志消息
    Kibana:作为数据监控与展示的平台,当然,后期可能会增加其他的展示平台
    Logstash:作为向Elasticsearch导入日志数据的通道
    Logstash-GeoIP:作为解析IP地址为经纬度坐标的Logstash插件.
    Filebeat:作为轻量级的输入流,将本地日志读入Logstash中

    这一切我都准备利用Docker作为环境.(运行环境是Ubuntu 16.04 LTS)

    通过Docker搭建这个ELK系统,本身应该是比较方便的,不过实际上却走了相当多弯路.主要原因有一下几点.

    • ELK的版本变化问题.

      ELK的2.x,5.x,6.x在大方面与小细节上都有不小的差异.尤其是小细节的差异,也足够使整个环境都无法正常运行.而国内的相关教程很多并没有明确自己用的是那个版本,结果根本不起作用

    • Docker数据源的问题

      DockerHub的数据源还是5.x的,已经不再更新,现在推荐用官网的了.不过官网的Docker源并不稳定,起码我这里经常出现被墙导致的超时.最后是通过修改dns为8.8.8.8解决了问题

    修改 /etc/resolv.conf 文件,第一行加一句:nameserver 8.8.8.8
    

    这里我选择的是镜像sebp/elk,一下子将相同版本的ELK整合在一个镜像里了.此时官网最高版本是6.4.1,这里没有更新,还是6.4.0,不过一点也不影响使用就是了.

    FileBeat选用的是官网的镜像.

    原先用的是prima/filebeat.版本是6.2.3,不知道是什么原因,死活监视不到日志变动,所以就换回了官网镜像

    由于我已经在测试环境调试过配置文件,那在这里就一次性把ELK+Filebeat的配置全部调好.

    我个人习惯将所有配置文件放到一个大文件夹里

    文件结构如下

    image

    每个文件的内容如下

    filebeat/my.yml

    filebeat.inputs:
    - type: log
      enabled: true
      #待监视地址
      paths:
        - /home/log/*.log
      #打开的话解析到的json字段都会挂到根节点
      json.keys_under_root: true
      json.overwrite_keys: true
      json.add_error_key: true
    filebeat.config.modules:
      path: ${path.config}/modules.d/*.yml
      reload.enabled: false
    output.logstash:
      hosts: ["Docker_ELK:5044"] #Docker Link后的logstash的地址
      #logstash的认证文件的路径,没有它的话就会导入失败
      ssl.certificate_authorities: ["/home/logstash-beats.crt"]
      template.enabled: false
    

    logstash

    logstash/conf.d/02-beats-input.conf
    
    input {
      beats {
        port => 5044
        ssl => true
        ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
        ssl_key => "/etc/pki/tls/private/logstash-beats.key"
      }
    }
    

    这个文件是该镜像自带的,没做修改.

    logstash/conf.d/12-geoip.conf
    filter{
     geoip{
      source => "ip"
      database => "/home/GeoLite2-City.mmdb"
    fields=>["city_name","country_code2","country_name", "region_name","location"]
     }
    }
    

    指定了ip在日志中的字段,数据库的位置(在docker中挂载的位置),以及geoip插件导入elasticsearch后的字段,只显示"city_name","country_code2","country_name", "region_name","location"这几个字段,将冗余的去除.

    注意路径要写在容器内映射后的路径.

    logstash/conf.d/30-output.conf
    output {
      elasticsearch {
        hosts => ["localhost"]
        manage_template => true
    index => "%{[@metadata][beat]}-%{+YYYY.MM.DD}"
        document_type => "%{[@metadata][type]}"
        template_name => "filebeat"
        template => "/home/template.json"
        template_overwrite => true
      }
    }
    

    指定了模板的路径,因为未使用ES中定义的模板,所以我觉得设置模板名没什么用.

    将template_overwrite和manage_template 都设为true,保证一定按定义的模板去导入.

    logstash/filebeat_template.json
    
    {
     "index_patterns": "filebeat-*",
     "settings": {
      "index.number_of_shards": 3,
      "number_of_replicas": 0
     },
     "mappings": {
      "doc": {
       "dynamic_templates": [{
        "location": {
         "match": "location",
         "mapping": {
          "type": "geo_point"
         }
        }
       }]
      }
     }
    }
    

    导入ES的模板文件.采用动态模板.除了地理坐标字段,其他的都让ES自己判定

    模板这个坑比较大,因为ES 6.x系列的模板格式似乎发生了改变,很多旧的模板已经没法用了.

    如果模板格式错误或没找到,会报

    Got response code '400' contacting Elasticsearch at URL

    logstash/logstash-beats.crt
    -----BEGIN CERTIFICATE-----
    MIIC6zCCAdOgAwIBAgIJANPZwuf+5wTLMA0GCSqGSIb3DQEBCwUAMAwxCjAIBgNV
    BAMMASowHhcNMTUxMjI4MTA0NTMyWhcNMjUxMjI1MTA0NTMyWjAMMQowCAYDVQQD
    DAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp+jHFvhyYKiPXc7k
    0c33f2QV+1hHNyW/uwcJbp5jG82cuQ41v70Z1+b2veBW4sUlDY3yAIEOPSUD8ASt
    9m72CAo4xlwYKDvm/Sa3KJtDk0NrQiz6PPyBUFsY+Bj3xn6Nz1RW5YaP+Q1Hjnks
    PEyQu4vLgfTSGYBHLD4gvs8wDWY7aaKf8DfuP7Ov74Qlj2GOxnmiDEF4tirlko0r
    qQcvBgujCqA7rNoG+QDmkn3VrxtX8mKF72bxQ7USCyoxD4cWV2mU2HD2Maed3KHj
    KAvDAzSyBMjI+qi9IlPN5MR7rVqUV0VlSKXBVPct6NG7x4WRwnoKjTXnr3CRADD0
    4uvbQQIDAQABo1AwTjAdBgNVHQ4EFgQUVFurgDwdcgnCYxszc0dWMWhB3DswHwYD
    VR0jBBgwFoAUVFurgDwdcgnCYxszc0dWMWhB3DswDAYDVR0TBAUwAwEB/zANBgkq
    hkiG9w0BAQsFAAOCAQEAaLSytepMb5LXzOPr9OiuZjTk21a2C84k96f4uqGqKV/s
    okTTKD0NdeY/IUIINMq4/ERiqn6YDgPgHIYvQheWqnJ8ir69ODcYCpsMXIPau1ow
    T8c108BEHqBMEjkOQ5LrEjyvLa/29qJ5JsSSiULHvS917nVgY6xhcnRZ0AhuJkiI
    ARKXwpO5tqJi6BtgzX/3VDSOgVZbvX1uX51Fe9gWwPDgipnYaE/t9TGzJEhKwSah
    kNr+7RM+Glsv9rx1KcWcx4xxY3basG3/KwvsGAFPvk5tXbZ780VuNFTTZw7q3p8O
    Gk1zQUBOie0naS0afype5qFMPp586SF/2xAeb68gLg==
    -----END CERTIFICATE-----
    

    认证文件,其实是纯文本,直接复制粘贴到对应的文件即可.

    logstash/GeoLite2-City.mmdb

    新版GeoIP的数据库,暂时对GEOIP的需求比较低,所以暂不考虑定时更新的问题.

    直接下载,解压即可

    wget [http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz](http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz)
    tar -zxvf GeoLite2-City.tar.gz
    

    OK,至此,所有准备工作都完成了.开始编写Docker-compose吧

    Docker-compose.yml
    version: '2'
    services:
      ELK:
        image: sebp/elk
        ports:
            - "5601:5601"
            - "9200:9200"
            - "5044:5044"
        volumes:
            - /home/kz/elasticstack/logstash/filebeat_template.json:/home/template.json
            - /home/kz/elasticstack/logstash/GeoLite2-City.mmdb:/home/GeoLite2-City.mmdb
            - /home/kz/elasticstack/search:/var/lib/elasticsearch
            - /home/kz/elasticstack/logstash/conf.d:/etc/logstash/conf.d
        restart: always
        container_name: Docker_ELK
      FileBeat:
        image: docker.elastic.co/beats/filebeat:6.4.1
        volumes:
            - /home/kz/elasticstack/filebeat/my.yml:/usr/share/filebeat/filebeat.yml
            # 把打log的路径挂载到Docker上
            - /home/kz/wms_server:/home/log
            # 挂载认证证书
            - /home/kz/elasticstack/filebeat/logstash-beats.crt:/home/logstash-beats.crt
            # 挂载module,没用上
            - /home/kz/elasticstack/filebeat/module:/module
        restart: always
        container_name: Docker_Beat
        # 这里的依赖其实没什么用,因为ELK整体彻底启动需要的时间比较长,这里只是调整一下顺序
        depends_on:
            - ELK
        links:
            - ELK
    
    kz@kz-desktop:~/elasticstack$ docker-compose up -d
    Starting Docker_ELK ... done
    Starting Docker_Beat ... done
    

    跑起来了.

    image

    kibana中也看到数据了

    image

    需求比较简单,其实可以直接Filebeat->ES,或者Logstash->ES.

    相关文章

      网友评论

          本文标题:Make it works(2) 从零开始的Docker ELK

          本文链接:https://www.haomeiwen.com/subject/firuoftx.html