Fluent OperatorおよびFluent Bitの使用
v1.6.0 以降、Fluent Operatorはロギング・スタックに含まれ、有効にすると、Fluent OperatorはDaemonSetとして実行されるロギング・エージェントであるFluent Bitを構成および管理します。
Fluent Bit
Fluent Bitは、Kubernetesクラスタからログを収集し、ログを処理して、ログ・ストアに送信するロギング・エージェントです。
Fluent Operatorを使用して、VerrazzanoはFluent Bit DaemonSetをデプロイし、verrazzano-systemネームスペースのノードごとに1つのFluent Bitレプリカを実行します。各インスタンスは、ノードの/var/log/containersディレクトリからログを読み取り、それをターゲットのOpenSearchデータ・ストアに書き込みます。
Fluent Bitでは、次の4つの基本的な構成タイプがあります:
- 入力: ソースからデータを収集します。
- フィルタ: 収集されたデータを処理します。
- 出力: 収集および処理されたログをデータ・ストアに送信します。
- パーサー: 特定の形式でデータを解析します。入力およびフィルタはパーサー構成を使用します。
Fluent Operator
Verrazzanoには、オプションのコンポーネントとしてFluent Operatorが含まれています。有効にすると、Operatorはverrazzano-systemネームスペースのクラスタにインストールされ、必要なカスタム・リソースを使用して同じネームスペースにFluent Bit DaemonSetを作成します。OperatorがFluent Bitを構成するためにサポートするカスタム・リソースのリストについては、「Fluent Bit resources」を参照してください。接頭辞Clusterが付いたすべてのCRDは、すべてのクラスタ・ログの構成に使用できるクラスタ全体の構成です。
クラスタ全体のリソースと同様に、Operatorにはネームスペース付きリソースが付属しており、作成されると、これらのリソースが存在するネームスペースからのログが処理されます。ネームスペース付き構成とクラスタ全体の構成は連携して実行され、相互に補完します。ネームスペース付きリソースを作成しても、既存のクラスタ全体のリソースはオーバーライドされません。
Fluent Operatorを使用したロギングの有効化
Verrazzanoリソースは、Fluent Operatorを使用してロギングを構成するための2つのコンポーネントを定義します:
- fluentOperator: 有効にすると、Fluent Operatorをインストールし、クラスタ内でDaemonSetとして実行されているFluent Bitインスタンスを構成します。- fluentOperatorコンポーネントは、tailおよびsystemdタイプのClusterInputカスタム・リソースと、収集されたログをKubernetesメタデータでエンリッチするClusterFiltersのセットを作成します。
- fluentbitOpensearchOutput: 有効にすると、クラスタからOpenSearchにログを送信する2つのClusterOutputリソースが作成されます。2つのClusterOutputリソースは次のとおりです:- opensearch-system-clusteroutput: VerrazzanoコンポーネントがOpenSearchの- verrazzano-systemデータ・ストリームに存在するネームスペースからのログを送信するための中央出力シンクです。
- opensearch-application-clusteroutput: システムではないネームスペースからのログを- verrazzano-application-<namespace_name>データ・ストリームに送信します。
 
デフォルトでは、これらの2つのコンポーネントは無効であり、Verrazzanoカスタム・リソースで有効にする必要があります。次に、2つのコンポーネントが有効になっているVerrazzanoリソース・マニフェスト・ファイルの例を示します。
apiVersion: install.verrazzano.io/v1beta1
kind: Verrazzano
metadata:
  name: example-verrazzano
spec:
  profile: dev
  components:
    fluentOperator:
      enabled: true
    fluentbitOpensearchOutput:
      enabled: true
