Fluent Bit を利用した Splunk 連携

本記事は「[TUNA-JP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/tuna-jp)」8日目のエントリとして、
Tanzu OSS の1つである Fluent Bit を対象に、基本的な構築手順や他ソフトウェアとの連携についてご紹介します。


#はじめに
はじめまして、@yama-s です。8日目を担当します！
本日は、TCE (Tanzu Community Edition) を利用し、ログ関連のコンポーネント構築を行ってみた記録をご紹介します。
ベーシックな内容が中心となりますが、何か少しでも参考にしていただける箇所があれば嬉しいです。

- 目次
  - はじめに
  - Fluent Bit とは？
  - 構築
     - 前提条件
     - Fluent Bit 構築
     - Splunk 構築
     - 連携設定
  - 結果
  - さいごに

#Fluent Bit とは？

Fluent Bit は、ログプロセッサおよびフォワーダー機能を提供するオープンソースのソフトウェアです。
高速かつ軽量なことが特徴で、さまざまなソースからメトリックやログなどのデータを収集し、それらを統一して複数の宛先に送信することが可能です。

[参考] What is Fluent Bit ?
https://docs.fluentbit.io/manual/about/what-is-fluent-bit

#構築
それではさっそく構築に入っていきます！
まずは前提条件の確認から。

##前提条件
3つの前提条件を満たすように環境を準備します。

[参考] Implement Log Forwarding with Fluent Bit

- 1つ目：Bootstrap マシンに次のものがインストールされていること
  - Tanzu CLI, Tanzu CLI plugins, and kubectl, as described in Install the Tanzu CLI and Other Tools.
  - Carvel tools, as described in Install the Carvel Tools.（ytt, kbld, kapp, imgpkg）
  - yq をインストール（v4.5 or later）

- 2つ目：management cluster および workload cluster がサポート対象のプラットフォームで稼働していること 
　→ 今回は vSphere 7.0 環境で実施。

- 3つ目：同一環境内に他のログ関連コンポーネントが展開されている場合には、注意点があるため Fluent Bit のドキュメントを確認すること
　→ 今回は該当しないので省略。


##Fluent Bit 構築
前提条件が確認できたら、事前準備を進めていきましょう。

###事前準備
対象のコンテキストに切り替えます。

```
tanzu cluster kubeconfig get CLUSTER_NAME --admin
kubectl config use-context CLUSTER_NAME-admin@CLUSTER_NAME
```

###デプロイ前の確認
利用可能なリポジトリを表示し、`tce-repo` がない場合には追加します。
続いて利用可能なパッケージおよび、Fluent Bit に関する情報を表示します。

```
# 利用可能なリポジトリを表示、"tce-repo" を追加
tanzu package repository list -A
tanzu package repository add tce-repo --url projects.registry.vmware.com/tce/main:0.9.1 -n tanzu-package-repo-global

# 利用可能なパッケージ、Fluent Bit に関する情報を表示
tanzu package available list -A
tanzu package available list fluent-bit.community.tanzu.vmware.com -A
```

※ ここではリポジトリ追加先として、`tanzu-package-repo-global` namespace を指定しています。

```
# 実行結果
tanzu package available list fluent-bit.community.tanzu.vmware.com -A
- Retrieving package versions for fluent-bit.community.tanzu.vmware.com...
  NAME                                   VERSION  RELEASED-AT           NAMESPACE
  fluent-bit.community.tanzu.vmware.com  1.7.5    2021-05-13T18:00:00Z  tanzu-package-repo-global
```

###設定ファイルの準備

サンプルをベースに、Fluent Bit の設定ファイルを作成します。
サンプルは以下を参考にしました。

