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.32.2 es8说明
安装7.0则执行下面的命令:
bin/elasticsearch-setup-passwords interactive如果安装的是8.x版本,需要先进入容器设置密码,-u指定用户名,-i表示手动重置密码,否则随机生成
bin/elasticsearch-reset-password -u elastic -i- 安全配置准备
首次启动 Elasticsearch 时,会自动进行以下安全配置:
> - 为传输层和 HTTP 层生成 证书和密钥。 > - 传输层安全 (TLS) 配置设置被写入 elasticsearch.yml. > - 为elastic用户生成密码。 > - 为 Kibana 生成一个注册令牌。
- 复制生成的密码和注册令牌并将其保存在安全位置。
这些值仅在您第一次启动 Elasticsearch 时显示。您将使用这些将 Kibana 注册到您的 Elasticsearch 集群并登录。
docker ps验证容器是否启动访问 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_agent和 remote_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.38.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.32.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"]