Verrazzanoがインストールされ、実行されている場合、これらの2つのコンポーネントを有効にするには、「Verrazzanoインストールの変更」を参照してください。
ノート: ログを収集し、処理して、OpenSearchに送信するには、両方のコンポーネントを有効にする必要があります。
システムおよびアプリケーションのClusterOutputリソースを取得するには、次のコマンドを実行します:
$ kubectl get cfbo
opensearch-system-clusteroutputとopensearch-application-clusteroutputが表示されます。
Fluentdのアンインストール
Fluentdはデフォルトのロギング・エージェントで、ログの収集、処理およびログ・ストアへの送信を行うDaemonSetとして実行されます。Verrazzanoがインストールされると、デフォルトでFluentdがインストールされます。Fluent Operatorを介してFluent Bitを組み込むと、これらのコンポーネントのいずれかを実行できるようになります。これらの2つのFluentdとFluent Bitは共存できますが、ログ・ストアがVerrazzano OpenSearchの場合は、両方のコンポーネントが同じログをVerrazzano OpenSearchに送信し、重複ログが発生するため、Fluentdをアンインストールする必要があります。
ノート: Fluent Bitは、OCI-Logging へのログの送信をサポートしていません。ログ・ストアがOCI-Loggingの場合は、引き続きFluentdを使用してください。
Fluentdをアンインストールするには、次のVerrazzanoリソース・マニフェスト・ファイルを使用します。
apiVersion: install.verrazzano.io/v1beta1
kind: Verrazzano
metadata:
  name: example-verrazzano
spec:
  profile: dev
  components:
    fluentOperator:
      enabled: true
    fluentbitOpensearchOutput:
      enabled: true
    fluentd:
      enabled: false
クラスタ全体のカスタム・リソースの構成
特定の方法でクラスタからのすべてのログをフィルタするClusterFilterや、ほとんどのログがカスタム・ログ・ストアに格納されるようにするClusterOutputなどのクラスタ全体のリソースを作成する場合は、カスタム・リソース・マニフェスト・ファイルのmetadata.labelsの下に次のラベルを追加します。
fluentbit.fluent.io/enabled: "true"
次に、クラスタからOpenSearch索引にログを送信するClusterOutputの例を示します。
$ kubectl apply -f - <<EOF
apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterOutput
metadata:
  labels:
    fluentbit.fluent.io/enabled: "true"
  name: example-clusteroutput
spec:
  match: *
  opensearch:
    host: <host-url>
    httpPassword:
      valueFrom:
        secretKeyRef:
          key: <password-key>
          name: <your-secret-name>
    httpUser:
      valueFrom:
        secretKeyRef:
          key: <username-key>
          name: <your-secret-name>
    index: <index-name>
    port: <port-number>
    suppressTypeName: true
EOF
- <host-url>、- <port-number>および- <index-name>を適切な値で置換します。
- <your-secret-name>、- <password-key>および- <username-key>を適切な値で置換します。
ClusterOutputの場合は、verrazzano-systemネームスペースにユーザー資格証明を含むシークレットを作成します。
ネームスペース付きカスタム・リソースの構成
アプリケーション・ネームスペースのログを処理するには、ネームスペース付きリソースを構成する必要があります。
FluentBitConfig
Fluent Operatorは、ネームスペース・レベルで構成可能性をサポートしており、アプリケーション・ネームスペースからログのFluent Bit 構成を作成できます。
FluentBitConfigカスタム・リソースはネームスペース付きリソースで、ラベル・セレクタを使用してフィルタ、出力、パーサーなどのリソースを選択するためにFluent Operatorによって使用されます。これらのリソースは、FluentBitConfigと同じネームスペースでチェックされます。ラベル・セレクタを使用して、FluentBitConfigはClusterParserリソースを選択することもできます。
Operatorのネームスペース・レベルの構成機能を使用する場合は、ネームスペースに少なくとも1つのFluentBitConfigリソースを作成する必要があります。FluentBitConfigリソースには、metadata.labelsの下に次のラベルを含める必要があります。
fluentbit.verrazzano.io/namespace-config: "verrazzano"
次に、ラベルlabel: "foo"を持つすべてのフィルタ、出力およびパーサーを選択するFluentBitConfigリソースの例を示します。
$ kubectl apply -f - <<EOF
apiVersion: fluentbit.fluent.io/v1alpha2
kind: FluentBitConfig
metadata:
  labels:
    fluentbit.verrazzano.io/namespace-config: "verrazzano"
  name: example-fluentbitconfig
  namespace: <application-namespace>