・[Fluent Bit package configuration file for Tanzu Kubernetes Grid v1.4](https://developer.vmware.com/samples/7687/fluent-bit-package-configuration-file-for-tanzu-kubernetes-grid-v1.4?h=%22fluent%20bit%22)

対象ファイル
・`fluent-bit-data-values.yaml`

```fluent-bit-data-values.yaml
namespace: "tanzu-system-logging"
fluent_bit:
  config:
    #! https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/variables
    service: |
      [Service]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     2020
    outputs: |
#      # References
#      ## ElasticSearch
#      [OUTPUT]

（…中略…）

    inputs: |
      [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            cri
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10

      [INPUT]
        Name                systemd
        Tag                 kube_systemd.*
        Path                /var/log/journal
        DB                  /var/log/flb_kube_systemd.db
        Systemd_Filter      _SYSTEMD_UNIT=kubelet.service
        Systemd_Filter      _SYSTEMD_UNIT=containerd.service
        Read_From_Tail      On
        Strip_Underscores   On

（…中略…）

    filters: |
      [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kube.var.log.containers.
        Merge_Log           On
        Merge_Log_Key       log_processed
        K8S-Logging.Parser  On
        K8S-Logging.Exclude On

（…中略…）

  #! optional configuration for the daemonset
  daemonset:
    resources: { }
    #! limits:
    #!   cpu: 100m
    #!   memory: 128Mi
    #! requests:
    #!   cpu: 100m
    #!   memory: 128Mi
    podAnnotations: { }
    podLabels: { }
```

サンプルファイルを配置し、[Output] 項目の Splunk フィールドをアンコメントします。

```fluent-bit-data-values.yamlから抜粋
      # Splunk
      [OUTPUT]
        Name           splunk
        Match          *
        Host           $SPLUNK_HOST
        Port           $SPLUNK_PORT
        Splunk_Token   $SPLUNK_TOKEN
        TLS            On
        TLS.Verify     Off
```

その他、必要な設定をアンコメント後、ファイル中のすべてのコメント行を削除します。（Optional）

```
yq -i eval '... comments=""' fluent-bit-data-values.yaml
```

###デプロイ
ターゲットのクラスタ上に対象の namespace を作成（もしくは既存の namespace を指定）し、以下実行します。

```
tanzu package install fluent-bit \
--package-name fluent-bit.tanzu.vmware.com \
--version AVAILABLE-PACKAGE-VERSION \
--values-file fluent-bit-data-values.yaml \
--namespace TARGET-NAMESPACE \
--create-namespace
```

`TARGET-NAMESPACE` には、パッケージのインストール先の namespace を入力します。
（例：my-packages）

`AVAILABLE-PACKAGE-VERSION` には、事前に確認したパッケージバージョンを入力します。
（例：1.7.5）


```
# コマンド実行例
tanzu package install fluent-bit --package-name fluent-bit.community.tanzu.vmware.com --version 1.7.5 --values-file fluent-bit-data-values.yaml --namespace my-packages

/ Installing package 'fluent-bit.community.tanzu.vmware.com'
| Getting namespace 'my-packages'
| Getting package metadata for 'fluent-bit.community.tanzu.vmware.com'
| Creating service account 'fluent-bit-my-packages-sa'
| Creating cluster admin role 'fluent-bit-my-packages-cluster-role'
| Creating cluster role binding 'fluent-bit-my-packages-cluster-rolebinding'
| Creating secret 'fluent-bit-my-packages-values'
- Creating package resource
- Package install status: Reconciling

 Added installed package 'fluent-bit' in namespace 'my-packages'
```

###デプロイ後の確認
デプロイ後、以下3点を確認をします。

1. fluent-bit package がインストールされていること

    ```
    # コマンド実行例
    tanzu package installed list -A
    / Retrieving installed packages...
    NAME            PACKAGE-NAME                           PACKAGE-VERSION  STATUS               NAMESPACE
    fluent-bit      fluent-bit.community.tanzu.vmware.com  1.7.5            Reconcile succeeded  my-packages
    antrea          antrea.tanzu.vmware.com                                 Reconcile succeeded  tkg-system
    [...]
    ```

2. fluent-bit app が 指定した namespace に存在すること 

    ```
    # コマンド実行例
    kubectl get apps -A
    NAMESPACE     NAME             DESCRIPTION           SINCE-DEPLOY   AGE
    my-packages   fluent-bit       Reconcile succeeded   28s            10m
    tkg-system    antrea           Reconcile succeeded   3m52s          21h
    [...]
    ```

    ※ここで、もしステータスが `Reconcile succeeded` ではない場合には、以下で yaml ファイルを出力して内容確認

    ```
    kubectl get app fluent-bit --namespace AVAILABLE-PACKAGE-NAMESPACE -o yaml
    ```

3. クラスタ内で新しく作成されたサービスが実行されていること

    ```
    # コマンド実行例
    kubectl get pod -A
    NAMESPACE              NAME                                                     READY   STATUS    RESTARTS   AGE
    [...]
    tanzu-system-logging   fluent-bit-2clmt                                         1/1     Running   0          12m
    tanzu-system-logging   fluent-bit-btzjp                                         1/1     Running   0          12m
    [...]
    ```

無事 Fluent Bit の Pod が稼働していることを確認できました！

##Splunk 構築
お次は Splunk です。同一の vSphere 環境上に2台目の CentOS8.3 を用意しました。こちらに構築していきます。

ちなみに現在の用途は以下です。
・1台目の CentOS8.3 … Bootstrap として使用中
・2台目の CentOS8.3 … Splunk 構築用として用意

###媒体入手
こちらから Splunk のインストール媒体を入手します。
https://www.splunk.com/ja_jp

・まずは、Splunk アカウントを登録しログイン
　https://www.splunk.com/ja_jp/download/splunk-enterprise.html

・「インストールパッケージを選択」より、Linux 版の .tgz ファイルをダウンロード
　https://download.splunk.com/products/splunk/releases/8.2.3/linux/splunk-8.2.3-cd0848707637-Linux-x86_64.tgz?_ga=2.217990358.1384987425.1638196020-1013376100.1637755103


対象ファイル
・`splunk-8.2.3-cd0848707637-Linux-x86_64.tgz`


###インストール

以下ドキュメントを参照しながらインストールします。

・[参考] インストールマニュアル
　https://docs.splunk.com/Documentation/Splunk/latest/Installation/Whatsinthismanual?_ga=2.214724567.1384987425.1638196020-1013376100.1637755103
・[参考] クイック リファレンスガイド
　https://www.splunk.com/pdfs/solution-guides/splunk-quick-reference-guide.pdf

■システム要件の確認

・Supported Operating Systems
　https://docs.splunk.com/Documentation/Splunk/8.2.3/Installation/SystemRequirements

今回はカーネルバージョン 4.18.0 のため該当箇所を探すと、まさかの「**X**」・・・？と思いきや、

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/cc78c21f-c1f7-014a-d0c8-f076e14b1827.png)|
|:--|

