> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sambanova.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Fluent Bit によるログ転送

Fluent Bit は、SambaStack のモニタリングリファレンスアーキテクチャで使用される、軽量なログプロセッサー兼ログフォワーダー (log forwarder) です。Kubernetes ノードからコンテナログを収集し、メタデータで拡充した上で、インデックス化と検索のために OpenSearch に送信します。

<Note>
  **リファレンスアーキテクチャに関する注意:** このセットアップではサードパーティ製コンポーネントを使用しています。バージョン、デフォルト値、コマンド構文は変更される可能性があります。SambaStack に固有でない問題については、該当コンポーネントを所有するベンダーまたはプロジェクトにお問い合わせください。
</Note>

## 前提条件

Fluent Bit をデプロイする前に、以下の環境を準備してください。

* **Kubernetes クラスター** – SambaStack がインストール済みの稼働中クラスター
* **OpenSearch** – `monitoring` 名前空間にデプロイ済みであること。詳細は [ログストレージ - OpenSearch](/docs/ja/v2.2.3/sambastack/reference-architecture/observability/log-storage) をご参照ください
* **OpenSearch の管理者パスワード** – OpenSearch のデプロイ時に設定したパスワード
* **Helm**（最新バージョン） – Fluent Bit チャートのデプロイに使用
* **kubectl** – 対象の Kubernetes クラスターへのアクセスが設定済みであること

<Warning>
  Fluent Bit には、稼働中の OpenSearch インスタンスが必要です。先に [OpenSearch のデプロイ](/docs/ja/v2.2.3/sambastack/reference-architecture/observability/log-storage) を完了してください。
</Warning>

## リソース要件

以下は、Fluent Bit の最小リソース推奨値です。

| コンポーネント | CPU リクエスト | メモリリクエスト | ストレージ |
| - | - | - | - |
| Fluent Bit（ノードごと） | 100m | 128Mi | – |

<Note>
  Fluent Bit は DaemonSet として動作し、ノードごとに 1 つの Pod が起動します。クラスター全体のリソース消費は、ノード数に比例して増加します。
</Note>

## アーキテクチャ概要

SambaStack のモニタリングリファレンスアーキテクチャでは、次のように動作します。

* Fluent Bit は DaemonSet として動作し、Kubernetes ノードごとに 1 つのログフォワーダーが確実に配置されます
* `/var/log/pods/` を通じて、すべての Pod とコンテナからログを収集します
* Lua フィルターを使用して、ログに名前空間、Pod、コンテナのメタデータを付与します
* ポート 9200 のセキュアな TLS 接続で、OpenSearch にログを転送します

このデプロイでは、Kubernetes の Secret に保存したカスタム Fluent Bit 設定と、カスタム values を用いた Helm ベースのインストールを使用します。

<Note>
  **Fluent Bit のログ収集の仕組み:**

  * Kubernetes は、各ノードの `/var/log/pods/` にコンテナログを自動的に書き込みます
  * Fluent Bit は、DaemonSet を通じてホストのファイルシステムからこれらのログを直接読み取ります
  * CRI と Docker の両方のログ形式に対応するため、複数のパーサーが設定されています
  * Fluent Bit は、実行時に適切なパーサーを自動的に選択します
  * ログは Kubernetes メタデータで拡充され、OpenSearch に転送されます
</Note>

## デプロイ手順

### ステップ 1: Helm リポジトリの追加

```bash theme={}
helm repo add fluent https://fluent.github.io/helm-charts
helm repo update
```

### ステップ 2: OpenSearch パスワードの取得

[OpenSearch のデプロイ](/docs/ja/v2.2.3/sambastack/reference-architecture/observability/log-storage) 時に作成した OpenSearch の管理者パスワードを取得します。

```bash theme={}
kubectl -n monitoring get secret opensearch-initial-admin-password -o json \
  | jq -r '.data.OPENSEARCH_INITIAL_ADMIN_PASSWORD | @base64d'
```

このパスワードはステップ 6 で使用するため、保存しておいてください。

