Kubernetes日志采集——Fluent Bit詳細介紹(一)


1、概述

1.1 簡介

Fluent Bit 是一個開源的日志處理器和轉發器,它可以從不同來源收集任何數據,如指標和日志,用過濾器處理它們並將它們發送到多個目的地。它是 Kubernetes 等容器化環境的首選。

Fluent Bit 的設計考慮到了性能:高吞吐量、低 CPU 和內存使用率。它是用 C 語言編寫的,具有可插拔架構,支持 70 多種輸入、過濾器和輸出擴展。

1.2 特點 

 1. 特點
   ①事件驅動:使用異步操作來收集和發送數據;
   ②路由:數據通過插件會被打上tag,可以控制數據發往一個或多個目的地;
   ③I/O處理: 在Input/Output層提供一個抽象,以異步方式執行讀寫;
   ④upstream manager:
   ⑤安全:通過TLS提供安全傳輸

 2. 突出亮點
   ①:輕量級、高性能
   ②:可擴展
   ③:收集系統信息

1.3 fluentd和fluent-bit的關系及特性

fluentd和fluent-bit都是有Treasure Data公司贊助開發的開源項目,目標是解決日志收集、處理和轉發。這兩個項目有很多相似之處,fluent-bit完全基於Fluentd體系結構和設計經驗。從體系結構的角度來看,選擇使用哪個取決於使用場景,我們可以考慮:

  • Fluentd是日志收集器,處理器和聚合器。
  • fluent-bit是一個日志收集器和處理器(它沒有Fluentd等強大的聚合功能)。 
 

fluentd

fluent-bit

范圍

容器/服務器

容器/服務器

語言

C和Ruby

C

大小

約40MB

約450KB

性能

高性能

高性能

依賴關系

作為Ruby Gem構建,主要依賴gems

除了一些安裝編譯插件(GCC、CMAKE)其它零依賴。

插件支持

超過650個可用插件

大約35個可用插件

許可證

Apache許可證2.0版

Apache許可證2.0版

根據兩個組件不同特點可以考慮將Fluentd主要用作聚合器,將fluent-bit作為日志轉發器,兩個項目相互補充,從而提供了完整的可靠輕量級日志解決方案,當然fluent-bit也可以獨立完成日志收集。

1.4 fluent-bit支持平台

從體系結構支持的角度來看,fluent-bit在基於x86,x86_64,AArch32和AArch64的處理器上具有全部功能。fluent-bit也可以在OSX和*BSD系統上工作,但並非所有插件在所有平台上都可用。官方支持將根據社區需求而擴大。

2、fluent-bit工作原理

日志通過數據管道從數據源發送到目的地,一個數據管道通常由 Input、Parser、Filter、Buffer、Routing 和 Output組成。

  • Input:用於從數據源抽取數據,一個數據管道中可以包含多個 Input。
  • Parser:負責將 Input 抽取的非結構化數據轉化為標准的結構化數據,每個 Input 均可以定義自己的 Parser。(可選)
  • Filter:負責對格式化數據進行過濾和修改。一個數據管道中可以包含多個 Filter,Filter 會順序執行,其執行順序與配置文件中的順序一致。
  • Buffer:用戶緩存經過 Filter 處理的數據,默認情況下buffer把input插件的數據緩存到內存中,直到路由傳遞到output為止。
  • Routing:將 Buffer 中緩存的數據路由到不同的 Output。
  • Output:負責將數據發送到不同的目的地,一個數據管道中可以包含多個 Output。

Fluent Bit 支持多種類型的 Input、Parser、Filter、Output 插件,可以應對各種場景。

3、fluent-bit 關鍵概念

在進入 Fluent Bit 之前,最好先了解一下該服務的一些關鍵概念。

  • 事件或記錄。
  • 過濾。
  • 標簽。
  • 時間戳。
  • 匹配。
  • 結構化消息。

3.1 事件或記錄(Event or Record)

Fluent Bit 檢索到的每一個屬於日志或指標的輸入數據都被視為事件或記錄。

以 Syslog 文件為例:

Jan 18 12:52:16 flb systemd[2222]: Starting GNOME Terminal Server
Jan 18 12:52:16 flb dbus-daemon[2243]: [session uid=1000 pid=2243] Successfully activated service 'org.gnome.Terminal'
Jan 18 12:52:16 flb systemd[2222]: Started GNOME Terminal Server.
Jan 18 12:52:16 flb gsd-media-keys[2640]: # watch_fast: "/org/gnome/terminal/legacy/" (establishing: 0, active: 0)

它包含四行,它們代表四個獨立的事件。

