ELK是一组开源软件的简称,其包括Elasticsearch、Logstash 和 Kibana。ELK最近几年发展迅速,已经成为目前最流行的集中式日志解决方案。
Elasticsearch: 能对大容量的数据进行接近实时的存储,搜索和分析操作。 本项目中主要通过Elasticsearch存储所有获取的日志。
Logstash: 数据收集引擎,它支持动态的的从各种数据源获取数据,并对数据进行过滤,分析,丰富,统一格式等操作,然后存储到用户指定的位置。
Kibana: 数据分析与可视化平台,对Elasticsearch存储的数据进行可视化分析,通过表格的形式展现出来。
Filebeat: 轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装Filebeat,并指定目录与日志格式,Filebeat就能快速收集数据,并发送给logstash进行解析,或是直接发给Elasticsearch存储。
单一的架构,logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。
这种架构模式适合需要采集日志的客户端不多,且各服务端cpu,内存等资源充足的情况下。因为每个节点都安装Logstash, 非常消耗节点资源。其中,logstash作为日志搜集器,将每一台节点的数据发送到Elasticsearch上进行存储,再由kibana进行可视化分析。
Filebeats是一种轻量级的日志搜集器,其不占用系统资源,自出现之后,迅速更新了原有的elk架构。Filebeats将收集到的数据发送给Logstash解析过滤,在Filebeats与Logstash传输数据的过程中,为了安全性,可以通过ssl认证来加强安全性。之后将其发送到Elasticsearch存储,并由kibana可视化分析。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ##下载java8rpm包上传到服务器
yum -y localinstall jdk-8u73-linux-x64.rpm
rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch ##从官网导入gpgkey
vim /etc/yum.repos.d/elasticsearch.repo
echo '[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
yum -y install elasticsearch ##YUM安装Elasticsearch
vi /etc/elasticsearch/elasticsearch.yml
network.host: localhost #修改为仅本地接触到9200端口
注:为了安全起见,只允许本地访问9200端口。防止外部通过http api恶意操作9200端口。
systemctl start elasticsearch
systemctl enable elasticsearch
Kibana的rpm包与Elasticsearch共用一个GPG Key,因此不用再重新下载 gpg key.
vi /etc/yum.repos.d/kibana.repo
[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
yum -y install kibana
vi /opt/kibana/config/kibana.yml
server.host: "localhost"
注:同样为了安全起见,只将本地访问
systemctl start kibana
chkconfig kibana on
因为我们设置让Kibana倾听本地端口,但我们必须要让外部访问到。我们需要安装nginx,并且配置反向代理。
yum -y install nginx httpd-tools
htpasswd -c /etc/nginx/htpasswd.users kibanaadmin
注:此举为访问Kibana设置密码。
vi /etc/nginx/nginx.conf ##注释原有80端口
vi /etc/nginx/conf.d/kibana.conf ##创建kibana的nginx配置文件
server {
listen 80;
server_name IP或者是域名;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/htpasswd.users;
location / {
proxy_pass http://localhost:5601; ##当外部访问80时,反向代理到本地5601端口,使其访问kibanan
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
systemctl start nginx
systemctl enable nginx
注:配置nginx后要确保selinux处于disabled状态,或者是执行:
setsebool -P httpd_can_network_connect 1
使selinux信任http
(1) 安装Logstash
vi /etc/yum.repos.d/logstash.repo
[logstash-2.2]
name=logstash repository for 2.2 packages
baseurl=http://packages.elasticsearch.org/logstash/2.2/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
yum -y install logstash
(2)生成 SSL Certificates
A: 使用ip地址生成证书
vi /etc/pki/tls/openssl.cnf
subjectAltName = IP: ELK_server_private_ip ##在[ v3_ca ]部分找到
cd /etc/pki/tls
openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
注:生成此证书,用于Filebeats与Logstash通信
B:使用域名
在dns管理网站上修改dns的a记录映射到elk server的ip地址上。
cd /etc/pki/tls
openssl req -subj '/CN=ELK_server_dns/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
(3)配置Logstash
配置Filebeat输入文件,02-beats-input.conf
vi /etc/logstash/conf.d/02-beats-input.conf
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
}
}
配置日志过滤文件以及格式化处理,10-syslog-filter.conf
vi /etc/logstash/conf.d/10-syslog-filter.conf
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
注:grok 过滤与定义日志格式,能从github上下载很多样本用来参考。
配置30-elasticsearch-output.conf 输出日志文件到elasticsearch。
vi /etc/logstash/conf.d/30-elasticsearch-output.conf
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
可以通过以下命令来测试logstash配置文件是否正确。
service logstash configtest
如果输出是Configuration OK,则代表配置文件修改没有问题。
systemctl restart logstash
chkconfig logstash on
cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
cd beats-dashboards-*
./load.sh ##在Elasticsearch加载仪表盘,可视化,和默认的beats插件
注:当我们使用kibana时,我们默认将Filebeat设为默认的选项。
我们是计划收集数据到Elasticsearch进行存储,所以我们需要在Elasticsearch加在一个Filebeat模板。这个默认的模板将会配置Elasticsearch去智能分析Filebeat收集的日志。
cd ~
curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json ##下载json模板
curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json ##加载模板到Elasticsearch
如果模板加载正确,将会看到如下的输出。
{
"acknowledged" : true
}
(1)复制ELK server端生成的elk-forward证书
scp /etc/pki/tls/certs/logstash-forwarder.crt user@client_server_private_address:/tmp
注:确保证书复制过来准确无误。因为这个证书用于Filebeat客户端与ELK服务端通信。
sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
(2)安装Filebeat package
rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch ##导入gpg-key秘钥
vi /etc/yum.repos.d/elastic-beats.repo ##导入FILEBEAT安装的REPO文件
[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1
yum -y install filebeat
(3)修改配置文件/etc/filebeat/filebeat.yml
修改收集log文件
vi /etc/filebeat/filebeat.yml
...
paths:
- /var/log/secure
- /var/log/messages
# - /var/log/*.log
...
...
document_type: syslog #删除原有的注释
...
将elasticsearch这一段全部删除或者是注释掉
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["ELK_server_private_IP:5044"] #定义Filebeat与ELK_server连接方式
Filebeat与Logstash安全通信配置
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
systemctl start filebeat
systemctl enable filebeat
注:启动过后查看Filebeat的状态。如果没有启动可以参照如下检测配置文件。
filebeat:
prospectors:
-
paths:
- /var/log/secure
- /var/log/messages
# - /var/log/*.log
input_type: log
document_type: syslog
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["elk_server_private_ip:5044"]
bulk_max_size: 1024
tls:
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
shipper:
logging:
files:
rotateeverybytes: 10485760 # = 10MB
(8)在ELK server上检测Filebeat是否与Logstash成功通信
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
如果看到total与successful不为0。代表成功从client端取到日志。
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 15,
"successful" : 15,
"failed" : 0
},
注:如果看到total与hits为0,代表通信受阻,无法从客户端取到日志。可以参照以下两个方式解决:
(1)查看Filebeat客户端配置是否正确,Filebeat是否成功启动。
(2)查看ELK_SERVER的安全组,确认5044端口是打开的。
在浏览器里面输入Kinaba服务端的公有ip地址,默认使用80端口即可。因为我们之前已经配置过nginx反向代理。将kibana的5601端口代理到nginx80端口。
(1)将Filebeat设置为默认选项
(2)查看kibana是否成功可视化日志数据
在笔者搭建部署ELK+Filebeat的过程中,参考了许多文章,这些文章使我受益匪浅,茅塞顿开。
https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-centos-7
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html)