Skip to content

docker搭建elk

一、elk介绍

Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据, 转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。

总结来说ELK是一套日志收集的系统

二、elk搭建

有开源的一套已经集成了elk系统的镜像,可以直接使用。对镜像不熟悉可以去docker hub上了解

docker pull sebp/elk

这里参考了下面的文章:https://zhuanlan.zhihu.com/p/32559371

主要搭建的镜像有elasticsearch、kibana、logstash、filebeat

2.1 安装elasticsearch

这里所有组件的版本都要对应上,如果需要持久化则映射:/usr/share/elasticsearch/data

docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms4096m -Xmx4096m" -e "xpack.security.enabled=false" -v /software/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch:7.16.3

2.2 es8说明

安装7.0则执行下面的命令:

bin/elasticsearch-setup-passwords interactive

如果安装的是8.x版本,需要先进入容器设置密码,-u指定用户名,-i表示手动重置密码,否则随机生成

bin/elasticsearch-reset-password -u elastic -i
  1. 安全配置准备

首次启动 Elasticsearch 时,会自动进行以下安全配置:

> - 为传输层和 HTTP 层生成 证书和密钥。 > - 传输层安全 (TLS) 配置设置被写入 elasticsearch.yml. > - 为elastic用户生成密码。 > - 为 Kibana 生成一个注册令牌。

  1. 复制生成的密码和注册令牌并将其保存在安全位置。

这些值仅在您第一次启动 Elasticsearch 时显示。您将使用这些将 Kibana 注册到您的 Elasticsearch 集群并登录。

  1. docker ps 验证容器是否启动

  2. 访问 https://localhost:9200, 输入 elastic / 密码 验证。

ES8.1增加了安全验证, ssl默认开启, 因此不能使用http访问。

2.3 es8内置用户

摘抄官网,地址如下:

https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html

https://www.elastic.co/guide/en/elasticsearch/reference/8.0/built-in-users.html

  • elastic

一个内置的超级用户任何可以以elastic用户身份登录的人都可以直接只读访问受限索引,例如.security. 此用户还可以管理安全性并创建具有无限权限的角色。

  • kibana_system

Kibana 用于与 Elasticsearch 连接和通信的用户。

  • logstash_system

在 Elasticsearch 中存储监控信息时使用的用户 Logstash。

  • beats_system

Beats 在 Elasticsearch 中存储监控信息时使用的用户。

  • apm_system

APM 服务器在 Elasticsearch 中存储监控信息时使用的用户。

  • remote_monitoring_user

Metricbeat 在 Elasticsearch 中收集和存储监控信息时使用的用户。它具有remote_monitoring_agentremote_monitoring_collector内置角色。

内置用户如何工作

这些内置用户存储在.security由 Elasticsearch 管理的特殊索引中。如果禁用内置用户或其密码更改,则更改会自动反映在集群中的每个节点上。但是,如果您的.security索引从快照中删除或恢复, 您应用的任何更改都将丢失。

尽管它们共享相同的 API,但内置用户与本机领域管理的用户是分开的和不同的。禁用本机领域不会对内置用户产生任何影响。可以使用disable users API单独禁用内置 用户。

2.4 安装kibana

docker run -d -p 5601:5601 --link elasticsearch -e ELASTICSEARCH_URL=http://elasticsearch:9200 kibana:7.16.3

8.15的ELASTICSEARCH_URL配置改为elasticsearch.hosts

如果要设置中文信息,修改映射的kibana.yml文件,在尾部增加:

i18n.locale: "zh-CN"
#增加es用户名
elasticsearch.username: "kibana_system"
elasticsearch.password: "kibana"

2.5 安装logstash

这里对应filebeat的配置,如果es设置了安全认证,需要设置用户账号密码

先将配置文件放到主机上:

vi /software/logstash/logstash.conf

输入以下配置(注意elasticsearch配置):

input {
  beats {
    host => "localhost"
    port => "5043"
    codec => "json"
  }
}

filter{
    json {
        source => "message"
        skip_on_invalid_json => true
    }
}

output {
    stdout { codec => rubydebug }
    elasticsearch {
      hosts => ["elasticsearch:9200"] # 转到elasticsearch主机上
      index => "host-nginx-log-%{+YYYY.MM}"
      user => "logstash_system"
      password => "123456"
    }
}

如果es设置里安全认证,或者8.x版本的默认开启安全认证,需要配置logstash的用户

编辑logstash的配置文件,设置es的地址:vi /software/logstash/logstash.yml

xpack.monitoring.elasticsearch.hosts: [ "http://192.168.1.22:9200" ]
xpack.monitoring.elasticsearch.username: "logstash_system"
xpack.monitoring.elasticsearch.password: "123123"

启动命令

docker run --rm -it --name logstash --link elasticsearch -d -v /software/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -v /software/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml logstash:7.16.3

2.6 安装filebeat

先将配置文件放到主机上:

vi /software/filebeat/filebeat.yml

输入以下配置(注意logstash配置):

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/access.log
output.logstash: # 输出地址
  hosts: ["logstash:5043"]
docker run --name filebeat -d --link logstash -v /software/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml -v /software/filebeat/logs/:/home/logs/ elastic/filebeat:7.16.3

三、通过kafka集群消费

kafka要创建好topic,或者开启自动创建topic配置

3.1 logstash配置

input {
   kafka {
      topics => ["home-nginx","ali-nginx"]
      bootstrap_servers => "192.168.1.22:9092" # 采集kafka一个主机的信息
      client_id => "host-nginx"
      group_id => 'host-nginx'
      codec => "json"
      auto_offset_reset => "latest"
      consumer_threads => 10
      decorate_events => true
   }
}

output {
  #stdout {
  #    codec=>rubydebug   #屏幕输出调试
  #}
  if [fields][app] == "host-nginx" {
    elasticsearch {
      hosts => ["http://192.168.1.22:9200"] # 转到elasticsearch主机上
      user => "elastic"
      password => "123456"
      manage_template => true
      index => "home-nginx-log-%{+YYYY.MM}"
    }
  }
  if [fields][app] == "host1-nginx" {
    elasticsearch {
      hosts => ["http://192.168.1.22:9200"] # 转到elasticsearch主机上
      user => "elastic"
      password => "123456"
      manage_template => true
      index => "ali-nginx-log-%{+YYYY.MM}"
    }
  }
}

四、filebeat配置

filebeat先对数据进行格式化

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/access.log
  fields:
  #作为自定义变量,logstash好区分
    type: "host-nginx"
    app: "host-nginx"
  multiline.pattern: ^201
  multiline.negate: true
  multiline.match: afterX
  #启用json格式日志获取
  json.keys_under_root: true
  #覆盖已有的日志字段
  json.overwrite_keys: true
  #指定从哪个字段解析json,开启json必须要有
  json.message_key: "message"
#-------------------------- Elasticsearch output ------------------------------

output.kafka:  # 写入到kafka主机内
  hosts: ["192.168.1.22:9092"] # 写入kafka的IP地址
  topic: "host-nginx"
  partition.round_robin:
    reachable_only: true
  required_acks: 1  # 本地写入完成
  compression: gzip  # 开启压缩
  max_message_bytes: 1000000  # 消息最大值
processors:
  - drop_fields:
      fields: ["@timestamp","sort","beat","input_type","offset","source","type"]