2021年02月搭建Docker的ELK堆栈

首先

对呀,就是ELK Stack。
因为还没有安装Beats,所以可能不能算作完整的Elastic Stack吧。

我参考了以下文章进行学习,尝试进行建设。

    DockerでELK(Elasticsearch Logstash Kibana) を構築してみました

这次使用的东西

我们基于Docker已经安装完成的前提来进行操作。

开始构建

创建一个作业文件夹

我会创建一个作业文件夹。

$ mkdir elkwork
$ cd elkwork

创建一个与Docker共享的文件夹。

$ sudo mkdir -p /data/elk

我会更改elk文件夹的所有者。
示例中使用了user:user,但我使用了myname:staff(其中myname是我的用户名)。

$ sudo chown user:user data/elk

从这里开始,在elk文件夹下创建共享文件夹。

首先,创建一个用于elasticsearch的共享文件夹。

$ mkdir data/elk/elasticsearch

接下来,我们要创建一个用于logstash的共享文件夹。

$ mkdir -p data/elk/logstash/pipeline

最后,创建一个用于nginx的共享文件夹。

$ mkdir -p data/elk/log/nginx

启动nginx。

启动Nginx。
在指定Nginx共享文件夹时遇到了错误,但已经解决。2

$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/log/nginx:/var/log/nginx -p 80:80 nginx:1.19.7-alpine

我会确认nginx是否已启动。

20210225-1111.jpg

启动Elasticsearch。

我要启动elasticsearch。

$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/elasticsearch:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.1

确认Elasticsearch已启动。
只要返回JSON即可。

{
  "name" : "34db2f5a288c",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "RZ9UOc4TTv-28XD7Kw5Nqw",
  "version" : {
    "number" : "7.10.1",
    "build_flavor" : "oss",
    "build_type" : "docker",
    "build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
    "build_date" : "2020-12-05T01:00:33.671820Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

启动Logstash

将Logstash的配置文件(conf文件)创建在data/elk/logstash/pipeline文件夹下。

input {
  file {
    path => "/var/log/nginx/access.log"
    start_position => beginning
  }
}

filter {
  grok {
    match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
    remove_field => "message"
  }
  mutate {
    add_field => { "read_timestamp" => "%{@timestamp}" }
  }
  date {
    match => [ "[nginx][access][time]", "dd/MM/YYYY:H:m:s Z" ]
    remove_field => "[nginx][access][time]"
  }
  useragent {
    source => "[nginx][access][agent]"
    target => "[nginx][access][user_agent]"
    remove_field => "[nginx][access][agent]"
  }
  geoip {
    source => "[nginx][access][remote_ip]"
    target => "[nginx][access][geoip]"
  }
}

output {
  elasticsearch {
    hosts => [ 'elasticsearch' ]
    index => "access_log1"
  }
}

开始运行logstash。

$ docker run -d --restart always -v /Users/myname/Downloads/elkwork/data/elk/logstash/pipeline:/usr/share/logstash/pipeline -v /Users/myname/Downloads/elkwork/data/elk/log:/var/log --link elasticsearch:elasticsearch  --name logstash docker.elastic.co/logstash/logstash-oss:7.10.1

我将启动Logstash,并确认日志已被传输。
从内容看,非常好奇是否已正确传输。
我将对其进行格式化,以便更易于查看。

{
    "error":{
        "root_cause":[{
            "type":"index_not_found_exception",
            "reason":"no such index [access_log1]",
            "resource.type":"index_or_alias",
            "resource.id":"access_log1",
            "index_uuid":"_na_",
            "index":"access_log1"
        }],
        "type":"index_not_found_exception",
        "reason":"no such index [access_log1]",
        "resource.type":"index_or_alias",
        "resource.id":"access_log1",
        "index_uuid":"_na_",
        "index":"access_log1"
    },
    "status":404
}

5. 启动Kibana

启动Kibana。

$ docker run -d --restart always -p 5601:5601 --link elasticsearch:elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 --name kibana docker.elastic.co/kibana/kibana-oss:7.10.1

确认Kibana已启动3。

20210225-1210.jpg

确定已启动的ELK堆栈是否正常运行。

在Kibana中,确认从Logstash传输日志。
通过左侧的汉堡按钮,打开Dev Tool。

20210225-1216.jpg

在控制台上输入以下命令:GET /access_log1/_search?pretty=true

20210225-1217.jpg

输入后,点击 ▶。

20210225-1218.jpg

如果在右侧看到200 – OK并显示了访问日志,那就说明完美了。

各种确认

状态

可以通过http://localhost:5601/status来确认。

20210302-1625.jpg

设置索引模式。

据说需要先创建Elasticsearch索引才能使用Kibana。

点击“创建索引模式”并跳转。

20210302-1634.jpg

需要在Index pattern name的位置上指定一个或多个与Elasticsearch索引名称匹配的Index Pattern。
在下面,显示了”access_log1″,因此使用它作为Index Pattern看起来是一个好选择。

20210302-1636.jpg

当您选择指定“access*”时,”下一步 >”将被启用。
听起来不错。

20210302-1640.jpg

从包含时间戳的索引字段中进行选择。
通过时间字段下拉菜单进行选择。
选择”@timestamp”,然后点击”创建索引模式”。

20210302-1645.jpg

看起来,注册好像成功了。
我打算切换到Discover,看看情况。

20210302-1647.jpg

调整一下时间范围,就能清楚地看到了。哈哈,看过的画面。

20210302-1649.jpg

总结

集装箱真是方便呀…
之后,我会用它来学习很多东西。
不仅是学习构建,还要考虑一下ELK可以做什么,这也是学习的一部分。

我在使用指定用户时遇到了错误。因为用户组名不合法,所以我将其更改为myname:staff。目前还没有发现错误。我正在使用Mac。

原本我指定了data/elk/log/nginx:/var/log/nginx,但是会返回”Error response from daemon”。我理解需要指定完整路径,所以按照说明书上的写法来消除错误。参考链接:注意在docker run中挂载主机操作系统目录的时候。

如果立即通过URL进行确认,则会收到”还未完成”的提醒。请喝一口咖啡,冷静之后再进行访问。

广告
将在 10 秒后关闭
bannerAds