前两天刚写了个博客,docker 安装 ELK,但是那次是从docker hub下载的镜像,不过看到docker hub上写着镜像已经弃用,所以我选择到docker.elastic.io下载最新的镜像尝试安装。最新的镜像内置了x-pack插件,用作安全验证。
由于加上了 x-pack ,自己使用不当,整个过程也是一把辛酸一把泪啊。
首先还是搭建elasticsearch,从elstic官网下载镜像,并用tag打成本地镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:5.6.1
docker tag docker.elastic.co/elasticsearch/elasticsearch:5.6.1 10.45.53.221:5000/elasticsearch
我启动的是单节点模式,然后把配置文件,以及数据文件 挂载到了外面,所以我的启动脚本是如下这样,这里要注意一点,配置文件目录下面得要有配置文件,不然es是起不来的,比较方便的办法是,先常规启动es,然后用docker cp命令,把配置文件复制到宿主机挂载目录,然后再进行修改就ok了,具体命令如下:
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --name es 10.45.53.221:5000/elasticsearch
docker cp 容器id:/usr/share/elasticsearch/config /home/docker/config/es
docker cp 容器id:/usr/share/elasticsearch/data /home/docker/data/es
docker stop es
docker rm es
如果需要更改配置,可以直接修改config目录下的 elasticsearch.yml 文件,然后启动es
docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --restart always --name es -v /home/docker/config/es:/usr/share/elasticsearch/config -v /home/docker/data/es:/usr/share/elasticsearch/data 10.45.53.221:5000/elasticsearch
安装logstash
docker pull docker.elastic.co/logstash/logstash:5.6.1
docker tag docker.elastic.co/logstash/logstash:5.6.1 10.45.53.221:5000/logstash
docker run -d --name logstash 10.45.53.221:5000/logstash
安装kibana
docker pull docker.elastic.co/kibana/kibana:5.6.2
docker tag docker.elastic.co/kibana/kibana:5.6.2 10.45.53.221:5000/kibana
docker run --name kibana -p 5601:5601 -d 10.45.53.221:5000/kibana
修改默认用户密码,由于这三个镜像都默认安装了x-pack插件做安全验证,所以启动的时候可能会报一些错误,此时不用管,先启动再说。elasticsearch默认用户名是elastic,密码为changeme,修改密码在es服务器执行如下命令:
curl -XPUT -u elastic '192.168.187.108:9200/_xpack/security/user/elastic/_password' -H "Content-Type: application/json" -d '{ "password" : "123456"}'
curl -XPUT -u elastic '192.168.187.108:9200/_xpack/security/user/logstash_system/_password' -H "Content-Type: application/json" -d '{ "password" : "123456" }'
curl -XPUT -u elastic '192.168.187.108:9200/_xpack/security/user/kibana/_password' -H "Content-Type: application/json" -d '{ "password" : "123456" }'
密码修改成功, 为了logstash方便更改配置文件,以及 piepline 下面定义的 logstash.conf,所以我也把这两个文件夹挂载到了宿主机。把 /usr/share/logstash/config 以及 /usr/share/logstash/pipeline 文件夹复制到宿主机,具体命令如下:
docker cp 容器id:/usr/share/logstash/config /home/docker/config/logstash/config
docker cp 容器id:/usr/share/logstash/pipeline /home/docker/config/logstash/pipeline
docker stop logstash
docker rm logstash
切换到配置文件目录,修改logstash配置文件logstash.yml,其中logstash_system就是logstash的默认用户名,123456为刚才修改的密码,记得加引号,不然报错。
http.host: "0.0.0.0"
path.config: /usr/share/logstash/pipeline
xpack.monitoring.elasticsearch.url: http://192.168.187.108:9200
xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: "123456"
切换到宿主机/home/docker/config/logstash/pipeline 目录,删除logstash.conf,增加logstashkafka.conf,内容如下:
input{
kafka{
group_id => "log-api-1"
topics => ["log-api"]
bootstrap_servers => "192.168.187.108:9092,192.168.187.109:9092,192.168.187.110:9092"
}
}
filter {
grok {
match => { "message" => "%{DATA:timestamp}|%{DATA:serverHost}|%{IP:clientIp}|%{DATA:auth}|%{DATA:uri}|%{DATA:userAgent}|%{NUMBER:resultCode}|%{DATA:resultMsg}|%{NUMBER:costime}|"}
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
target => "@timestamp"
}
geoip {
source => "clientIp"
}
if [userAgent] != "-" {
useragent {
target => "ua"
source => "userAgent"
}
}
mutate {
convert => ["costime", "integer"]
convert => ["resultCode", "integer"]
}
json {
source => "auth"
target => "auth_content"
remove_field => ["auth"]
}
}
output {
elasticsearch{
hosts => ["192.168.187.108:9200"]
index => "logstash-api-%{+YYYY.MM.dd}"
user => "elastic"
password => "123456"
}
stdout{
codec => rubydebug
}
}
重启修改配置后的logstash
docker run -d --name logstash -v /home/docker/config/logstash/config:/usr/share/logstash/config -v /home/docker/config/logstash/pipeline:/usr/share/logstash/pipeline 10.45.53.221:5000/logstash
用同样的方式拷贝出kibana中的配置文件,kibana配置文件在/usr/share/kibana/config
docker cp 容器id:/usr/share/kibana/config /home/docker/config/kibana/config
docker stop kibana
docker rm kibana
切换到宿主机/home/docker/config/kibana/config 目录,修改kibana.yml文件,内容如下:
server.name: kibana
server.host: "0"
elasticsearch.url: http://192.168.187.108:9200
elasticsearch.username: elastic
elasticsearch.password: "123456"
xpack.monitoring.ui.container.elasticsearch.enabled: true
重启kibana
docker run --name kibana -v /home/docker/config/kibana/config:/usr/share/kibana/config -p 5601:5601 -d 10.45.53.221:5000/kibana
这时通过kibana默认端口5601访问kibana,http://host:5601,会出现以下界面,这时候用kibana用户登录
这里碰到一个问题,然后解决了一段时间,那就是用kibana用户登录,创建index的时候,我logstash中设置的索引,不能创建,提示错误信息为 :
Unable to fetch mapping. Do you have indices matching the pattern?
奇怪会出现这个问题,网上有人说是日志没有写入es,或者es版本更新太快,版本不兼容之类的。怀疑logstash是否还没有写入数据到es,然后查看es中index情况,发现logstash-api这个index是已经创建了的,并且已经插入数据:
curl -u elastic '192.168.187.108:9200/_cat/indices?v'
这就奇怪了,然后查看kibana日志,就是这个日志害人不前,用docker logs查看kibana日志,用json工具解析日志如下:
按这个提示,是 http 404 错误,那么难道是没找到这个url?看到404都会这么想的,当然里面也有状态码为200,我由于看到里面是用get请求,所以我直接用浏览器访问,发现的确是200和404,不过这个404和我们通常访问html页面还不一样。所以这个404不是真正的404,由于之前用docker hub的安装都可以,所以怀疑是不是加上x-pack后出的问题。接下来又是看官方文档,通过更改elasticsearch.ym中的配置,禁用x-pack,来试试。竟然成功了,看来就是权限的问题。
到后来,才猛然发现我用的kibana用户登录,是不是kibana用户权限不够,我登出改用elastic登录,好了,一切ok。结果就是kibana没有权限,这个错误提示,我也是醉了,错误提示有问题也就罢了,错误日志还为404错误。
最后上一个超级管理员的界面吧
在这个界面可以对用户以及权限进行管理
手机扫一扫
移动阅读更方便
你可能感兴趣的文章