spec:
  filterSelector:
    matchLabels:
      foo: "bar"
  parserSelector:
    matchLabels:
      foo: "bar"
  outputSelector:
    matchLabels:
      foo: "bar"
EOF
spec.filterSelector、spec.parserSelectorおよびspec.outputSelectorの下のラベルを任意の有効なラベルに設定できます。対応するフィルタ、出力およびパーサーのカスタム・リソースをそのラベルで作成する必要があります。
カスタム・フィルタリングおよび解析
次に、my-appネームスペースで実行されているmyappアプリケーションからログを解析するフィルタとパーサー、およびこれらのフィルタおよびパーサーのリソースを同じネームスペースに配置するFluentBitConfigリソースの例を示します。ここで、出力されるログの形式は次のとおりです:
2023-05-29T09:53:35.959135345Z stdout F 2023-05-29 09:53:35 +0000 [warn]: #0 got incomplete line before first line from /logs/myapp-0.log: "(thread=DefaultHttpServerThread-1, member=3, up=342.673): Health: checking safe\n"
$ kubectl apply -f - <<EOF
-----
apiVersion: fluentbit.fluent.io/v1alpha2
kind: FluentBitConfig
metadata:
  labels:
    fluentbit.verrazzano.io/namespace-config: "verrazzano"
  name: myapp-fluentbitconfig
  namespace: my-app
spec:
  filterSelector:
    matchLabels:
      app: "myapp"
  parserSelector:
    matchLabels:
      app: "myapp"
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: Filter
metadata:
  labels:
    app: "myapp"
  name: myapp-filter
  namespace: my-app
spec:
  filters:
  - parser:
      keyName: log
      reserveData: true
      parser: myapp-parser
  match: kube.*
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: Parser
metadata:
  labels:       
    app: "myapp"
  name: myapp-parser
  namespace: my-app
spec:
  regex:
    regex: '/^(?<logtime>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{9}Z) (?<level>[^\s]+)[^:]+: (?<message>.*)$/'
    timeFormat: '%Y-%m-%dT%H:%M:%S.%LZ'
    timeKey: logtime
EOF
この構成は、FluentBitConfig、フィルタおよびパーサーの3つのリソースで構成されます。
FluentBitConfig:
- 名前: myapp-fluentbitconfig
- ネームスペース: my-app
- 正確なフィルタリングおよび解析のために、filterSelectorおよびparserSelectorを使用してラベルを値myappと一致させます。
フィルタ:
- 名前: myapp-filter
- ネームスペース: my-app
- このフィルタは、myappアプリケーションに関連付けられています。
- myapp-parserというパーサーをログに適用し、フィルタが- kubeソースのログと一致するように構成されます。
パーサー:
- 名前: myapp-parser
- ネームスペース: my-app
- このパーサーは、ログを解析するための正規表現およびフォーマットの詳細を定義します。ログ行から3つのフィールド(logtime、levelおよびmessage)を抽出します。
この構成を適用すると、myappアプリケーションによって生成されたログが正規表現に従って解析され、次のフィールドでエンリッチされることがわかります:
level: stderr
logtime: 2023-05-29T09:53:35.959135345Z
message: Health: checking safe
提供された正規表現(regex)は、ログの特定の形式に従ってパーサー・リソースで調整できます。アプリケーションのログ行の構造およびパターンに一致するように変更します。
カスタム出力
独自のログ・ストアを実行している場合は、アプリケーション・ネームスペースに出力リソースを作成して、アプリケーション・ネームスペースのログのみがこのログ・ストアに移動するようにできます。
次に、my-appネームスペースで実行されているmyappアプリケーションの出力リソースの例を示します。これは、基本認証によって保護されているカスタムOpenSearchクラスタにログを送信します。
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: FluentBitConfig
metadata:
  labels:
    fluentbit.verrazzano.io/namespace-config: "verrazzano"
  name: myapp-fluentbitconfig
  namespace: my-app
