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

前两天刚写了个博客,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用户登录

    docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据_第1张图片

  • 这里碰到一个问题,然后解决了一段时间,那就是用kibana用户登录,创建index的时候,我logstash中设置的索引,不能创建,提示错误信息为 :
    Unable to fetch mapping. Do you have indices matching the pattern?

docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据_第2张图片

  • 奇怪会出现这个问题,网上有人说是日志没有写入es,或者es版本更新太快,版本不兼容之类的。怀疑logstash是否还没有写入数据到es,然后查看es中index情况,发现logstash-api这个index是已经创建了的,并且已经插入数据:
curl -u elastic '192.168.187.108:9200/_cat/indices?v'

docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据_第3张图片

  • 这就奇怪了,然后查看kibana日志,就是这个日志害人不前,用docker logs查看kibana日志,用json工具解析日志如下:

    docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据_第4张图片

  • 按这个提示,是 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错误。
  • 最后上一个超级管理员的界面吧

    docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据_第5张图片

  • 在这个界面可以对用户以及权限进行管理

你可能感兴趣的:(java)