36.5.3. Fluentd
Fluentd はノードラベルセレクターに従ってノードをデプロイする DeamonSet としてデプロイされます。ノードラベルセレクターはインベントリーパラメーター openshift_logging_fluentd_nodeselector を使用して指定することができ、デフォルトは logging-infra-fluentd です。OpenShift クラスターのインストールの一環として、Fluentd ノードセレクターを永続化された ノードラベル の一覧に追加することが推奨されます。
Fluentd は journald をシステムログソースとして使用します。これらは、オペレーティングシステム、コンテナーランタイム、および OpenShift からのログメッセージです。
利用可能なコンテナーのランタイムでは、ログメッセージのソースを特定するための最小限の情報が提供されます。ログ収集およびログの正規化は、Pod が削除されてから行われるので、ラベルまたはアノテーションなどの追加のメタデータが API サーバーから取得できません。
ログコレクターがログの処理を完了する前に、特定の名前および namespace が含まれる Pod が削除された場合には、よく似た名前の Pod および namespace とログメッセージを区別する方法がなくなる可能性があります。これにより、ログがインデックス化され、Pod にデプロイしていないユーザーが所有するインデックスにアノテーションが付けられる可能性があります。
利用可能なコンテナーランタイムは、ログメッセージのソースを特定するための最小限の情報を提供し、個別のログメッセージが一意となる確証はなく、これらのメッセージにより、そのソースを追跡できる訳ではありません。
OpenShift Container Platform 3.9 以降のクリーンインストールではデフォルトのログドライバーとして json-file を使用しますが、OpenShift Container Platform 3.7 からアップグレードされた環境は既存の journald ログのドライバー設定を維持します。json-file ログドライバーの使用を推奨します。既存のログドライバー設定を json-file に変更する手順については、集計ロギングドライバーの変更 を参照してください。
Fluentd ログの表示
ログの表示方法は、LOGGING_FILE_PATH の設定 によって異なります。
LOGGING_FILE_PATHがファイルを参照する場合、logs ユーティリティーを使用して Fluentd ログファイルの内容を出力します。oc exec <pod> -- logs1 - 1
- Fluentd Pod の名前を指定します。
logsの前にスペースがあることに注意してください。
以下に例を示します。
oc exec logging-fluentd-lmvms -- logsログファイルの内容は、最も古いログから順番に印刷されます。
-fオプションを使用して、ログに書き込まれている内容をフォローします。LOGGING_FILE_PATH=consoleを使用している場合、Fluentd はログをデフォルトの場所/var/log/fluentd/fluentd.logに書き込みます。oc logs -f <pod_name>コマンドでログを取得できます。以下に例を示します。
oc logs -f fluentd.log
Fluentd ログの位置の設定
Fluentd は、LOGGING_FILE_PATH 環境変数に応じて、デフォルトの /var/log/fluentd/fluentd.log の指定ファイルか、またはコンソールにログを書き出します。
Fluentd ログ出力のデフォルトの位置を変更するには、デフォルトインベントリーファイル で LOGGING_FILE_PATH パラメーターを使用します。特定のファイルを指定するか、Fluentd のデフォルトの場所を使用できます。
LOGGING_FILE_PATH=console
LOGGING_FILE_PATH=<path-to-log/fluentd.log>
これらのパラメーターを変更した後に、ロギングインストーラー Playbook を再実行します。
$ cd /usr/share/ansible/openshift-ansible
$ ansible-playbook [-i </path/to/inventory>] \
playbooks/openshift-logging/config.yml
Fluentd ログローテーションの設定
現在の Fluentd ログファイルが指定されたサイズに達すると、OpenShift Container Platform は fluentd.log ログファイルの名前を自動的に変更し、新規のロギングデータを収集できるようにします。ログローテーションはデフォルトで有効にされます。
以下の例では、最大ログサイズが 1Mb で 4 つのログを保持する必要のあるクラスターのログを示しています。fluentd.log が 1Mb に達すると、OpenShift Container Platform は現在の fluentd.log.4 を削除し、Fluentd ログのそれぞれの名前を順番に変更し、新規の fluentd.log を作成します。
fluentd.log 0b
fluentd.log.1 1Mb
fluentd.log.2 1Mb
fluentd.log.3 1Mb
fluentd.log.4 1Mb
環境変数を使用して、Fluentd ログファイルのサイズおよび OpenShift Container Platform が保持する名前変更されたファイルの数を制御することができます。
| パラメーター | 説明 |
|---|---|
|
| 単一の Fluentd ログファイルの最大サイズ (バイト単位)。flientd.log ファイルのサイズがこの値を超える場合、OpenShift Container Platform は fluentd.log.* ファイルの名前を変更し、新規の fluentd.log を作成します。デフォルトは 1024000 (1MB) です。 |
|
|
Fluentd が削除する前に保持するログ数。デフォルト値は |
以下に例を示します。
$ oc set env ds/logging-fluentd LOGGING_FILE_AGE=30 LOGGING_FILE_SIZE=1024000"
LOGGING_FILE_PATH=console を設定してログローテーションをオフにします。これにより、Fluentd はログを Fluentd のデフォルトの場所である /var/log/fluentd/fluentd.log に書き込みます。 ここでは、 oc logs -f <pod_name> コマンドを使用してそれらのログを取得できます。
$ oc set env ds/fluentd LOGGING_FILE_PATH=console
MERGE_JSON_LOG でのログの JSON 解析の無効化
デフォルトで、Fluentd はログメッセージが JSON 形式であり、そのメッセージを Elasticsearch に送信された JSON ペイロードドキュメントにマージするかどうかを判別します。
JSON 解析を使用する場合は、以下を行います。
- Elasticsearch が整合性のないタイプのマッピングによりドキュメントを拒否することでログが失われる。
- 拒否されるメッセージの繰り返し処理によってバッファーストレージ不足が生じる。
- 名前が同じフィールドのデータが上書きされる。
これらの問題の一部を軽減する方法は、ログコレクターによってログを正規化する方法の設定 を参照してください。
これらの問題を回避する場合やログから JSON を解析する必要がない場合には、JSON 解析を無効にできます。
JSON 解析を無効にするには、以下を実行します。
次のコマンドを実行します。
oc set env ds/logging-fluentd MERGE_JSON_LOG=false1 - 1
- これを
falseに設定してこの機能を無効にするか、またはtrueに設定してこの機能を有効にします。
Ansible の実行時にこの設定が適用されるようにするには、Ansible インベントリーに
openshift_logging_fluentd_merge_json_log="false"を追加します。
ログコレクターによってログを正規化する方法の設定
クラスターロギングは、データベーススキーマなどの特定のデータモデルを使用して、ログレコードとそのメタデータをロギングストアに格納します。このデータについてはいくつかの制限があります。
-
実際のログメッセージが含まれる
"message"フィールドがなければなりません。 -
RFC 3339 形式のログレコードのタイムスタンプを含む
"@timestamp"フィールドがなければなりません (ミリ秒以上の単位の使用が望ましい)。 -
err、info、unknownなどのログレベルが含まれる"level"フィールドがなければなりません。
データモデルの詳細については、Exported Fields を参照してください。
これらの要件により、異なるサブシステムから収集されるログデータで競合や不整合が生じる場合があります。
たとえば、MERGE_JSON_LOG 機能 (MERGE_JSON_LOG=true) を使用する場合、アプリケーションの出力のログを JSON で記録し、ログコレクターが Elasticsearch 内でデータを自動的に解析し、インデックス化すると非常に便利です。ただし、これにより、以下のような問題が発生します。
- フィールド名が空になることや、Elasticsearch で使用できない文字が含まれる可能性があります。
- 同じ namespace 内にある異なるアプリケーションで、値のデータタイプが異なり、フィールド名が同じものを出力する可能性があります。
- アプリケーションが過剰にフィールドを出力する可能性があります。
- フィールドは、クラスターロギングの組み込みフィールドと競合する可能性があります。
以下の表で、Fluentd ログコレクターの daemonset を編集し、環境変数を設定することで、クラスターロギングが異種ソースからフィールドを処理する方法を設定できます。
未定義のフィールド。ViaQ データモデルに対して不明なフィールドは undefined と呼ばれます。異種システムのログデータには、未定義のフィールドを含めることができます。このデータモデルでは、すべての最上位フィールドが定義され、記述される必要があります。
パラメーターを使用して OpenShift Container Platform が、
undefinedという最上位フィールド以下のすべての未定義のフィールドを移動し、既知の 最上位フィールドとの競合を避けます。未定義フィールドを最上位フィールドに追加し、他のフィールドをundefinedコンテナーに移動できます。また、未定義のフィールドで特殊文字を置き換えることができ、未定義フィールドを JSON 文字列表現に変換することもできます。JSON 文字列に変換しても値の構造を維持されるため、値を後で取得してマップまたは配列に戻すことができます。
-
番号やブール値などの簡単なスカラー値は、引用符で囲まれた文字列に変更されます。たとえば、
10は"10"、3.1415は"3.1415"、falseは"false"となります。 -
map/dict の値と配列の値は JSON 文字列表現に変換されます:
"mapfield":{"key":"value"}は"mapfield":"{\"key\":\"value\"}"に、"arrayfield":[1,2,"three"]は"arrayfield":"[1,2,\"three\"]"に変換されます。
-
番号やブール値などの簡単なスカラー値は、引用符で囲まれた文字列に変更されます。たとえば、
定義されたフィールド。定義されたフィールドはログの最上位に表示されます。定義されたフィールドとして考慮されるフィールドを設定できます。
CDM_DEFAULT_KEEP_FIELDSパラメーターで定義されるデフォルトの最上位のフィールドは次のとおりです:CEE、time、@timestamp、aushape、ci_job、collectd、docker、fedora-ci、file、foreman、geoip、hostname、ipaddr4、ipaddr6、kubernetes、level、message、namespace_name、namespace_uuid、offset、openstack、ovirt、pid、pipeline_metadata、service、systemd、tags、testcase、tlog、viaq_msg_id${CDM_DEFAULT_KEEP_FIELDS}または${CDM_EXTRA_KEEP_FIELDS}に含まれないフィールドはすべて、CDM_USE_UNDEFINEDがtrueの場合、${CDM_UNDEFINED_NAME}に移動されます。これらのパラメーターの詳細は、以下の表を参照してください。注記CDM_DEFAULT_KEEP_FIELDSパラメーターは、上級ユーザーのみが使用するか、Red Hat サポートによって使用することが指示された場合に使用されることが想定されます。- 空のフィールド。空のフィールドにはデータがありません。ログから、空のままにするフィールドを判別できます。
| パラメーター | 定義 | 例 |
|---|---|---|
|
|
|
|
|
| 空の場合でも CSV 形式で保持するフィールドを指定します。空の定義されたフィールドで指定されないものはドロップされます。デフォルトは message で、空のメッセージを維持します。 |
|
|
|
未定義のフィールドを |
|
|
|
|
|
|
|
未定義フィールドの数がこの数を超える場合、未定義のフィールドはすべて JSON 文字列表現に変換され、
注: このパラメーターは、 |
|
|
|
未定義フィールドをすべて JSON 文字列表現に変換するには、 |
|
|
|
未定義フィールドでドット文字 '.' の代わりに使用する文字を指定します。 |
|
Fluentd ログコレクター daemonset の MERGE_JSON_LOG パラメーターおよび CDM_UNDEFINED_TO_STRING 環境変数を true に設定した場合、Elasticsearch 400 エラーを受信する可能性があります。MERGE_JSON_LOG=true の場合、ログコレクターが string 以外のデータタイプのフィールドを追加します。CDM_UNDEFINED_TO_STRING=true を設定する場合、ログコレクターはそれらのフィールドへの文字列の値の追加を試行し、これにより Elasticsearch 400 エラーが生じます。ログコレクターが翌日のログにインデックスをロールオーバーすると、エラーはクリアされます。
ログコレクターがインデックスをロールオーバーする場合、完全に新規のインデックスが作成されます。フィールドの定義は更新され、400 エラーは発生しません。詳細は、Setting MERGE_JSON_LOG および CDM_UNDEFINED_TO_STRING を参照してください。
未定義および空のフィールドの処理を設定するには、logging-fluentd daemonset を編集します。
必要に応じてフィールドの処理方法を設定します。
-
CDM_EXTRA_KEEP_FIELDSを使用して移動するフィールドを指定します。 -
CSV 形式で
CDM_KEEP_EMPTY_FIELDSパラメーターで保持する空のフィールドをすべて指定します。
-
必要に応じて未定義フィールドの処理方法を設定します。
-
CDM_USE_UNDEFINEDをtrueに設定し、未定義のフィールドを最上位のundefinedフィールドに移動します。 -
CDM_UNDEFINED_NAMEパラメーターを使用して、未定義フィールドの名前を指定します。 -
CDM_UNDEFINED_MAX_NUM_FIELDSをデフォルトの-1以外の値に設定し、単一レコードにおける未定義フィールド数の上限を設定します。
-
-
CDM_UNDEFINED_DOT_REPLACE_CHARを指定して、未定義フィールド名のすべてのドット (.) 文字を別の文字に変更します。たとえば、CDM_UNDEFINED_DOT_REPLACE_CHAR=@@@の場合で、foo.bar.bazという名前のフィールドがある場合、そのフィールドはfoo@@@bar@@@bazに変換されます。 -
UNDEFINED_TO_STRINGをtrueに設定し、未定義フィールドを JSON 文字列表現に変換します。
CDM_UNDEFINED_TO_STRING または CDM_UNDEFINED_MAX_NUM_FIELDS パラメーターを設定する場合、CDM_UNDEFINED_NAME を使用して未定義フィールドの名前を変更します。CDM_UNDEFINED_TO_STRING または CDM_UNDEFINED_MAX_NUM_FIELDS が未定義フィールドの値タイプを変更する可能性があるため、このフィールドは必要になります。CDM_UNDEFINED_TO_STRING または CDM_UNDEFINED_MAX_NUM_FIELDS が true に設定されていて、ログにさらに多くの未定義フィールドがある場合、値タイプは string になります。値タイプが変更される場合、Elasticsearch はレコードの受け入れを停止します (JSON から JSON 文字列への変更など)。
たとえば、CDM_UNDEFINED_TO_STRING が false であるか、または CDM_UNDEFINED_MAX_NUM_FIELDS がデフォルトの -1 の場合、未定義フィールドの値タイプは json になります。CDM_UNDEFINED_MAX_NUM_FIELDS をデフォルト以外の値に変更し、ログにさらに多くの未定義フィールドがある場合、値タイプは string (json string) になります。値タイプが変更された場合、Elasticsearch はレコードの受け入れを停止します。
MERGE_JSON_LOG および CDM_UNDEFINED_TO_STRING の設定
MERGE_JSON_LOG および CDM_UNDEFINED_TO_STRING 環境変数を true に設定する場合、Elasticsearch 400 エラーを受信する可能性があります。MERGE_JSON_LOG=true の場合、ログコレクターが string 以外のデータタイプのフィールドを追加します。CDM_UNDEFINED_TO_STRING=true を設定する場合、Fluentd はそれらのフィールドを 文字列 の値として追加することを試行し、これにより Elasticsearch 400 エラーが生じます。このエラーはインデックスが翌日にロールオーバーされるとクリアされます。
Fluentd が次の日のログのインデックスをロールオーバーする場合、全く新しいインデックスが作成されます。フィールドの定義は更新され、400 エラーは発生しません。
スキーマ違反やデータ破損などの ハード (hard) エラーのあるレコードについては、再試行できません。ログコレクターはエラー処理のためにレコードを送信します。最後に表示される <label> のように Fluentd 設定に <label @ERROR> セクションを追加 する場合、それらのレコードを随時処理することができます。
以下に例を示します。
data:
fluent.conf:
....
<label @ERROR>
<match **>
@type file
path /var/log/fluent/dlq
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
compress gzip
</match>
</label>
このセクションではエラーレコードを Elasticsearch dead letter queue (DLQ) ファイル に書き込みます。ファイル出力の詳細は fluentd のドキュメント を参照してください。
次に、レコードを手動でクリーンアップし、ファイルを Elasticsearch /_bulk index API で使用し、cURL を使用してそれらのレコードを追加できるようにファイルを編集することができます。Elasticsearch Bulk API についての詳細は Elasticsearch のドキュメント を参照してください。
複数行の Docker ログへの参加
Fluentd を Docker ログの部分的なフラグメントからログレコード全体を再構築するように Fluentd を設定できます。この機能は有効にすると、Fluentd は複数行の Docker ログを読み取り、それらを再作成し、データが欠落することなしにログを 1 つのレコードとして Elasticsearch に保存します。
ただし、この機能が原因でパフォーマンスの低下が発生する可能性があるため、機能はデフォルトでオフになっており、手動で有効にする必要があります。
以下の Fluentd 環境変数では、複数行の Docker ログを処理するようにクラスターロギングを設定します。
| パラメーター | 説明 |
|---|---|
| USE_MULTILINE_JSON |
|
| USE_MULTILINE_JOURNAL |
|
以下のコマンドで、使用されているログドライバーを確認できます。
$ docker info | grep -i log
以下のいずれかの出力が表示されます。
Logging Driver: json-file
Logging Driver: journald
複数行の Docker ログ処理をオンにするには、以下を実行します。
以下のコマンドを使用して、複数行の Docker ログを有効にします。
json-fileログドライバーの場合:oc set env daemonset/logging-fluentd USE_MULTILINE_JSON=truejournaldログドライバーの場合:oc set env daemonset/logging-fluentd USE_MULTILINE_JOURNAL=true
クラスターの Fluentd Pod が再起動します。
外部ログアグリゲーターにログを送信するための Fluentd の設定
secure-forward プラグインを使用して、デフォルトの Elasticsearch に加えてログのコピーを外部ログアグリゲーターに送信するように Fluentd を設定できます。ローカルにホストされている Fluentd による処理の後に、ログレコードをさらに処理することができます。
クライアント証明書を使用して secure_foward プラグインを設定することはできません。認証は SSL/TLS プロトコルを介して実行できますが、shared_key と宛先 Fluentd を secure_foward 入力プラグインで設定する必要があります。
ロギングデプロイメントでは、外部ログアグリゲーターを設定するために、Fluentd configmap で secure-forward.conf セクションを指定します。
<store>
@type secure_forward
self_hostname pod-${HOSTNAME}
shared_key thisisasharedkey
secure yes
enable_strict_verification yes
ca_cert_path /etc/fluent/keys/your_ca_cert
ca_private_key_path /etc/fluent/keys/your_private_key
ca_private_key_passphrase passphrase
<server>
host ose1.example.com
port 24284
</server>
<server>
host ose2.example.com
port 24284
standby
</server>
<server>
host ose3.example.com
port 24284
standby
</server>
</store>
oc edit コマンドを使用して更新できます。
$ oc edit configmap/logging-fluentd
secure-forward.conf で使用される証明書を Fluentd Pod にマウントされる既存のシークレットに追加することができます。your_ca_cert と your_private_key の値は configmap/logging-fluentd の secure-forward.conf で指定されている値と一致している必要があります。
$ oc patch secrets/logging-fluentd --type=json \
--patch "[{'op':'add','path':'/data/your_ca_cert','value':'$(base64 -w 0 /path/to/your_ca_cert.pem)'}]"
$ oc patch secrets/logging-fluentd --type=json \
--patch "[{'op':'add','path':'/data/your_private_key','value':'$(base64 -w 0 /path/to/your_private_key.pem)'}]"
your_private_key は、汎用的な名前に置き換えます。これは、JSON パスへのリンクであり、使用しているホストシステムのパスではありません。
外部アグリゲーターを設定する際は、Fluentd からのメッセージを安全に受信できる必要があります。
外部アグリゲーターが別の Fluentd サーバーである場合、fluent-plugin-secure-forward プラグインがインストールされていて、それによって提供される入力プラグインを使用する必要があります。
<source>
@type secure_forward
self_hostname ${HOSTNAME}
bind 0.0.0.0
port 24284
shared_key thisisasharedkey
secure yes
cert_path /path/for/certificate/cert.pem
private_key_path /path/for/certificate/key.pem
private_key_passphrase secret_foo_bar_baz
</source>
fluent-plugin-secure-forward リポジトリー に fluent-plugin-secure-forward プラグインの設定方法に関する詳細の説明があります。
Fluentd から API サーバーへの接続数の削減
mux はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。テクノロジープレビューの機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行いフィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
mux は Secure Forward のリスナーサービスです。
| パラメーター | 説明 |
|---|---|
|
|
デフォルトは |
|
|
|
|
|
デフォルトは |
|
|
デフォルトは |
|
| 24284 |
|
| 500M |
|
| 2 Gi |
|
|
デフォルトは |
|
|
デフォルト値は空であり、外部の |
Fluentd でのログのスロットリング
とくに詳細なプロジェクトについては、管理者は処理される前の Fluentd によるログの読み取り速度を減速することができます。
スロットリングは設定されたプロジェクトのログ集計が遅れる一因になる可能性があります。Fluentd が追い付く前に Pod が削除された場合、ログエントリーが消失する可能性があります。
Systemd ジャーナルをログソースとして使用している場合、スロットリングは機能しません。スロットリングの実装は、各プロジェクトの個々のログファイルの読み取りを調整できる機能によって決まります。ジャーナルからの読み取り時に、単一のログソースしか存在せず、ログファイルが存在しないと、ファイルベースのスロットリングは利用できません。Fluentd プロセスに読み込まれるログエントリーを制限する方法はありません。
Fluentd に対して制限する必要があるプロジェクトを指示するには、デプロイメント後に ConfigMap のスロットル設定を編集します。
$ oc edit configmap/logging-fluentd
throttle-config.yaml キーの形式は、プロジェクト名と、各ノードでのログの読み取りに必要な速度が含まれる YAML ファイルです。デフォルトはノードごとに一度に 1000 行です。以下に例を示します。
- プロジェクト
project-name:
read_lines_limit: 50
second-project-name:
read_lines_limit: 100
- ロギング
logging:
read_lines_limit: 500
test-project:
read_lines_limit: 10
.operations:
read_lines_limit: 100
Fluentd に変更を加えるには、設定を変更し、Fluentd Pod を再起動して変更を適用します。Elasticsearch に変更を加えるには、まず Fluentd をスケールダウンしてから、Elasticsearch をゼロにスケールダウンする必要があります。変更を行った後、最初に Elasticsearch をスケーリングしてから、Fluentd を元の設定にスケーリングします。
Elasticsearch をゼロに調整するには、以下を実行します。
$ oc scale --replicas=0 dc/<ELASTICSEARCH_DC>
デーモンセット設定の nodeSelector がゼロに一致するように変更します。
Fluentd ノードセレクターを取得します。
$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector
nodeSelector:
logging-infra-fluentd: "true"
oc patch コマンドを使用して、deamonset の nodeSelector を変更します。
$ oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"nonexistlabel":"true"}}}}}'
Fluentd ノードセレクターを取得します。
$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector
nodeSelector:
"nonexistlabel: "true"
Elasticsearch のサイズをゼロから元に戻します。
$ oc scale --replicas=# dc/<ELASTICSEARCH_DC>
deamonset 設定の nodeSelector を変更して logging-infra-fluentd: "true" に戻します。
oc patch コマンドを使用して、deamonset の nodeSelector を変更します。
oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-infra-fluentd":"true"}}}}}'
Buffer Chunk Limit の調整
Fluentd ロガーが多数のログを処理できない場合、メモリーの使用量を減らし、データ損失を防ぐためにファイルバッファーリングに切り換える必要があります。
Fluentd buffer_chunk_limit は、デフォルト値が 8m の環境変数 BUFFER_SIZE_LIMIT によって決定されます。出力ごとのファイルのバッファーサイズは、デフォルト値が 256Mi の環境変数 FILE_BUFFER_LIMIT によって決定されます。永続的なボリュームサイズは、FILE_BUFFER_LIMIT に出力を乗算した結果よりも大きくなければなりません。
Fluentd および Mux Pod では、永続ボリューム /var/lib/fluentd は PVC または hostmount などによって作成される必要があります。その領域はファイルバッファーに使用されます。
buffer_type および buffer_path は、以下のように Fluentd 設定ファイルで設定されます。
$ egrep "buffer_type|buffer_path" *.conf
output-es-config.conf:
buffer_type file
buffer_path `/var/lib/fluentd/buffer-output-es-config`
output-es-ops-config.conf:
buffer_type file
buffer_path `/var/lib/fluentd/buffer-output-es-ops-config`
filter-pre-mux-client.conf:
buffer_type file
buffer_path `/var/lib/fluentd/buffer-mux-client`
Fluentd buffer_queue_limit は変数 BUFFER_QUEUE_LIMIT の値です。この値はデフォルトで 32 になります。
環境変数 BUFFER_QUEUE_LIMIT は (FILE_BUFFER_LIMIT / (number_of_outputs * BUFFER_SIZE_LIMIT)) として計算されます。
BUFFER_QUEUE_LIMIT 変数にデフォルトの値のセットが含まれる場合、以下のようになります。
-
FILE_BUFFER_LIMIT = 256Mi -
number_of_outputs = 1 -
BUFFER_SIZE_LIMIT = 8Mi
buffer_queue_limit の値は 32 になります。buffer_queue_limit を変更するには、FILE_BUFFER_LIMIT の値を変更する必要があります。
この数式では、number_of_outputs は、すべてのログが単一リソースに送信され、追加のリソースごとに 1 つずつ増分する場合に 1 になります。たとえば、number_of_outputs の値は以下のようになります。
-
1- すべてのログが単一の ElasticSearch Pod に送信される場合 -
2- アプリケーションログが ElasticSearch Pod に送信され、運用ログが別の ElasticSearch Pod に送信される場合 -
4- アプリケーションログが ElasticSearch Pod に送信され、運用ログが別の ElasticSearch Pod に送信される場合で、それらがどちらも他の Fluentd インスタンスに転送される場合