### ステップ 3: Lua スクリプトの作成

以下の内容を `~/.sambastack-observability/fluentbit/append_tags.lua` として保存します。

```lua theme={}
function append_tags(tag, timestamp, record)
  local filename = record["filename"] or ""
  local namespace_tag = string.match(filename, "/pods/([^_]+)")
  local container_tag = string.match(filename, "/pods/.*/([^/]+)/")
  local pod_tag = string.match(filename, "/pods/[^_]+_([^_]+)")

  if namespace_tag then record["namespace"] = namespace_tag end
  if pod_tag then record["pod"] = pod_tag end
  if container_tag then record["container"] = container_tag end

  return 1, timestamp, record
end
```

<Note>
  Lua コードを別ファイルとして用意する方が、設定ファイルにインラインで埋め込むよりもエラーが起こりにくくなります。
</Note>

### ステップ 4: 設定ファイルの作成

以下の内容を `~/.sambastack-observability/fluentbit/fluentbit-conf.conf` として保存します。

```ini theme={}
[INPUT]
  Buffer_Chunk_Size 10MB
  Buffer_Max_Size 64MB
  Exclude_Path /var/log/pods/*fluent*/*/*.log
  Log_Level info
  Mem_Buf_Limit 64MB
  Name tail
  Path /var/log/pods/*/*/*.log
  Path_Key filename
  Rotate_wait 120
  Skip_Long_Lines On
  Tag kube.*
  multiline.parser cri, docker

[FILTER]
  Match  kube.*
  Name  lua
  script /fluent-bit/sn/append_tags.lua
  call  append_tags

[FILTER]
  Key_Name  log
  Match  kube.*
  Name  parser
  Parser  json
  Reserve_Data  On

[FILTER]
  Key_Name  log
  Match  kube.*
  Name  parser
  Parser  k8s-nginx-ingress
  Reserve_Data  On

[OUTPUT]
  HTTP_Passwd  ${DEFAULT_OPENSEARCH_HTTP_PASS}
  HTTP_User  ${DEFAULT_OPENSEARCH_HTTP_USER}
  Host  ${DEFAULT_OPENSEARCH_HOST}
  Index  logs-7d
  Log_Level  info
  Match  kube.*
  Name  opensearch
  Port  ${DEFAULT_OPENSEARCH_PORT}
  Retry_Limit  False
  Suppress_Type_Name  On
  tls  On
  tls.verify  Off

[SERVICE]
  Buffer_Size 64MB
  Daemon Off
  Flush 10
  HTTP_Listen 0.0.0.0
  HTTP_Port 2020
  HTTP_Server On
  Health_Check On
  Log_Level debug
  Parsers_File /fluent-bit/etc/parsers.conf
  Trace_Error On
```

<Accordion title="設定の解説">
  **INPUT セクション:** すべての Pod のログファイルを tail で読み取ります。再帰を防ぐため、Fluent Bit 自身のログは除外します。

  **FILTER (Lua):** 外部の `append_tags.lua` スクリプトを実行し、ログファイルのパスから名前空間、Pod 名、コンテナ名を抽出します。

  **FILTER (parser):** ログの内容を JSON または nginx ingress 形式として解析を試みます。

  **OUTPUT:** TLS を有効にして OpenSearch にログを送信します。インデックス名 `logs-7d` は変更可能です。

  **SERVICE:** ヘルスチェックとメトリクス用に、ポート 2020 で HTTP サーバーを有効にします。
</Accordion>

### ステップ 5: 設定用 Secret の作成

```bash theme={}
kubectl -n monitoring create secret generic sn-fluentbit \
  --from-file=sn-fluentbit.conf="$HOME/.sambastack-observability/fluentbit/fluentbit-conf.conf" \
  --from-file=append_tags.lua="$HOME/.sambastack-observability/fluentbit/append_tags.lua" \
  --dry-run=client -o yaml | kubectl apply -f -
```

