輕鬆上手Fluentd,結合 Rainbond 外掛市場,日誌收集更快捷

rainbond發表於2022-06-22

以往有篇文章介紹 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.
hostselasticsearch的地址
portelasticsearch的埠
user/passwordelasticsearch用到的使用者名稱/密碼
index_nameindex定義的名稱
\<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_idMinio 使用者名稱
aws_sec_keyMinio 密碼
s3_endpointMinio 訪問地址
s3_bucketMinio 桶名稱
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,歡迎小夥伴們貢獻外掛哦!

相關文章