## 需求
手头有几个服务器的日志需要处理,数据量也不是很大,但是又不想在每个服务器上都装一套ELK,毕竟这货还是挺笨重的。
另外,ELK这堆东西依赖也挺多,而且还是用JAVA的,我才不想为了装这个把系统搞得乱七八糟,所以必须跑在docker里。当然,也不可能在每台服务器上都装个docker,毕竟这货也不是省油的灯。
于是有这样的方案。
Docker
以两个服务器为例,docker装在A服务器上,在其中跑ELK,两台服务器的日志都汇总到这个跑ELK的docker container里。
其本思路就是把docker里的ELK作为一个独立日志服务器来用。
首先,docker里的ELK container绑定一个Filebeat的5044端口到A服务器上,这样只有所有日志源都通过Filebeat往这里推送即可。
注意,这个端口可以用默认的 -p 5044:5044
,但是Kibana的端口不建议这样干,最好还是绑定到localhost,类似: -p 127.0.0.1:5601:5601
,最后通过https返向代理到本地端口,当然最好再加上用户权限控制。这样比较安全。
另外,因为两个服务器之前通过internet通讯,所以安全性是一个需要处理的问题,Filebeat通讯需要加上证书加密。
证书
先来生成一套自己的证书。
sudo openssl req -subj '/CN=elk.yourdomain.com/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout tls/logstash-beats.key -out tls/logstash-beats.crt
其中elk.yourdomain.com换成你自己的一个域名,指向A服务器。
ELK端
docker的安装配置就不说了,ELK用的是现成的 sebp/elk ,直接:
docker pull sebp/elk
即可安装。
不过默认配置是不够用的,还是需要自己加点配置,所以写了个简单的Dockerfile来用用:
FROM sebp/elk
MAINTAINER raptor<raptor.zh@gmail.com>
ADD tls/logstash-beats.crt /etc/pki/tls/certs/
ADD tls/logstash-beats.key /etc/pki/tls/private/
这里略去了一些我自己定义的配置项目,只保留与本文有关的部分,就是更换了两个证书文件。这就是为了解决前面所说的安全性问题。
构建成功这个Dockerfile以后就可以启动它:
docker run -d -p 5044:5044 -p 127.0.0.1:5601:5601 -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -v /var/data/elk:/var/lib/elasticsearch --name=elk myelk
除了前面说过的端口号问题,这里还增加了一个volume绑定,以免重启container以后ES的数据丢失。
日志端
接下来在A、B两个服务器上配置日志源。
首先当然是安装一个Filebeat(仅以debian系为例),文档里提供了下载方式安装:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.5.2-amd64.deb
sudo dpkg -i filebeat-5.5.2-amd64.deb
其实用增加源的方式更方便一些,比如以后需要升级的时候:
echo "deb https://artifacts.elastic.co/beats/apt stable main" | sudo tee -a /etc/apt/sources.list.d/beats.list
sudo apt-get update
sudo apt-get install filebeat
如果报错说apt不支持https,则需要安装一下:
sudo apt-get install apt-transport-https
如果报错说key不对,则需要加一下:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
然后需要把crt证书复制一份过来,放到如 /etc/pki/tls/certs/
下。
最后配置一下Filebeat,配置文件在: /etc/filebeat/filebeat.yml
filebeat:
prospectors:
-
paths:
- /var/log/nginx/access.log
input_type: log
document_type: nginx-access
scan_frequency: 10s
harvester_buffer_size: 16384
max_bytes: 10485760
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["elk.yourdomain.com:5044"]
worker: 1
bulk_max_size: 2048
compression_level: 3
index: filebeat
tls:
certificate_authorities: ["/etc/pki/tls/certs/logstash-beats.crt"]
shipper:
logging:
files:
rotateeverybytes: 10485760
然后重启filebeat:
service filebeat restart
重启后,本机的nginx/access.log就会被filebeat自动地发送到elk.yourdomain.com:5044去。
如不成功,请自行查阅系统日志进行分析,通常都是因为证书配置不对导致。
更多的日志源服务器也都可以这样配置,只要它们能通过域名访问到运行ELK container的A服务器。因为证书是绑定域名的,所以只能通过域名访问,包括A服务器自己。如果A服务器不能通过域名访问自己(比如解析出来的是外网地址,而路由器不支持的话),可以用 /etc/hosts
把域名解析到127.0.0.1。