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