1. 程式人生 > >KubeCon 2018 參會記錄 —— FluentBit Deep Dive

KubeCon 2018 參會記錄 —— FluentBit Deep Dive

在最近的上海和北美KubeCon大會上,來自於Treasure Data的Eduardo Silva(Fluentd Maintainer)帶來了最期待的關於容器日誌採集工具FluentBit的最新進展以及深入解析的分享;我們知道Fluentd是在2016年底正式加入CNCF,成為CNCF專案家族的一員,其被廣泛用於容器叢集中進行應用日誌的採集、處理和聚合,但今天主要是跟大家分享一下同樣來自於Treasure Data新開源的日誌採集工具——FluentBit。

image

FluentBit vs Fluentd

既然已經有了Fluentd,那麼為什麼還要開發一個FluentBit呢?我們知道,Fluentd是基於Ruby語言的,在一些應用日誌量較大或者單節點日誌量較大的場景下,通過Fluentd採集日誌的速率會遠落後於應用日誌的產生速率,進而導致日誌採集的延遲時間較大,這對於一些實時性要求較高的業務系統或者監控系統來說是不可接受的;另外一方面,也是由於Fluentd自身的日誌處理邏輯越來越複雜,全部放置在一個元件裡來完成會導致越來越臃腫,因此Treasure Data在基於Fluentd優秀的架構和設計理念上重新開發了一個更加輕量級、更加高效能的日誌採集工具——FluentBit,其主要採用C語言進行開發。

image

從上面我們可以清晰地看到FluentBit本身佔用的記憶體資源會比Fluentd少很多,且基本沒有其他額外的環境依賴,但是支援的外掛數相較於Fluentd會少很多,需要時間來慢慢豐富。

FluentBit Workflow

image

FluentBit 內建了一個Service Engine,其每採集到一條日誌時都會執行從Input到Output的整個Action Chain:

- Input

image

日誌資料入口,FluentBit支援多種不同資料來源型別的Input Plugin,不僅能採集容器日誌、核心日誌、syslog、systemd日誌,還支援通過TCP監聽接收遠端客戶端的日誌,同時還能夠採集系統的CPU、記憶體和DISK的使用率情況以及本機Network流量日誌。

- Parser

image

通過情況下我們的應用日誌都是非結構化的,那麼Parser主要是負責將採集到的非結構化日誌解析成結構化的日誌資料,一般為JSON格式;FluentBit 預設已經預置了下面幾種Parser:

  1. JSON:按照JSON格式來進行日誌資料解析;
  2. Regex:依據配置的正則表示式來進行日誌資料解析;
  3. Apache:遵循Apache日誌格式來進行解析;
  4. Nginx:遵循Nginx日誌格式來進行解析;
  5. Docker:遵循Docker標準輸出日誌格式進行解析;
  6. Syslog rfc5424:按照syslog rfc5424規範格式進行日誌解析;
  7. Syslog rfc3164:按照syslog rfc3164規範格式進行日誌解析;

- Filter

image

在實際的生產應用中,我們通常需要對採集到的應用日誌記錄進行修改或者新增一些關鍵資訊,這都可以Filter Plugin來完成;目前FluentBit也已預置了多種Filter外掛:

  1. Grep:允許匹配或者過濾掉符合特定正則表示式的日誌記錄;
  2. Record Modifier:允許對日誌資料進行修改或者新增新的KV資料,通過此可以方便我們對日誌資料進行打標;
  3. Throttle:支援採用漏桶和滑動視窗演算法進行日誌採集速率控制;
  4. Kubernetes:自動提取容器或者POD相關資訊並新增到日誌資料中;
  5. Modify:基於設定的規則來對日誌資料進行修改;
  6. Standard Output:允許將日誌資料直接列印到標準輸出;
  7. Lua:支援通過嵌入Lua Script來修改新增日誌資料;

- Buffer

image

FluentBit 內部本身提供了Buffer機制,會將採集到的日誌資料暫存在Memory中直到該日誌資料被成功路由轉發到指定的目標儲存後端。

- Routing

image

路由是FluentBit的一個核心功能,它允許我們配置不同的路由規則來將同一條日誌資料記錄轉發到一個或多個不同的接收後端,其內部主要是基於每條日誌資料的Tag來進行路由轉發,同時支援正則匹配方式;如下面配置則表示希望將Tag滿足正則表示式my_*的日誌直接列印到標準輸出中:

[INPUT]
    Name cpu
    Tag  my_cpu
​
[INPUT]
    Name mem
    Tag  my_mem
​
[OUTPUT]
    Name   stdout
    Match  my_*

- Output

image

Output 主要是用來配置採集到的日誌資料將要被轉發到哪些日誌儲存服務中,目前已支援多種主流的儲存服務,如ElasticSearch、NATS、InfluxDB、Kafka、Splunk、File、Console等,同樣也支援將日誌資料繼續通過HTTP(S)協議將其傳輸到其他服務介面中;另外這裡有一個比較特殊的Output就是Fluentd,可能大家會比較奇怪,其實在未來的日誌架構模型中,FluentBit主要是在採集端專職負責日誌的高效能採集,然後可以將採集到的日誌在Fluentd中進行較複雜的聚合處理(同Filebeat和Logstash):
image

Other Features

  • Event Driven
    內建的Service Engine採用完全非同步的事件驅動模型來進行日誌的採集和分發。
  • Configuration
    簡單靈活的、高可讀性的配置方式,FluentBit的Workflow模型可完全通過配置檔案的方式清晰制定。
  • Upstream Manager
    採用統一的日誌上游服務的網路連線管理,包括Keepalive和IO Error處理。
  • TLSv1.2 / Security
    對於安全敏感的日誌資料,支援通過TLS加密通道進行日誌傳輸。

Upcoming Features

  • Filesystem buffering mode
    當前FluentBit只支援Memory的buffer方式,但考慮到記憶體的易失性,未來也將會支援基於Filesystem的buffer機制。
  • Optional plugins as shared libraries
    未來會將一些已內建的但又不是必需的外掛以共享連結庫的方式來進行動態載入。
  • Kubernetes Filter improvements
    未來會繼續深度整合Kubernetes,通過API獲取更多POD關鍵資訊並自動新增到日誌資料記錄中。

Summary

這兩次的KubeCon大會上Eduardo Silva對日誌採集工具FluentBit都進行了深度的解析分享,不僅介紹了FluentBit的整個架構模型,而且還分享了未來的發展方向,從整個分享來看FluentBit會側重在日誌的高效能採集方面;而阿里雲容器服務在2017年初開源的Log-Pilot:https://github.com/AliyunContainerService/log-pilot ,其不僅能夠採集容器的標準輸出日誌,而且還能動態地發現採集容器內檔案日誌,同時支援簡單高效的日誌宣告式配置、支援日誌路由、日誌資料打標以及多種日誌採集外掛,未來我們將進一步與社群緊密結合,整合FluentBit的高效能採集特性以及Log-Pilot的動態發現和宣告式配置優勢來進一步增強容器化應用日誌的配置採集效率。