「**X**」は利用可能という意味でした。よかったです。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/1b9770f2-063d-c4a8-7e79-48614a9a0b95.png)|
|:--|

■インストール

以下を参照し、Splunk をインストールします。

・Install on Linux
　https://docs.splunk.com/Documentation/Splunk/8.2.3/Installation/InstallonLinux

パッケージを CentOS83-02 上に配置し、tgzファイルを展開

```
tar xvzf splunk_package_name.tgz
```


■起動

以下を参照し、Splunk を起動します。

・Start Splunk Enterprise on Linux
　https://docs.splunk.com/Documentation/Splunk/8.2.3/SearchTutorial/StartSplunk

展開後に `bin` ディレクトリへ移動し、`./splunk start` を実行

```
cd <Splunk_Enterprise_Installation_Directory>/bin
./splunk start
```

初回起動時は以下を行います。
・使用許諾に承諾
・ユーザ名入力（デフォルト：admin ）
・パスワード設定

しばらくすると…起動成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/96c45111-65f2-a1ef-88d4-f7dbd15f1a00.png)

###インストール後の確認

対象ポートが開いていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/c6645bde-afc1-511b-7fda-0f0dd78a6000.png)

`http://SplunkのFQDN:8000` にアクセスします。

ログイン画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/53a52d50-8bc0-410d-b039-a755f82b57e0.png)

