容器日志管理 (2) 开源日志管理方案 ELK/EFK
本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點擊查看更多容器化技術相關系列文章。上一篇《容器日志管理(1)》中介紹了Docker自帶的logs子命令以及其Logging driver,本篇將會介紹一個流行的開源日志管理方案ELK/EFK。
01
—
關于ELK
ELK簡介
????????ELK 是Elastic公司提供的一套完整的日志收集以及展示的解決方案,是三個產品的首字母縮寫,分別是ElasticSearch、Logstash?和?Kibana。
- Elasticsearch是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能 
- Logstash是一個用來搜集、分析、過濾日志的工具 
- Kibana是一個基于Web的圖形界面,用于搜索、分析和可視化存儲在 Elasticsearch指標中的日志數據? 
ELK日志處理流程
? 上圖展示了在Docker環境下,一個典型的ELK方案下的日志收集處理流程:
- Logstash從各個Docker容器中提取日志信息 
- Logstash將日志轉發到ElasticSearch進行索引和保存 
- Kibana負責分析和可視化日志信息 
由于Logstash在數據收集上并不出色,而且作為Agent,其性能并不達標。基于此,Elastic發布了beats系列輕量級采集組件。
這里我們要實踐的Beat組件是Filebeat,Filebeat是構建于beats之上的,應用于日志收集場景的實現,用來替代?Logstash Forwarder?的下一代?Logstash?收集器,是為了更快速穩定輕量低耗地進行收集工作,它可以很方便地與?Logstash?還有直接與?Elasticsearch?進行對接。
本次實驗直接使用Filebeat作為Agent,它會收集我們在第一篇《Docker logs & logging driver》中介紹的json-file的log文件中的記錄變動,并直接將日志發給ElasticSearch進行索引和保存,其處理流程變為下圖,你也可以認為它可以稱作 EFK。
02
—
ELK/EFK套件的安裝與運行
???????本次實驗我們采用Docker方式部署一個最小規模的ELK運行環境,當然,實際環境中我們或許需要考慮高可用和負載均衡。
首先拉取一下sebp/elk這個集成鏡像,這里選擇的tag版本是640(最新版本已經是7XX了):
docker pull sebp/elk:640注:由于其包含了整個ELK方案,所以需要耐心等待一會。
通過以下命令使用sebp/elk這個集成鏡像啟動運行ELK:
docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \ sebp/elk:640運行完成之后就可以先訪問一下 http://[Your-HostIP]:5601 看看Kibana的效果:
Kibana管理界面
Kibana Index Patterns界面
當然,目前沒有任何可以顯示的ES的索引和數據,再訪問一下http://[Your-HostIP]:9200 看看ElasticSearch的API接口是否可用:
ElasticSearch API
Note:如果啟動過程中發現一些錯誤,導致ELK容器無法啟動,可以參考《Docker啟動ElasticSearch報錯》及《ElasticSearch啟動常見錯誤》一文。如果你的主機內存低于4G,建議增加配置設置ES內存使用大小,以免啟動不了。例如下面增加的配置,限制ES內存使用最大為1G:
docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \ -e ES_MIN_MEM=512m \ -e ES_MAX_MEM=1024m \ sebp/elk:64003
—
Filebeat配置
安裝Filebeat
這里我們通過rpm的方式下載Filebeat,注意這里下載和我們ELK對應的版本(ELK是6.4.0,這里也是下載6.4.0,避免出現錯誤):
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpmrpm -ivh filebeat-6.4.0-x86_64.rpm配置Filebeat
????????這里我們需要告訴Filebeat要監控哪些日志文件 及 將日志發送到哪里去,因此我們需要修改一下Filebeat的配置:
cd /etc/filebeatvim filebeat.yml要修改的內容為:
(1)監控哪些日志?
filebeat.inputs:# Each - is an input. Most options can be set at the input level, so# you can use different inputs for various configurations.# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration. enabled: true
# Paths that should be crawled and fetched. Glob based paths. paths: - /var/lib/docker/containers/*/*.log - /var/log/syslog
這里指定paths:/var/lib/docker/containers/*/*.log,另外需要注意的是將 enabled 設為 true。
(2)將日志發到哪里?
#-------------------------- Elasticsearch output ------------------------------output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.16.190:9200"]# Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme"
這里指定直接發送到ElasticSearch,配置一下ES的接口地址即可。
Note:如果要發到Logstash,請使用后面這段配置,將其取消注釋進行相關配置即可:
#----------------------------- Logstash output --------------------------------#output.logstash: # The Logstash hosts #hosts: ["localhost:5044"]# Optional SSL. By default is off. # List of root certificates for HTTPS server verifications #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
# Certificate for SSL client authentication #ssl.certificate: "/etc/pki/client/cert.pem"
# Client Certificate Key #ssl.key: "/etc/pki/client/cert.key"
啟動Filebeat
???????由于Filebeat在安裝時已經注冊為systemd的服務,所以只需要直接啟動即可:
systemctl start filebeat.service  檢查Filebeat啟動狀態:
驗證Filebeat
????????通過訪問ElasticSearch API可以發現以下變化:ES建立了以filebeat-開頭的索引,我們還能夠看到其來源及具體的message。
04
—
Kibana配置
????????接下來我們就要告訴Kibana,要查詢和分析ElasticSearch中的哪些日志,因此需要配置一個Index Pattern。從Filebeat中我們知道Index是filebeat-timestamp這種格式,因此這里我們定義Index Pattern為 filebeat-*
點擊Next Step,這里我們選擇Time Filter field name為@timestamp:
單擊Create index pattern按鈕,即可完成配置。
這時我們單擊Kibana左側的Discover菜單,即可看到容器的日志信息啦:
仔細看看細節,我們關注一下message字段:
可以看到,我們重點要關注的是message,因此我們也可以篩選一下只看這個字段的信息:
此外,Kibana還提供了搜索關鍵詞的日志功能,例如這里我關注一下日志中包含unhandled exception(未處理異常)的日志信息:
這里只是樸素的展示了導入ELK的日志信息,實際上ELK還有很多很豐富的玩法,例如分析聚合、炫酷Dashboard等等。筆者在這里也是初步使用,就介紹到這里啦。
05
—
Fluentd引入
關于Fluentd
????????前面我們采用的是Filebeat收集Docker的日志信息,基于Docker默認的json-file這個logging driver,這里我們改用Fluentd這個開源項目來替換json-file收集容器的日志。
Fluentd是一個開源的數據收集器,專為處理數據流設計,使用JSON作為數據格式。它采用了插件式的架構,具有高可擴展性高可用性,同時還實現了高可靠的信息轉發。Fluentd也是云原生基金會 (CNCF) 的成員項目之一,遵循Apache 2 License協議,其github地址為:https://github.com/fluent/fluentd/。Fluentd與Logstash相比,比占用內存更少、社區更活躍,兩者的對比可以參考這篇文章《Fluentd vs Logstash》。
因此,整個日志收集與處理流程變為下圖,我們用 Filebeat 將 Fluentd 收集到的日志轉發給 Elasticsearch。
? 當然,我們也可以使用Fluentd的插件(fluent-plugin-elasticsearch)直接將日志發送給 Elasticsearch,可以根據自己的需要替換掉Filebeat,從而形成Fluentd => ElasticSearch => Kibana 的架構,也稱作EFK。
運行Fluentd
????????這里我們通過容器來運行一個Fluentd采集器:
docker?run?-d?-p?24224:24224?-p?24224:24224/udp?\ -v?/edc/fluentd/log:/fluentd/log?\ fluent/fluentd默認Fluentd會使用24224端口,其日志會收集在我們映射的路徑下。
此外,我們還需要修改Filebeat的配置文件,將/edc/fluentd/log加入監控目錄下:
#=========================== Filebeat inputs =============================filebeat.inputs:
# Each - is an input. Most options can be set at the input level, so# you can use different inputs for various configurations.# Below are the input specific configurations.
- type: log
# Change to true to enable this input configuration. enabled: true
# Paths that should be crawled and fetched. Glob based paths. paths: - /edc/fluentd/log/*.log
添加監控配置之后,需要重新restart一下filebeat:
systemctl restart filebeat運行測試容器
????????為了驗證效果,這里我們Run兩個容器,并分別制定其log-dirver為fluentd:
docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-A" \ busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;'docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-B" \ busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
這里通過指定容器的log-driver,以及為每個容器設立了tag,方便我們后面驗證查看日志。
驗證
????????這時再次進入Kibana中查看日志信息,便可以通過剛剛設置的tag信息篩選到剛剛添加的容器的日志信息了:
06
—
小結
本文從ELK的基本組成入手,介紹了ELK的基本處理流程,以及從0開始搭建了一個ELK環境,演示了基于Filebeat收集容器日志信息的案例。然后,通過引入Fluentd這個開源數據收集器,演示了如何基于EFK的日志收集案例。當然,ELK/EFK有很多的知識點,筆者也還只是初步使用,希望未來能夠分享更多的實踐總結。
參考資料:
CloudMan,《每天5分鐘玩轉Docker容器技術》
一杯甜酒,《ELK學習總結》
于老三,《快速搭建ELK日志分析系統》
zpei0411,《Logstash beats系列 & Fluentd》
曹林華,《從ELK到EFK的演進》
點個【在看】,和更多人一起分享!
總結
以上是生活随笔為你收集整理的容器日志管理 (2) 开源日志管理方案 ELK/EFK的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: .NET开发者的机遇与Web Blazo
- 下一篇: ASP.NET Core快速入门(第5章