在內部,一個事件總是有兩個組件(以數組形式):

[TIMESTAMP, MESSAGE]

3.2 過濾(Filtering)

在某些情況下,需要對事件內容執行修改,更改、填充或刪除事件的過程稱為過濾。

有許多需要過濾的用例,如:

  • 向事件附加特定信息,如 IP 地址或元數據。
  • 選擇一個特定的事件內容。
  • 處理匹配特定模式的事件。

3.3 標簽(Tag)

每一個進入 Fluent Bit 的事件都會被分配一個標簽。這個標簽是一個內部字符串,路由器稍后會使用它來決定必須通過哪個 Filter 或 Output 階段。

大多數標簽都是在配置中手動分配的。如果沒有指定標簽,那么 Fluent Bit 將指定生成事件的輸入插件實例的名稱作為標簽。

唯一不分配標簽的輸入插件是 Forward 輸入。這個插件使用名為 Forward 的 Fluentd wire 協議,其中每個事件都有一個相關的標簽。Fluent Bit 將始終使用客戶端設置的傳入標簽。

標簽記錄必須始終具有匹配規則。要了解關於標簽和匹配的更多信息,請查看路由部分。

3.4 時間戳(Timestamp)

時間戳表示事件被創建的時間,每個事件都包含一個相關聯的時間戳。時間戳的格式:

SECONDS.NANOSECONDS

Seconds 是自 Unix epoch 以來經過的秒數。

Nanoseconds 是小數秒或十億分之一秒。

時間戳總是存在的,要么由 Input 插件設置,要么通過數據解析過程發現。

3.5 匹配(Match)

Fluent Bit 允許將收集和處理的事件傳遞到一個或多個目的地,這是通過路由階段完成的。匹配表示一個簡單的規則,用於選擇與已定義規則匹配的事件。

要了解有關標簽和匹配的更多信息,請查看路由部分。

3.6 結構化消息(Structured Messages)

源事件可以有或沒有結構。結構在事件消息中定義了一組鍵和值。作為一個例子,考慮以下兩個消息:

沒有結構化的消息

"Project Fluent Bit created on 1398289291"

結構化消息:

{"project": "Fluent Bit", "created": 1398289291}

在較低的級別上,兩者都只是字節數組,但結構化消息定義了鍵和值,具有結構有助於實現對數據快速修改的操作。

Fluent Bit 總是將每個事件消息作為結構化消息處理。出於性能原因,我們使用名為 MessagePack 的二進制序列化數據格式。

可以把 MessagePack 看作是 JSON 的二進制版本。

4、緩沖

性能和數據安全

當 Fluent Bit 處理數據時,它使用系統內存(heap)作為一個主要的臨時位置來存儲記錄日志,然后在這個私有內存區域中處理記錄。

緩沖指的是將記錄存儲在某個地方的能力,當它們被處理和傳遞時,仍然能夠存儲更多的記錄。內存緩沖是最快的機制,但在某些情況下,該機制需要特殊的策略來處理背壓、數據安全或減少服務在受限環境中的內存消耗。

第三方服務上的網絡故障或延遲是很常見的,在接收到新數據時無法足夠快地交付數據的情況下,我們可能會面臨背壓。

我們的緩沖策略旨在解決與背壓和一般交付失敗相關的問題。

Fluent Bit 作為緩沖策略,在內存中提供了一個主緩沖機制,並使用文件系統提供了一個可選的輔助緩沖機制。使用這種混合解決方案,您可以調整任何用例的安全性,並在處理數據時保持高性能。

這兩種機制都不是排他的,當數據准備好被處理或交付時,它將始終在內存中,而隊列中的其他數據可能在文件系統中,直到准備好被處理並移到內存中。

要了解更多關於 Fluent Bit 的緩沖配置,請跳轉到緩沖和存儲部分。

5、數據管道

5.1 輸入(Input)

從數據源收集數據的方法

Fluent Bit 提供了不同的輸入插件來收集來自不同來源的信息,其中一些插件只是從日志文件中收集數據,而另一些插件則可以從操作系統中收集指標信息。有許多插件可以滿足不同的需求。

當一個輸入插件被加載時,一個內部實例被創建。每個實例都有自己獨立的配置。配置鍵通常稱為屬性。

每個輸入插件都有自己的文檔部分,其中指定了如何使用它和哪些屬性可用。

更多的細節,請參考輸入插件部分。

5.2 解析(Parser)

將非結構化消息轉換為結構化消息

處理原始字符串或非結構化消息是一個持續的痛苦;有一個結構是非常需要的。理想情況下,我們希望在輸入插件收集到數據時,為輸入數據設置一個結構:

