輕鬆上手Fluentd,結合 Rainbond 外掛市場,紀錄檔收集更快捷

2022-06-22 15:00:50

以往有篇文章介紹 EFK(Kibana + ElasticSearch + Filebeat)的外掛紀錄檔收集。Filebeat 外掛用於轉發和集中紀錄檔資料,並將它們轉發到 Elasticsearch 或 Logstash 以進行索引,但 Filebeat 作為 Elastic 的一員,只能在 Elastic 整個體系中使用。

Fluentd

Fluentd是一個開源的,分散式紀錄檔採集系統,可以從不同的服務,資料來源採集紀錄檔,對紀錄檔進行過濾加工,分發給多種儲存和處理系統。支援各種外掛,資料快取機制,且本身所需的資源很少,內建可靠性,結合其他服務,可以形成高效直觀的紀錄檔收集平臺。

本文介紹在 Rainbond 中使用 Fluentd 外掛,收集業務紀錄檔,輸出到多個不同的服務。

一、整合架構

在收集元件紀錄檔時,只需在元件中開通 Fluentd 外掛,本文將演示以下兩種方式:

  1. Kibana + ElasticSearch + Fluentd
  2. Minio + Fluentd

我們將 Fluentd 製作成 Rainbond 的 一般型別外掛 ,在應用啟動之後,外掛也隨之啟動並自動收集紀錄檔輸出到多個服務源,整個過程對應用容器無侵入,且拓展性強。

二、外掛原理分析

Rainbond V5.7.0 版本中新增了:從開源應用商店安裝外掛,本文中的外掛已釋出到開源應用商店,當我們使用時一鍵安裝即可,根據需求修改組態檔。

Rainbond 外掛體系是相對於 Rainbond 應用模型的一部分,外掛主要用來實現應用容器擴充套件運維能力。由於運維工具的實現有較大的共性,因此外掛本身可以被複用。外掛必須繫結到應用容器時才具有執行時狀態,用以實現一種運維能力,比如效能分析外掛、網路治理外掛、初始化型別外掛。

在製作 Fluentd 外掛的過程中,使用到了 一般型別外掛,可以理解為一個POD啟動兩個 Container,Kubernetes原生支援一個POD中啟動多個 Container,但設定起來相對複雜,在 Rainbond 中通過外掛實現使使用者操作更加簡單。

三、EFK 紀錄檔收集實踐

Fluentd-ElasticSearch7 輸出外掛將紀錄檔記錄寫入 Elasticsearch。預設情況下,它使用批次 API建立記錄,該 API 在單個 API 呼叫中執行多個索引操作。這減少了開銷並可以大大提高索引速度。

3.1 操作步驟

應用 (Kibana + ElasticSearch)和外掛(Fluentd)都可以通過開源應用商店一鍵部署。

  1. 對接開源應用商店
  2. 在應用商店中搜尋 elasticsearch 並安裝 7.15.2 版本。
  3. 團隊檢視 -> 外掛 -> 從應用商店安裝 Fluentd-ElasticSearch7 外掛
  4. 基於映象建立元件,映象使用 nginx:latest,並且掛載儲存var/log/nginx。這裡使用 Nginx:latest 作為演示
    • 在元件內掛載儲存後,外掛也會自定掛載該儲存,並可存取 Nginx 產生的紀錄檔檔案。
  5. 在 Nginx 元件內開通外掛,可以根據所需進行修改 Fluentd 組態檔,可參考下方組態檔簡介部分。

  1. 新增 ElasticSearch 依賴,將 Nginx 連線到 ElasticSearch,如下圖:

  1. 存取 Kibana 面板,進入到 Stack Management -> 資料 -> 索引管理,可以看到已存在的索引名稱為 fluentd.es.nginx.log

  2. 存取 Kibana 面板,進入到 Stack Management -> Kibana -> 索引模式,建立索引模式。

  3. 進入到 Discover,紀錄檔正常展示。

3.2 組態檔介紹

組態檔參考 Fluentd 檔案 output_elasticsearch

<source>
  @type tail
  path /var/log/nginx/access.log,/var/log/nginx/error.log
  pos_file /var/log/nginx/nginx.access.log.pos
  <parse>
    @type nginx
  </parse>
  tag es.nginx.log
</source>

<match es.nginx.**>
  @type elasticsearch   
  log_level info          
  hosts 127.0.0.1
  port 9200
  user elastic
  password elastic
  index_name fluentd.${tag}
  <buffer>
    chunk_limit_size 2M
    queue_limit_length  32
    flush_interval 5s
    retry_max_times 30
  </buffer>
</match>

設定項解釋:

<source></source> 紀錄檔的輸入源:

設定項 解釋說明
@type 採集紀錄檔型別,tail表示增量讀取紀錄檔內容
path 紀錄檔路徑,多個路徑可以使用逗號分隔
pos_file 用於標記已經讀取到位置的檔案(position file)所在的路徑
<parse></parse> 紀錄檔格式解析,根據你自己的紀錄檔格式,編寫對應的解析規則。

