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> -- logs
oc exec <pod> -- logs
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Fluentd Pod の名前を指定します。
logs
の前にスペースがあることに注意してください。
以下に例を示します。
oc exec logging-fluentd-lmvms -- logs
oc exec logging-fluentd-lmvms -- logs
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ログファイルの内容は、最も古いログから順番に印刷されます。
-f
オプションを使用して、ログに書き込まれている内容をフォローします。LOGGING_FILE_PATH=console
を使用している場合、Fluentd はログをデフォルトの場所/var/log/fluentd/fluentd.log
に書き込みます。oc logs -f <pod_name>
コマンドでログを取得できます。以下に例を示します。
oc logs -f fluentd.log
oc logs -f fluentd.log
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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>
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
$ 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.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"
$ 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
$ 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=false
oc set env ds/logging-fluentd MERGE_JSON_LOG=false
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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>
セクションを追加 する場合、それらのレコードを随時処理することができます。
以下に例を示します。
このセクションではエラーレコードを 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
$ docker info | grep -i log
以下のいずれかの出力が表示されます。
Logging Driver: json-file
Logging Driver: json-file
Logging Driver: journald
Logging Driver: journald
複数行の Docker ログ処理をオンにするには、以下を実行します。
以下のコマンドを使用して、複数行の Docker ログを有効にします。
json-file
ログドライバーの場合:oc set env daemonset/logging-fluentd USE_MULTILINE_JSON=true
oc set env daemonset/logging-fluentd USE_MULTILINE_JSON=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow journald
ログドライバーの場合:oc set env daemonset/logging-fluentd USE_MULTILINE_JOURNAL=true
oc set env daemonset/logging-fluentd USE_MULTILINE_JOURNAL=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
クラスターの Fluentd Pod が再起動します。
外部ログアグリゲーターにログを送信するための Fluentd の設定
secure-forward
プラグインを使用して、デフォルトの Elasticsearch に加えてログのコピーを外部ログアグリゲーターに送信するように Fluentd を設定できます。ローカルにホストされている Fluentd による処理の後に、ログレコードをさらに処理することができます。
クライアント証明書を使用して secure_foward
プラグインを設定することはできません。認証は SSL/TLS プロトコルを介して実行できますが、shared_key
と宛先 Fluentd
を secure_foward
入力プラグインで設定する必要があります。
ロギングデプロイメントでは、外部ログアグリゲーターを設定するために、Fluentd configmap で secure-forward.conf
セクションを指定します。
oc edit
コマンドを使用して更新できます。
oc edit configmap/logging-fluentd
$ 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)'}]"
$ 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
プラグインがインストールされていて、それによって提供される入力プラグインを使用する必要があります。
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
$ oc edit configmap/logging-fluentd
throttle-config.yaml キーの形式は、プロジェクト名と、各ノードでのログの読み取りに必要な速度が含まれる YAML ファイルです。デフォルトはノードごとに一度に 1000 行です。以下に例を示します。
- プロジェクト
project-name: read_lines_limit: 50 second-project-name: read_lines_limit: 100
project-name:
read_lines_limit: 50
second-project-name:
read_lines_limit: 100
- ロギング
Fluentd に変更を加えるには、設定を変更し、Fluentd Pod を再起動して変更を適用します。Elasticsearch に変更を加えるには、まず Fluentd をスケールダウンしてから、Elasticsearch をゼロにスケールダウンする必要があります。変更を行った後、最初に Elasticsearch をスケーリングしてから、Fluentd を元の設定にスケーリングします。
Elasticsearch をゼロに調整するには、以下を実行します。
oc scale --replicas=0 dc/<ELASTICSEARCH_DC>
$ oc scale --replicas=0 dc/<ELASTICSEARCH_DC>
デーモンセット設定の nodeSelector がゼロに一致するように変更します。
Fluentd ノードセレクターを取得します。
oc get ds logging-fluentd -o yaml |grep -A 1 Selector
$ 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"}}}}}'
$ oc patch ds logging-fluentd -p '{"spec":{"template":{"spec":{"nodeSelector":{"nonexistlabel":"true"}}}}}'
Fluentd ノードセレクターを取得します。
oc get ds logging-fluentd -o yaml |grep -A 1 Selector
$ oc get ds logging-fluentd -o yaml |grep -A 1 Selector
nodeSelector:
"nonexistlabel: "true"
Elasticsearch のサイズをゼロから元に戻します。
oc scale --replicas=# dc/<ELASTICSEARCH_DC>
$ 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"}}}}}'
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 設定ファイルで設定されます。
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 インスタンスに転送される場合