コンテンツにスキップ

FluentBit/Fluentd@CNCF

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. FluentBit/Fluentdの仕組み

アーキテクチャ

fluent-bit_fluentd_architecture

FluentBit/Fluentdは、インプットフェーズ、バッファーフェーズ、アウトプットレイヤー、から構成される。

アプリケーションからログを収集し、これをフィルタリングした後、複数の宛先にルーティングする。

プッシュ型で収集されたログはまずインプットされる。

メモリやファイルをバッファーとして使用でき、ログはチャンクとしてステージに蓄えられる。

ステージに一定サイズのチャンクが蓄えられるか、または一定時間が経過すると、チャンクはキューに格納される。

キューは、指定された宛先にログを順番にルーティングする。

プロセスが再起動されると、特にメモリのバッファー上に蓄えられたログは破棄されるため、ログ損失が起こってしまう。

補足として、AWS Kinesis Data Firehoseも似たようなバッファリングとルーティングの仕組みを持っている。


バッファーの構造

バッファーは、ステージ、キュー、といったコンポーネントから構成される。ログは、『*-*.*.flb』という名前のチャンクとして扱われ、メモリやファイル上に保存される。

fluent-bit_fluentd_architecture_buffer


複数のログパイプラインの集約

複数のFluentBitを稼働させる場合、アウトプット先がそれぞれのログパイプラインを受信しても良いが、前段にメッセージキューを配置しても良い。

メッセージキューを配置することにより、ログパイプラインが乱雑せずに集約できるようになる。

またメッセージキューによって、アウトプット先のレートリミットを超過しないように、一定の間隔でログを送信できる。

fluent-bit_fluentd_message-queue


機能比較

FluentBit Fluentd
スコープ 組み込みLinux/仮想環境 仮想環境
言語 NS C & Ruby
メモリ最大サイズ 650KB 40MB
依存関係 標準プラグインではパッケージに依存しない。 標準プラグインで一定数のRuby gemに依存する。
性能
プラグイン数 70 1000個以上


02. デザインパターンの種類

エージェントパターン

▼ エージェントパターンとは

エージェントパターンは、エージェントコンポーネントから構成される。

ログの送信元では、エージェント(FluentBit/Fluentd) が常駐し、ログを収集する。

さらに、エージェントはログを監視バックエンドに送信する。

fluent-bit_fluentd_agent-pattern

▼ エージェントパターンの実装例

エージェントは、デーモンプロセス、サイドカー、DaemonSet、などで実装する。

  • FluentBit/Fluentdプロセスをサーバーで、プロセスとして直接的に常駐させる。
  • KubernetesのPod内のサイドカーとして配置する。
  • KubernetesのDaemonSet配下のPodとして常駐させる。

▼ DaemonSetパターンとPod内サイドカーパターンの比較

項目 Pod内サイドカーパターン DaemonSetパターン
Nodeのハードウェアリソース消費量が少ない × ⭕️
Nodeのストレージ使用量が少ない ⭕️
FluentBit/Fluentdの冗長性が高い ⭕️️
アプリごとの設定カスタマイズ度が高い ⭕️
単純性が高い × ⭕️


フォワーダーアグリゲーターパターン

▼ フォワーダーアグリゲーターパターンとは

フォワーダーアグリゲーターパターンは、フォワーダー、アグリゲーター、といったコンポーネントから構成される。

ログの送信元では、フォワーダー (FluentBit/Fluentd) はL7ロードバランサーを介してログを収集する。

さらに、フォワーダーは別のFluentBit/Fluentd (アグリゲーター) にログを送信する。

アグリゲーターはログを集約し、監視バックエンドにログを送信する。

fluent-bit_fluentd_forwarder-aggregator-pattern

▼ アグリゲーターパターンの実装例

L7ロードバランサーはIngressコントローラー、アグリゲーターはDeployment、などで実装できる。