用Docker+ELK集中處理日誌
## 需求
手頭有幾個伺服器的日誌需要處理,資料量也不是很大,但是又不想在每個伺服器上都裝一套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。