爲何要使用ELK呢?公司產品、項目賊多,部署到不一樣的服務器上,當系統出現故障時,工程師須要登陸到各個服務器上,使用 grep / sed / awk 等 Linux 腳本工具去日誌裏查找故障緣由。在沒有日誌系統的狀況下,首先須要定位處理請求的服務器,若是這臺服務器部署了多個實例,則須要去每一個應用實例的日誌目錄下去找日誌文件。每一個應用實例還會設置日誌滾動策略(如:天天生成一個文件),還有日誌壓縮歸檔策略等。這樣一系列流程下來,對於咱們排查故障以及及時找到故障緣由,形成了比較大的麻煩。所以,若是咱們能把這些日誌集中管理,並提供集中檢索功能,不只能夠提升診斷的效率,同時對系統狀況有個全面的理解,避免過後救火的被動。
docker pull sebp/elk
# 查看elk版本信息以下
docker inspect sebp/elk
複製代碼
notes: 啓動前要保證內存足夠
默認啓動(內存佔用將會接近2G)
nginx
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk複製代碼
自定義啓動
web
# 參數解釋:docker
TZ:默認Etc/UTC
ES_HEAP_SIZE:默認elaticsearch堆的最大值1G,最小值256M
LS_HEAP_SIZE:默認Logstash的堆大小是500M
ELASTICSEARCH_START: 是否啓動elasticsearch, 0-不啓動 1-啓動
LOGSTASH_START:是否啓動Logstash, 0-不啓動 1-啓動
KIBANA_START:是否啓動Kibana, 0-不啓動 1-啓動複製代碼
# 端口:shell
5601:訪問Kibana的web端口
9200:elasticsearch API查詢接口
5044:Logstash Beats接口,接收來自Beats(如Filebeat)的日誌複製代碼
docker run
-p 5601:5601
-p 9200:9200
-p 5044:5044
-it
-e TZ="Asia/Shanghai"
-e ES_HEAP_SIZE="256m"
-e LS_HEAP_SIZE="256m"
--name elk sebp/elk複製代碼
啓動可能遇到的問題: centos
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] bash
解決辦法:服務器
在/etc/sysctl.conf文件末尾添加配置vm.max_map_count=262144
網絡
移除ELK容器後重啓可能會出現以下問題:
service endpoint with name xxx already exists.
elasticsearch
解決辦法: 清理ELK容器的網絡佔用
docker network disconnect --force bridge elk
tips: 服務器有防火牆firewall,請先開放端口5601再進行訪問。
firewall-cmd --zone=pubic --add-port=5601/tcp --permanent複製代碼
# 訪問以下端口:tcp
# 至此則搭建完成~
# 進入ELK容器shell終端
docker exec -it elk /bin/bash複製代碼
# 打開Logstash日誌輸入控制檯
/opt/logstash/bin/logstash --path.data /tmp/logstash/data -e 'input{ stdin{} } output{ elasticsearch{hosts=>["localhost"]} }'複製代碼
docker pull docker.elastic.co/beats/filebeat:7.0.1複製代碼
docker run docker.elastic.co/beats/filebeat:7.0.1 setup -E setup.kibana.host=192.168.184.134:5601 -E output.elasticsearch.hosts=["192.168.184.134:9200"]複製代碼
# 進入ELK容器shell終端
docker exec -it elk /bin/bash複製代碼
# 修改配置文件(/etc/logstash/conf.d/02-beats-input.conf)以下
input {
beats {
port => 5044
}
}複製代碼
這裏刪除的ssl證書配置,由於此處不須要證書。
# 建立配置文件以下: /opt/filebeat/filebeat.docker.yml
filebeat:
# 日誌輸入源
inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/*.log
# 日誌輸出源Logstash
output:
logstash:
hosts: ["192.168.184.134:5044"] 複製代碼
# 啓動容器
docker run -d
--name=filebeat
--user=root
# 配置文件(輸入、輸出、模塊nginx?)
--volume="/opt/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro"
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro"
--volume="/var/run/docker.sock:/var/run/docker.sock:ro"
# 映射本地nginx日誌文件到docker容器
--volume="/var/log/nginx:/var/log/nginx"
docker.elastic.co/beats/filebeat:7.0.1
filebeat
-e -strict.perms=false 複製代碼
docker run -d --name=filebeat --user=root --volume="/opt/filebeat/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" --volume="/var/log/nginx:/var/log/nginx" docker.elastic.co/beats/filebeat:7.0.1 filebeat -e -strict.perms=false複製代碼
# 打開Kibana -> Logs查詢nginx日誌
# 建立配置文件以下: /opt/filebeat/filebeat.docker.yml (收集鏡像名爲gold的全部容器的日誌)
filebeat.autodiscover:
providers:
- type: docker
hints.enabled: true
templates:
- condition:
contains:
docker.container.image: gold
output:
logstash:
hosts: ["192.168.184.134:5044"]複製代碼
# 啓動Filebeat容器
docker run -d
--name=filebeat-gold
--user=root
# 掛載本地配置文件(輸入、輸出、模塊nginx?)
--volume="/opt/gold/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro"
# 掛載容器
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro"
--volume="/var/run/docker.sock:/var/run/docker.sock:ro"
docker.elastic.co/beats/filebeat:7.0.1
filebeat
-e -strict.perms=false 複製代碼
docker run -d --name=filebeat-gold --user=root --volume="/opt/gold/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" docker.elastic.co/beats/filebeat:7.0.1 filebeat -e -strict.perms=false 複製代碼
# 打開Kibana查看gold日誌