docker 安装 elasticsearch、kibana、logstash 5.6.1,带x-pack,从kafka中获取数据
阅读原文时间:2021年04月20日阅读:1

前两天刚写了个博客,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错误。

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

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