Kubernetes集羣環境下fluentd日誌收集方案介紹

"本文主要介紹了CNCF官方社區輕量級日誌收集工具"

1、介紹

前段時間寫了一篇日誌收集方案,Kubernetes日誌收集解決方案有部分讀者反饋說,都是中小企業,哪有那麼多資源上ELK或者EFK,大數據這一套平臺比我自身服務本身耗費資源還要多,再說了,現階段我的業務不需要格式轉換,不需要數據分析,我的日誌頂多就是當線上出現問題時,把我的多個節點日誌收集起來排查錯誤。但是在Kubernetes平臺上,pod可能被調度到不可預知的機器上,如果把日誌存儲在當前計算節點上,難免會出現排查問題效率低下,當然我們也可以選用一些共享文件服務器,比如GFS、NFS直接把日誌輸出到特定日誌服務器,這種情況對於單副本服務沒有任何問題,但是對於多副本服務,可能會出現日誌數據散亂分佈問題(因爲多個pod中日誌輸出路徑和名稱都是一樣的),下面我介紹通過CNCF社區推薦的fluentd進行日誌收集。

2、對比

使用fluentd日誌收集之前:

使用fluentd日誌收集之後:

看到這張圖片之後就被fluentd架構清晰程度吸引了;

3、fluentd和fluent-bit介紹

fluentd是一款開源的日誌收集工具。基於ruby和C編寫,它擁有非常多的插件,可以滿足的我們對各種格式的日誌進行收集,過濾,解析等。把日誌信息變成我們想要的格式。並且,沒有找到滿足我們的插件,我們可以自己寫插件。fluentd收集日誌時,將所有日誌看做JSON格式的數據。並且用正則表達式去匹配日誌。fluentd自帶豐富的日誌收集格式。以及可以將日誌收集到各種存儲的數據庫。fluentd有7種類型的插件:輸入、解析器、過濾器、輸出、格式化程序、存儲和緩衝區。

總結下

  • Fluentd是一個集數據的收集、過濾、聚合處理、轉發、接收爲一體數據收集器。

  • Fluend-bit是Fluentd的精華版本,純C編寫、大小450kb,更輕量級,主要支持數據的收集和處理功能。

4、收集步驟

其中fluent-bit充當客戶端,fluentd充當服務端,客戶端定時根據某種特定策略收集日誌傳遞到服務端,服務端存儲日誌,這一次不在說ES或者Kafaka,而是直接把日誌文件集中收集存儲磁盤文件中,當然大數據分析和展示工具fluentd本身是支持的,而且fluentd支持高可用配置。

5、收集方式

  • 每個節點以Kubernetes中DaemonSet形式運行fluent-bit,在各個節點進行日誌收集,收集完成後發送到fluentd進行統一日誌處理和存儲。這種方式結構簡單清晰,但是收集較爲粗略,如果說一個pod的多個副本運行在同一個節點上,可能會出現日誌交叉打印問題,當然我們也可以在yaml中配置約束條件,同一個pod調度到不同計算節點,限制這種情況出現。

  • 通過sidercar方式運行fluent-bit,編寫業務yaml的同時,把fluentd-bit追加進去,這種收集日誌較爲詳盡,可以收集到pod中container信息,但是會出現跟業務耦合的問題。

具體如何選擇還要看業務場景收集日誌詳細程度。

6、示例

fluentd-bit客戶端日誌收集配置

[SERVICE]

   Flush 1

   Daemon OFF

   Log_Level debug

[INPUT]

   Name tail

   Path /home/logs/nginx.log

   Db /tmp/ng.db

   Db.sync Full

   Tag ng-log

[OUTPUT]

   Name forward

   Match *

   Host 112.68.7.95

   port 24224

fluentd服務端接收日誌配置

<source>

  @type forward

  port 24224

</source>

<source>

  @type http

  port 9880

</source>

<match nginx*>

#匹配有tag爲mem的類型

  @type stdout #匹配成功直接標準輸出

</match>

<match nginx*>

   @type file

   path /data/log/fluent/access

   <format>

      @type single_value

      message_key log

      add_newline true

   </format>

   <buffer>

       @type file

       chunk_limit_size 1M # 每隔1分鐘寫一次日誌

       flush_interval 1m

       flush_at_shutdown true

       flush_mode interval

    </buffer>

</match>

7、總結

如上主要講述了fluentd和fluent-bit通過客戶端和服務端配合收集日誌的使用過程,在使用過程fluentd和fluent-bit採用原生安裝的方式,暫時沒有通過Kubernetes pod運行,至於fluentd和fluent-bit的安裝和使用過程我會盡快完善補充,敬請關注,也可以加入圈子我們一起討論。

推薦閱讀:


Kubernetes排障指南

從零搭建Kubernetes下的nignx和tomcat

Kubernetes中如何使用ClusterDNS進行服務發現?

從Ice到Kubernetes容器技術,微服務架構經歷了什麼?

如何使用docker?


原創不易,隨手關注或者”在看“,誠摯感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章