1. 程式人生 > >用Docker+ELK集中處理日誌

用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<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。