ログイン後の画面はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/14f9a528-542a-7ae5-c055-a1a6529a126e.png)


##連携設定

###Splunk の設定
Splunk 側では、以下を設定します。
ここでは例として、`journal` と `kube` を対象にしています。

- インデックス作成
   - 設定 → インデックス へ移動し、index を作成する
     - journal の index
     - kube の index
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/045f9672-a684-a8ce-5d46-6a06656d21d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/c50bc5ce-4a76-938c-38f9-3aa796ea4e5f.png)
※作成したインデックスを Fluent Bit 側の設定ファイルへ記載する

- トークン生成
   - 設定 → データ入力 → HTTPイベントコレクター へ移動し、トークンを生成する
     - journal のトークン
     - kube のトークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/176a50c5-6d6d-b9ec-47d5-b88ec0e62742.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/23aeb576-c37d-9f85-88b9-189cd7b2739c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/f2d993f2-1cbd-eb22-ee2e-c7d2e9be3fdf.png)
※生成したトークンを Fluent Bit 側の設定ファイルへ記載する


- ポート番号確認
  - 設定→　データ入力 → HTTP Event Collector → グローバル設定へ移動し、転送先のポート番号を確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/3263f8a5-59c4-72e5-db78-2c206ce096d3.png)
※確認したポート番号を Fluent Bit 側の設定ファイルへ記載する。本環境ではデフォルトの `8088` を利用

###Fluent Bit の設定
Fluent Bit 側では、以下を設定します。

- 設定ファイルに必要情報を入力し、設定反映

```fluent-bit-data-values.yamlから抜粋
      # Splunk
      [OUTPUT]
        Name           splunk
        Match          *
        Host           $SPLUNK_HOST
        Port           $SPLUNK_PORT
        Splunk_Token   $SPLUNK_TOKEN
        TLS            On
        TLS.Verify     Off
```

`Match` 項目 … 前項で作成したインデックスを指定　※表記例は「journal.*」や「kube.\*」
`$SPLUNK_HOST` … splunk のIPアドレス/FQDN を指定
`$SPLUNK_PORT` … 前項で確認したポート番号(8088)を指定
`$SPLUNK_TOKEN` … 前項で生成したトークンを指定

※今回は構築順序を「Fluent Bit → Splunk」で行いましたが、Fluent Bit の設定ファイルに Splunk の情報を予め記載できた方がスムーズなため、「Splunk → Fluent Bit」の順番が正しかったなと思いました。

#結果
連携結果を見ていきましょう。

###サーチ実行
Splunk GUI より、対象ログを検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/10462096-9930-6945-6239-6f4fdd30fa33.png)

新規サーチより、`index="kube"` にて結果が確認できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2317898/d3846681-a5e0-6029-4142-4e7f6a63d6ef.png)


#さいごに
今回、実際に手を動かして構築してみることで、自身の理解度を無の状態から少し深めることができました。
Advent Calendar を通じて記事化の機会をくださった @hirosat さん、[TUNA-JP](https://tuna-jp.tech/) のみなさん、ありがとうございました！
おうちクラウドを活用して、また別製品にもトライしたいです。

だんだんと寒くなってきましたが…まだまだ前半戦ですね。明日もお楽しみに。
みなさま良い12月を！



----
[参考] 主な参照ドキュメント

- Getting Started with Tanzu Community Edition
https://tanzucommunityedition.io/docs/latest/getting-started/

- Fluent Bit
https://tanzucommunityedition.io/docs/latest/package-readme-fluent-bit-1.7.5/

- Send logs to Splunk HTTP Event Collector
https://docs.fluentbit.io/manual/pipeline/outputs/splunk

----