您的位置:首页 > 运维架构 > Docker

docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据

2017-09-27 15:57 330 查看
前两天刚写了个博客,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错误。

最后上一个超级管理员的界面吧



在这个界面可以对用户以及权限进行管理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息