<match></match>紀錄檔的輸出端:

設定項 解釋說明
@type 輸出到的服務型別
log_level 設定輸出紀錄檔的級別為info;支援的紀錄檔級別有:fatal, error, warn, info, debug, trace.
hosts elasticsearch的地址
port elasticsearch的埠
user/password elasticsearch用到的使用者名稱/密碼
index_name index定義的名稱
<buffer></buffer> 紀錄檔的緩衝區,用於快取紀錄檔事件,提高系統效能。預設使用記憶體,也可以使用file檔案
chunk_limit_size 每個塊的最大大小:事件將被寫入塊,直到塊的大小變成這個大小,記憶體預設為8M,檔案256M
queue_limit_length 此緩衝外掛範例的佇列長度限制
flush_interval 緩衝區紀錄檔重新整理事件,預設60s重新整理輸出一次
retry_max_times 重試失敗塊輸出的最大次數

以上只是部分設定引數,其他設定可以跟官網檔案自定義。

四、Fluentd + Minio 紀錄檔收集實踐

Fluentd S3 輸出外掛將紀錄檔記錄寫入到標準的 S3 物件儲存服務,例如 Amazon、Minio。

4.1 操作步驟

應用(Minio)和外掛(Fluentd S3)都可以通過開源應用商店進行一鍵部署。

  1. 對接開源應用商店。在開源應用商店中搜尋 minio,並安裝 22.06.17 版本。

  2. 團隊檢視 -> 外掛 -> 從應用商店安裝 Fluentd-S3 外掛。

  3. 存取 Minio 9090 埠,使用者密碼在 Minio 元件 -> 依賴中獲取。

    • 建立 Bucket,自定義名稱。

    • 進入 Configurations -> Region,設定 Service Location

      • Fluentd 外掛的組態檔中 s3_region 預設為 en-west-test2
  4. 基於映象建立元件,映象使用 nginx:latest,並且掛載儲存var/log/nginx。這裡使用 Nginx:latest 作為演示

    • 在元件內掛載儲存後,外掛也會自定掛載該儲存,並可存取 Nginx 產生的紀錄檔檔案。
  5. 進入到 Nginx 元件內,開通 Fluentd S3 外掛,修改組態檔中的 s3_bucket s3_region

  1. 建立依賴關係,Nginx 元件依賴 Minio,更新元件使其生效。

  1. 存取 Nginx 服務,讓其產生紀錄檔,片刻後就可以在 Minio 的 Bucket 中看到。

4.2 組態檔介紹

組態檔參考 Fluentd 檔案 Apache to Minio

<source>
  @type tail
  path /var/log/nginx/access.log
  pos_file /var/log/nginx/nginx.access.log.pos
  tag minio.nginx.access
  <parse>
    @type nginx
  </parse>
</source>

<match minio.nginx.**>
  @type s3        
  aws_key_id "#{ENV['MINIO_ROOT_USER']}"
  aws_sec_key "#{ENV['MINIO_ROOT_PASSWORD']}"
  s3_endpoint http://127.0.0.1:9000/
  s3_bucket test
  s3_region en-west-test2
  time_slice_format %Y%m%d%H%M 
  force_path_style true
  path logs/
  <buffer time>
    @type file
    path /var/log/nginx/s3
    timekey 1m                 
    timekey_wait 10s            
    chunk_limit_size 256m       
  </buffer>
</match>

設定項解釋:

<source></source> 紀錄檔的輸入源:

設定項 解釋說明
@type 採集紀錄檔型別,tail表示增量讀取紀錄檔內容
path 紀錄檔路徑,多個路徑可以使用逗號分隔
pos_file 用於標記已經讀取到位置的檔案(position file)所在的路徑
<parse></parse> 紀錄檔格式解析,根據你自己的紀錄檔格式,編寫對應的解析規則。

<match></match>紀錄檔的輸出端:

設定項 解釋說明
@type 輸出到的服務型別
aws_key_id Minio 使用者名稱
aws_sec_key Minio 密碼
s3_endpoint Minio 存取地址
s3_bucket Minio 桶名稱
force_path_style 防止 AWS SDK 破壞端點 URL
time_slice_format 每個檔名都加上這個時間戳
<buffer></buffer> 紀錄檔的緩衝區,用於快取紀錄檔事件,提高系統效能。預設使用記憶體,也可以使用file檔案
timekey 每 60 秒重新整理一次累積的chunk
timekey_wait 等待 10 秒再重新整理
chunk_limit_size 每個塊的最大大小

最後

Fluentd 外掛可以很靈活的收集業務紀錄檔並輸出至多個服務,並結合 Rainbond 外掛市場的一鍵安裝,讓我們的使用變得更加簡單、快捷。

目前 Rainbond 開源外掛應用市場的 Flunetd 外掛只有 Flunetd-S3 Flunetd-ElasticSearch7,歡迎小夥伴們貢獻外掛哦!