spec:
  outputSelector:
    matchLabels:
      app: "myapp"
---
apiVersion: fluentbit.fluent.io/v1alpha2
kind: Output
metadata:
  labels:
    app: "myapp"
  name: myapp-output
  namespace: my-app
spec:
  match: kube.*
  opensearch:
    host: <host-url>
    httpPassword:
      valueFrom:
        secretKeyRef:
          key: <password-key>
          name: <your-secret-name>
    httpUser:
      valueFrom:
        secretKeyRef:
          key: <username-key>
          name: <your-secret-name>
    index: <index-name>
    port: <port-number>
    suppressTypeName: true
EOF
- <host-url>、- <port-number>および- <index-name>を適切な値で置換します。OpenSearchクラスタの資格証明を保持するシークレットは、出力と同じネームスペース(アプリケーション・ネームスペース)に作成する必要があります。
- <your-secret-name>、- <password-key>および- <username-key>を適切な値で置換します。
ネームスペース付き出力リソースの場合、OpenSearchクラスタの資格証明を含むシークレットは、出力と同じネームスペース(アプリケーション・ネームスペース)に作成する必要があります。
この構成では、アプリケーション・ログも引き続きデフォルトのクラスタ出力に移動することに注意してください。
Verrazzano OpenSearchのアプリケーション・ログ収集の無効化
デフォルトでは、Verrazzanoによって作成されたアプリケーションClusterOutputによって、アプリケーションのログがシステムOpenSearchに送信されます。アプリケーション・ネームスペースに出力を構成した場合、アプリケーション・ログは、アプリケーションClusterOutputを使用するシステムOpenSearchと、アプリケーション・ネームスペースで作成した出力リソースを使用するカスタム宛先の2つの場所に格納されます。
Verrazzano OpenSearchログ収集をオプト・アウトする場合は、次のようにVerrazzanoカスタム・リソースを編集して、アプリケーションClusterOutputを無効にします:
apiVersion: install.verrazzano.io/v1beta1
kind: Verrazzano
metadata:
  name: example-verrazzano
spec:
  profile: dev
  components:
    fluentOperator:
      enabled: true
    fluentbitOpensearchOutput:
      enabled: true
      overrides:
        - values:
            application:
              enabled: false
Verrazzanoカスタム・リソースを更新すると、opensearch-application-clusteroutput ClusterOutputリソースがクラスタから削除されることがわかります。opensearch-system-clusteroutputは引き続き存在し、Verrazzanoコンポーネント・ログをVerrazzano OpenSearchに送信します。
systemdログ・ディレクトリの構成
デフォルトでは、systemdのjournalログ・ディレクトリは/var/run/journalに設定されています。ただし、環境によっては、ディレクトリの場所が異なる場合があります。
デフォルト構成をオーバーライドし、logsディレクトリを別のパスに設定するには、次のようにVerrazzanoカスタム・リソースを編集します:
apiVersion: install.verrazzano.io/v1beta1
kind: Verrazzano
metadata:
  name: example-verrazzano
spec:
  profile: dev
  components:
    fluentOperator:
      enabled: true
      overrides:
        - values:
            fluentbit:
              input:
                systemd:
                  path: <new-path>
    fluentbitOpensearchOutput:
      enabled: true
Fluent Bit構成の確認
次のように、Fluent Operatorがシークレットにロードし、Fluent Bit DaemonSetにボリュームとしてマウントする、生成されたFluent Bit構成を表示します:
$ kubectl -n verrazzano-system get secrets fluent-bit-config -ojson | jq '.data."fluent-bit.conf"' | awk -F '"' '{printf $2}' | base64 --decode
$ kubectl -n verrazzano-system get secrets fluent-bit-config -ojson | jq '.data."parsers.conf"' | awk -F '"' '{printf $2}' | base64 --decode