Make it works(2) 从零开始的Docker ELK
我们自己的地图服务会打印如下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
跑起来了.
imagekibana中也看到数据了
image需求比较简单,其实可以直接Filebeat->ES,或者Logstash->ES.