解析器允許您將非結構化數據轉換為結構化數據。作為一個演示示例,考慮以下 Apache (HTTP Server) 日志條目:

192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395

上面的日志行是一個沒有格式的原始字符串,理想情況下,我們希望給它一個結構,之后就可以較容易地處理。如果使用了適當的配置,日志條目可以轉換為:

{
"host": "192.168.2.20",
"user": "-",
"method": "GET",
"path": "/cgi-bin/try/",
"code": "200",
"size": "3395",
"referer": "",
"agent": ""
}

解析器是完全可配置的,可以由每個輸入插件獨立處理,更多細節請參考解析器部分。

5.3 過濾(Filter)

修改、豐富或刪除您的記錄

在生產環境中,我們希望完全控制所收集的數據,篩選是一個重要特性,它允許我們在將數據交付到某個目的地之前修改數據。

過濾是通過插件實現的,所以每個可用的過濾器都可以用來匹配、排除或用一些特定的元數據豐富您的日志。

我們支持很多過濾器,一個常見的過濾用例是 Kubernetes 的部署。每個 Pod 日志都需要得到適當的關聯元數據。

與輸入插件非常相似,過濾器在實例上下文中運行,它有自己獨立的配置。配置鍵通常稱為屬性。

有關可用過濾器及其用法的詳細信息,請參閱過濾器部分。

5.4 緩沖(Buffer)

可靠的數據處理

在前面的 Buffering 概念部分中定義,管道中的緩沖階段旨在提供統一和持久的機制來存儲數據,可以使用主內存模型,也可以使用基於文件系統的模式。

緩沖階段已經包含了處於不可變狀態的數據,這意味着不能應用其他篩選器。

注意,緩沖數據不是原始文本,而是 Fluent Bit 內部的二進制表示。

Fluent Bit 在文件系統中提供緩沖機制,充當備份系統,以避免系統故障時數據丟失。

5.5. 路由(Router)

創建靈活的路由規則

路由是一個核心特性,它允許將數據通過過濾器路由到一個或多個目的地。路由器依賴於標簽和匹配規則的概念。

路由中有兩個重要的概念:

  • Tag
  • Match

當數據由輸入插件生成時,它帶有一個 Tag(大多數情況下,Tag 是手動配置的),Tag 是一個人類可讀的指示器,幫助識別數據源。

為了定義應該將數據路由到何處,必須在輸出配置中指定 Match 規則。

思考下面的配置示例,目的是將 CPU 指標交付給 Elasticsearch 數據庫,並將內存指標交付給標准輸出接口:

[INPUT]
    Name cpu
    Tag  my_cpu

[INPUT]
    Name mem
    Tag  my_mem

[OUTPUT]
    Name   es
    Match  my_cpu

[OUTPUT]
    Name   stdout
    Match  my_mem

注意:上面是一個簡單的例子,演示了如何配置路由。

路由自動讀取輸入標簽和輸出匹配規則。如果某些數據的 Tag 在路由配置上不匹配,則刪除該數據。

路由與通配符

路由非常靈活,Match 模式可以支持通配符。下面的例子定義了兩個數據源的共同目標:

[INPUT]
Name cpu
Tag my_cpu

[INPUT]
Name mem
Tag my_mem

[OUTPUT]
Name stdout
Match my_*

匹配規則被設置為my_*,這意味着它將匹配任何以my_開頭的標簽。

5.6 輸出(Output)

您的數據目的地:數據庫,雲服務和更多!

輸出接口允許我們定義數據的目的地。常見的目標有遠程服務、本地文件系統或與其他人的標准接口、Elasticsearch、Kafka、Fluentd、Loki等。輸出以插件的形式實現,並且有許多可用的插件。

當一個輸出插件被加載時,一個內部實例被創建。每個實例都有自己獨立的配置。配置鍵通常稱為屬性。

每個輸出插件都有自己的文檔部分,指定如何使用它以及哪些屬性可用。

6、總結

  • Fluent Bit 是一個開源的日志處理器和轉發器。
  • 在編寫配置文件時候注意並不需要在配置文件中單獨的編寫路由模塊([Routing]),路由模塊是在輸出模塊中配置的([Output]),在輸出模塊配置中指定 Match 規則,Match輸入模塊([Input])中的Tag,這樣通過標簽和匹配規則就能將數據路由到一個或多個目的地。
  • 過濾模塊([Filter])也是通過在過濾模塊配置中指定 Match 規則,Match輸入模塊([Input])中的Tag,這樣通過標簽和匹配規則就對指定輸入模塊([Input])進行過濾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM