用Docker+ELK集中处理日志

需求

手头有几个服务器的日志需要处理,数据量也不是很大,但是又不想在每个服务器上都装一套ELK,毕竟这货还是挺笨重的。

另外,ELK这堆东西依赖也挺多,而且还是用JAVA的,我才不想为了装这个把系统搞得乱七八糟,所以必须跑在docker里。当然,也不可能在每台服务器上都装个docker,毕竟这货也不是省油的灯。

于是有这样的方案。

Docker

以两个服务器为例,docker装在A服务器上,在其中跑ELK,两台服务器的日志都汇总到这个跑ELK的docker container里。

image

其本思路就是把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<[email protected]>
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。

 

推送到[go4pro.org]