1. 程式人生 > >你必須知道的容器日誌 (2) 開源日誌管理方案 ELK/EFK

你必須知道的容器日誌 (2) 開源日誌管理方案 ELK/EFK

本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點選檢視更多容器化技術相關係列文章。上一篇《你必須知道的容器日誌(1)》中介紹了Docker自帶的logs子命令以及其Logging driver,本篇將會介紹一個流行的開源日誌管理方案ELK。

一、關於ELK

1.1 ELK簡介

  ELK 是Elastic公司提供的一套完整的日誌收集以及展示的解決方案,是三個產品的首字母縮寫,分別是ElasticSearch、Logstash 和 Kibana。

  • Elasticsearch是實時全文搜尋和分析引擎,提供蒐集、分析、儲存資料三大功能
  • Logstash是一個用來蒐集、分析、過濾日誌的工具
  • Kibana是一個基於Web的圖形介面,用於搜尋、分析和視覺化儲存在 Elasticsearch指標中的日誌資料   

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

二、ELK套件的安裝

  本次實驗我們採用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:640

三、Filebeat配置

3.1 安裝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.rpm
rpm -ivh filebeat-6.4.0-x86_64.rpm

3.2 配置Filebeat  

   這裡我們需要告訴Filebeat要監控哪些日誌檔案 及 將日誌傳送到哪裡去,因此我們需要修改一下Filebeat的配置:

cd /etc/filebeat
vim 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"

3.3 啟動Filebeat

  由於Filebeat在安裝時已經註冊為systemd的服務,所以只需要直接啟動即可:

systemctl start filebeat.service

  檢查Filebeat啟動狀態:

systemctl status filebeat.service

3.4 驗證Filebeat

  通過訪問ElasticSearch API可以發現以下變化:ES建立了以filebeat-開頭的索引,我們還能夠看到其來源及具體的message。

四、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等等。筆者在這裡也是初步使用,就介紹到這裡啦。

五、Fluentd引入

5.1 關於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。

5.2 執行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

5.3 執行測試容器

  為了驗證效果,這裡我們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,方便我們後面驗證檢視日誌。

5.4 驗證EFK效果

  這時再次進入Kibana中檢視日誌資訊,便可以通過剛剛設定的tag資訊篩選到剛剛新增的容器的日誌資訊了:

六、小結

  本文從ELK的基本組成入手,介紹了ELK的基本處理流程,以及從0開始搭建了一個ELK環境,演示了基於Filebeat收集容器日誌資訊的案例。然後,通過引入Fluentd這個開源資料收集器,演示瞭如何基於EFK的日誌收集案例。當然,ELK/EFK有很多的知識點,筆者也還只是初步使用,希望未來能夠分享更多的實踐總結。

參考資料

CloudMan,《每天5分鐘玩轉Docker容器技術》

一杯甜酒,《ELK學習總結》

於老三,《快速搭建ELK日誌分析系統》

zpei0411,《Logstash beats系列 & Fluentd》

曹林華,《從ELK到EFK的演進》

 

作者:周旭龍

出處:https://edisonchou.cnblogs.com

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。