<Warning>
  Secret 名 `sn-fluentbit` は、Helm values ファイルの `secretName` と一致している必要があります。この名前を変更する場合は、values ファイルも合わせて更新してください。
</Warning>

### ステップ 6: Helm values ファイルの作成

以下の内容を `~/.sambastack-observability/fluentbit/fluentbit-values.yml` として保存します。

```yaml theme={}
env:
- name: DEFAULT_OPENSEARCH_HOST
  value: "opensearch-cluster-master.monitoring.svc.cluster.local"
- name: DEFAULT_OPENSEARCH_PORT
  value: "9200"
- name: DEFAULT_OPENSEARCH_HTTP_USER
  value: "admin"
- name: DEFAULT_OPENSEARCH_HTTP_PASS
  valueFrom:
    secretKeyRef:
      name: opensearch-initial-admin-password
      key: OPENSEARCH_INITIAL_ADMIN_PASSWORD

securityContext:
  privileged: true

tolerations:
- operator: Exists

daemonSetVolumes:
- name: var
  hostPath:
    path: /var
- name: etcmachineid
  hostPath:
    path: /etc/machine-id
    type: File
- name: sn-fluentbit
  secret:
    secretName: sn-fluentbit

daemonSetVolumeMounts:
- name: var
  mountPath: /var
  readOnly: true
- name: etcmachineid
  mountPath: /etc/machine-id
  readOnly: true
- name: sn-fluentbit
  mountPath: /fluent-bit/sn
  readOnly: true

args:
- --workdir=/fluent-bit/etc
- --config=/fluent-bit/sn/sn-fluentbit.conf

updateStrategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 5

config:
  inputs: ""
  filters: ""
  outputs: ""

image:
  repository: fluent/fluent-bit
  tag: "4.2.2"
```

### ステップ 7: Fluent Bit のインストール

```bash theme={}
helm -n monitoring upgrade --install fluent-bit fluent/fluent-bit \
  -f ~/.sambastack-observability/fluentbit/fluentbit-values.yml
```

## 動作確認

### Pod ステータスの確認

各ノードで Fluent Bit の Pod が稼働していることを確認します。

```bash theme={}
kubectl -n monitoring get po -l app.kubernetes.io/name=fluent-bit
```

期待される出力（ノードごとに 1 Pod）:

```text theme={}
NAME               READY   STATUS    RESTARTS   AGE
fluent-bit-4zh8w   1/1     Running   0          20h
fluent-bit-sdmxg   1/1     Running   0          20h
```

### ログが OpenSearch に届いていることの確認

OpenSearch サービスにポートフォワードします。

```bash theme={}
kubectl -n monitoring port-forward svc/opensearch-cluster-master 9200:9200 &
```

インデックスを一覧表示し、ログが取り込まれていることを確認します。

```bash theme={}
curl -u "admin:<password>" -k "https://localhost:9200/_cat/indices?v"
```

期待される出力:

```text theme={}
health status index     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logs-7d   0ahKcye3SfajNksbfapY4w   1   1     296144            0     58.1mb         58.1mb
```

`logs-7d` インデックスが存在し、`docs.count` が 0 以外であれば、Fluent Bit による OpenSearch へのログ送信は成功しています。

ポートフォワードのプロセスを停止するには、次を実行します。

```bash theme={}
pkill -f "port-forward.*opensearch"
```

### サンプルログのクエリ

サンプルクエリでログの内容を確認します。

```bash theme={}
curl -u "admin:<password>" -k "https://localhost:9200/logs-7d/_search?size=1&pretty"
```

`namespace`、`pod`、`container` の各フィールドが設定されたログエントリが表示されるはずです。

## 成功基準

以下の条件を満たしていれば、デプロイは成功です。

* Fluent Bit の DaemonSet Pod が、すべてのノードで `Running` 状態である
* OpenSearch に `logs-7d` インデックスが存在し、ドキュメントが登録されている
* サンプルログのクエリで、namespace/pod/container のメタデータが付与されたエントリが返される

## 設定リファレンス

