一、解決的問題
- 業務中存在多台服務器。每台服務器也有多個docker容器服務,每一個容器一份日志,這導致日志十分分散。
- ELK很好得解決了這個問題,部署一套ELk(elasticsearch,logstash,kibana)系統,elasticsearch負責存儲日志,logstash負責接收處理日志,並將日志存至elasticsearch,
kibana連接elasticsearch,可視化日志。每台服務器部署logspout,logspout則會收集這台服務器上的每一個容器日志,同時將日志傳輸到遠程的logstash上。
基本思路通過logstash獲取docker中的日志,然后,將日志轉發給elasticsearch進行索引,kibana分析和可視化。
獲取docker中的日志文件可以有多種方式:
- 1、添加一個MQ或者Redis作為docker容器和logstash的中間層,docker中的服務將日志傳輸到中間層,然后,logstash從中間獲取
- 2、使用工具獲取docker中的日志,例如:filebeat,logspout,log-pilot;但是不建議在每個服務器上安裝logstash,因為logstash運行會占有大量的服務器資源,增加服務器壓力。
- filebeat的配置好像相對比較復雜,沒有具體了解;
- logspout 可以獲取docker的stdout日志
- log-pilot 是阿里開源的日志工具,可以處理stdout和日志文件
二、Docker安裝ELK
1、 編輯文件 config/logstash.conf(配置輸入輸出)
input {
udp {
port => 5000
type => json
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200" #將logstash的輸出到 elasticsearch ,修改成你部署的elasticsearch服務
}
}
1.1 編輯/config/logstash.yml
path.config: /usr/share/logstash/conf.d/*.conf
path.logs: /var/log/logstash
2、編寫一下 Docker-compose.yml 方便構建
version: '3'
services:
elasticsearch:
image: elasticsearch:7.1.1
environment:
- discovery.type=single-node
ports:
- "9200:9200"
- "9300:9300"
logstash:
image: logstash:7.1.1
volumes:
- /data/ELK/config:/usr/share/logstash/conf.d/
- /data/ELK/config/logstash.yml:/usr/share/logstash/config/logstash.yml
ports:
- "5001:5000"
links:
- elasticsearch
kibana:
image: kibana:7.1.1
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200 //注意修改成你部署的elasticsearch服務
ports:
- "5601:5601"
links:
- elasticsearch
3、docker-compose up --build -d 命令開啟部署
三、訪問kibana http://ip:5601(kibana服務ip)
1、Create index pattern
創建index后,即可查看日志
Docker啟動elasticsearch閃退,無法創建的問題解決
由於官方的elasticsearch 鏡像缺少配置,需要配置兩處地方
- 修改max_map_count大小
sysctl -w vm.max_map_count=262144
- 修改elasticsearch.yml配置文件
//找到文件
cd /var/lib/docker/overlay2/
find . -name "elasticsearch.yml"
//在文件中添加
bootstrap.system_call_filter: false
cluster.initial_master_nodes: ["node-1"]