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

rainbond發表於2022-06-22



以往有篇文章介紹 [EFK(Kibana + ElasticSearch + Filebeat)](https://mp.weixin.qq.com/s/XCTja56IibLDlASQkdonMA)的外掛日誌收集。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` 配置檔案,可參考下方配置檔案簡介部分。


![]()


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


![]()


7. 訪問 `Kibana` 皮膚,進入到 Stack Management -> 資料 -> 索引管理,可以看到已存在的索引名稱為 `fluentd.es.nginx.log`,


8. 訪問 `Kibana` 皮膚,進入到 Stack Management -> Kibana -> 索引模式,建立索引模式。


9. 進入到 Discover,日誌正常展示。


![]()


### 3.2 配置檔案介紹


配置檔案參考 Fluentd 文件 [output_elasticsearch]( "output_elasticsearch")。


```shell

<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`


![]()


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


![]()


7. 訪問 Nginx 服務,讓其產生日誌,片刻後就可以在 Minio 的 Bucket 中看到。


![]()


### 4.2 配置檔案介紹


配置檔案參考 Fluentd 文件 [Apache to Minio]( "Apache to Minio")。


```shell

<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

  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`,歡迎小夥伴們貢獻外掛哦!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70008902/viewspace-2902143/,如需轉載,請註明出處,否則將追究法律責任。

相關文章