| セクション | パラメータ | 説明 |
| - | - | - |
| INPUT | `Buffer_Chunk_Size` | ログファイル読み取り時の初期バッファサイズ (10MB) |
| INPUT | `Buffer_Max_Size` | 監視対象ファイルごとの最大バッファサイズ (64MB) |
| INPUT | `Mem_Buf_Limit` | バックプレッシャーが発動するまでのメモリバッファ上限 (64MB) |
| INPUT | `Rotate_wait` | ローテートされたファイルを読み取るまでの待機秒数 (120) |
| INPUT | `Exclude_Path` | 除外するログの glob パターン（Fluent Bit 自身のログ） |
| OUTPUT | `Index` | ログの保存先となる OpenSearch インデックス名 (`logs-7d`) |
| OUTPUT | `tls` | OpenSearch 接続の TLS を有効化 |
| OUTPUT | `tls.verify` | TLS 証明書の検証（自己署名証明書の場合は Off） |
| SERVICE | `Flush` | レコードを出力先にフラッシュする間隔（秒）(10) |
| SERVICE | `HTTP_Port` | Fluent Bit の HTTP サーバー（メトリクス）用ポート (2020) |

## トラブルシューティング

### Pod が起動しない (ImagePullBackOff)

**症状:** Fluent Bit の Pod に `ImagePullBackOff` または `ErrImagePull` と表示される。

**対処方法:** クラスターがコンテナレジストリに到達できることを確認してください。ネットワークポリシーやプロキシ要件も確認してください。

### OpenSearch にログが表示されない

**症状:** `logs-7d` インデックスが存在しない、またはドキュメント数が 0 である。

**考えられる原因と対処方法:**

1. **OpenSearch に到達できない:**
   ```bash theme={}
   # Check Fluent Bit logs for connection errors
   kubectl -n monitoring logs -l app.kubernetes.io/name=fluent-bit --tail=50
   ```

2. **パスワードの誤り:**
   `fluentbit-values.yml` のパスワードが、OpenSearch の管理者パスワードと一致していることを確認してください。

3. **Secret がマウントされていない:**
   ```bash theme={}
   kubectl -n monitoring describe pod -l app.kubernetes.io/name=fluent-bit | grep -A5 Mounts
   ```

### ログにメタデータフィールドがない

**症状:** OpenSearch にログは表示されるが、`namespace`、`pod`、`container` フィールドが欠落している。

**原因:** Lua フィルターがログファイルのパスを解析できていません。

**対処方法:** ログが想定どおりのパスパターン (`/var/log/pods/*/*/*.log`) から取得されていることを確認してください。

### メモリ使用量が多い

**症状:** Fluent Bit の Pod が OOMKilled になる、またはメモリ消費が多い。

**対処方法:** 設定でバッファサイズを削減します。

```ini theme={}
[INPUT]
  Buffer_Chunk_Size 5MB
  Buffer_Max_Size 32MB
  Mem_Buf_Limit 32MB
```

## 次のステップ

Fluent Bit によるログ転送が始まったら、次に進みます。

1. **Prometheus と Grafana のデプロイ** – ログの可視化ダッシュボードを追加します。詳細は [Prometheus と Grafana による監視](/docs/ja/v2.2.3/sambastack/reference-architecture/observability/monitoring-prom) をご参照ください。

2. **Grafana でのログ探索** – OpenSearch データソースを含む Grafana をデプロイすると、Explore 機能でログのクエリと可視化ができるようになります。

## クリーンアップ

クラスターから Fluent Bit を削除するには、以下を実行します。

Helm リリースをアンインストールします。

```bash theme={}
helm uninstall fluent-bit -n monitoring
```

設定用 Secret を削除します。

```bash theme={}
kubectl delete secret sn-fluentbit -n monitoring
```

<Note>
  Fluent Bit を削除するとログ転送は停止しますが、OpenSearch 内の既存ログは削除されません。過去のログを削除するには、OpenSearch でインデックスを直接削除するか、インデックスライフサイクルポリシーによってデータが失効するのを待ちます。
</Note>
