Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

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 1
    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 1
LOGGING_FILE_PATH=<path-to-log/fluentd.log> 2
1
ログの出力を Fluentd のデフォルトの場所に送信します。oc logs -f <pod_name> コマンドでログを取得します。
2
ログ出力を指定されたファイルに送信します。oc exec <pod_name> — logs コマンドでログを取得します。

これらのパラメーターを変更した後に、ロギングインストーラー 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 が保持する名前変更されたファイルの数を制御することができます。

表36.1 Fluentd ログローテーションを設定するためのパラメーター

パラメーター説明

LOGGING_FILE_SIZE

単一の Fluentd ログファイルの最大サイズ (バイト単位)。flientd.log ファイルのサイズがこの値を超える場合、OpenShift Container Platform は fluentd.log.* ファイルの名前を変更し、新規の fluentd.log を作成します。デフォルトは 1024000 (1MB) です。

LOGGING_FILE_AGE

Fluentd が削除する前に保持するログ数。デフォルト値は 10 です。

以下に例を示します。

$ 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 解析を無効にするには、以下を実行します。

  1. 次のコマンドを実行します。

    oc set env ds/logging-fluentd MERGE_JSON_LOG=false 1
    1
    これを false に設定してこの機能を無効にするか、または true に設定してこの機能を有効にします。

    Ansible の実行時にこの設定が適用されるようにするには、Ansible インベントリーに openshift_logging_fluentd_merge_json_log="false" を追加します。

ログコレクターによってログを正規化する方法の設定

クラスターロギングは、データベーススキーマなどの特定のデータモデルを使用して、ログレコードとそのメタデータをロギングストアに格納します。このデータについてはいくつかの制限があります。

  • 実際のログメッセージが含まれる "message" フィールドがなければなりません。
  • RFC 3339 形式のログレコードのタイムスタンプを含む "@timestamp" フィールドがなければなりません (ミリ秒以上の単位の使用が望ましい)。
  • errinfounknown などのログレベルが含まれる "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 パラメーターで定義されるデフォルトの最上位のフィールドは次のとおりです: CEEtime@timestampaushapeci_jobcollectddockerfedora-cifileforemangeoiphostnameipaddr4ipaddr6kuberneteslevelmessagenamespace_namenamespace_uuidoffsetopenstackovirtpidpipeline_metadataservicesystemdtagstestcasetlogviaq_msg_id

    ${CDM_DEFAULT_KEEP_FIELDS} または ${CDM_EXTRA_KEEP_FIELDS} に含まれないフィールドはすべて、CDM_USE_UNDEFINEDtrue の場合、${CDM_UNDEFINED_NAME} に移動されます。これらのパラメーターの詳細は、以下の表を参照してください。

    注記

    CDM_DEFAULT_KEEP_FIELDS パラメーターは、上級ユーザーのみが使用するか、Red Hat サポートによって使用することが指示された場合に使用されることが想定されます。

  • 空のフィールド。空のフィールドにはデータがありません。ログから、空のままにするフィールドを判別できます。

表36.2 ログの正規化に使用する環境パラメーター

パラメーター定義

CDM_EXTRA_KEEP_FIELDS

CDM_DEFAULT_KEEP_FIELDS に加えて、ログの最上位に保持する定義されたフィールドの追加セットを指定します。デフォルトは "" です。

CDM_EXTRA_KEEP_FIELDS="broker"

CDM_KEEP_EMPTY_FIELDS

空の場合でも CSV 形式で保持するフィールドを指定します。空の定義されたフィールドで指定されないものはドロップされます。デフォルトは message で、空のメッセージを維持します。

CDM_KEEP_EMPTY_FIELDS="message"

CDM_USE_UNDEFINED

未定義のフィールドを undefined の最上位フィールドに移動するには、true に設定します。デフォルトは false です。true の場合、CDM_DEFAULT_KEEP_FIELDS および CDM_EXTRA_KEEP_FIELDS の値は undefined に移動されません。

CDM_USE_UNDEFINED=true

CDM_UNDEFINED_NAME

CDM_USE_UNDEFINED を使用する場合は、未定義の最上位フィールドの名前を指定します。デフォルトは `undefined` です。CDM_USE_UNDEFINEDtrue の場合にのみ有効にされます。

CDM_UNDEFINED_NAME="undef"

CDM_UNDEFINED_MAX_NUM_FIELDS

未定義フィールドの数がこの数を超える場合、未定義のフィールドはすべて JSON 文字列表現に変換され、CDM_UNDEFINED_NAME フィールドに保存されます。レコードに未定義フィールド値を超える数が含まれる場合、これらのフィールドでの処理はこれ以上実行されません。代わりに、フィールドは最上位の CDM_UNDEFINED_NAME フィールドに保存された単一文字列の JSON 値に変換されます。デフォルトの -1 を維持することで、未定義フィールドの無制限の値が許可されますが、これは推奨されません。

注: このパラメーターは、CDM_USE_UNDEFINED が false の場合でも有効です。

CDM_UNDEFINED_MAX_NUM_FIELDS=4

CDM_UNDEFINED_TO_STRING

未定義フィールドをすべて JSON 文字列表現に変換するには、true に設定します。デフォルトは false です。

CDM_UNDEFINED_TO_STRING=true

CDM_UNDEFINED_DOT_REPLACE_CHAR

未定義フィールドでドット文字 '.' の代わりに使用する文字を指定します。MERGE_JSON_LOGtrue である必要があります。デフォルトは UNUSED です。MERGE_JSON_LOG パラメーターを true に設定した場合は、以下の注を参照してください。

CDM_UNDEFINED_DOT_REPLACE_CHAR="_"

注記

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 を編集します。

  1. 必要に応じてフィールドの処理方法を設定します。

    1. CDM_EXTRA_KEEP_FIELDS を使用して移動するフィールドを指定します。
    2. CSV 形式で CDM_KEEP_EMPTY_FIELDS パラメーターで保持する空のフィールドをすべて指定します。
  2. 必要に応じて未定義フィールドの処理方法を設定します。

    1. CDM_USE_UNDEFINEDtrue に設定し、未定義のフィールドを最上位の undefined フィールドに移動します。
    2. CDM_UNDEFINED_NAME パラメーターを使用して、未定義フィールドの名前を指定します。
    3. CDM_UNDEFINED_MAX_NUM_FIELDS をデフォルトの -1 以外の値に設定し、単一レコードにおける未定義フィールド数の上限を設定します。
  3. CDM_UNDEFINED_DOT_REPLACE_CHAR を指定して、未定義フィールド名のすべてのドット (.) 文字を別の文字に変更します。たとえば、CDM_UNDEFINED_DOT_REPLACE_CHAR=@@@ の場合で、foo.bar.baz という名前のフィールドがある場合、そのフィールドは foo@@@bar@@@baz に変換されます。
  4. UNDEFINED_TO_STRINGtrue に設定し、未定義フィールドを 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_STRINGfalse であるか、または 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

json-file ログドライバーを使用する時にマルチライン Docker ログを処理するには true に設定します。このパラメーターは、デフォルトで false に設定されます。

USE_MULTILINE_JOURNAL

journald ログドライバーを使用する時にマルチライン Docker ログを処理するには true に設定します。Fluentd は docker ログの一部フラグメントからログレコード全体を再構築します。このパラメーターは、デフォルトで false に設定されます。

以下のコマンドで、使用されているログドライバーを確認できます。

$ docker info | grep -i log

以下のいずれかの出力が表示されます。

Logging Driver: json-file
Logging Driver: journald

複数行の Docker ログ処理をオンにするには、以下を実行します。

  1. 以下のコマンドを使用して、複数行の Docker ログを有効にします。

    • json-file ログドライバーの場合:

      oc set env daemonset/logging-fluentd USE_MULTILINE_JSON=true
    • journald ログドライバーの場合:

      oc set env daemonset/logging-fluentd USE_MULTILINE_JOURNAL=true

    クラスターの Fluentd Pod が再起動します。

外部ログアグリゲーターにログを送信するための Fluentd の設定

secure-forward プラグインを使用して、デフォルトの Elasticsearch に加えてログのコピーを外部ログアグリゲーターに送信するように Fluentd を設定できます。ローカルにホストされている Fluentd による処理の後に、ログレコードをさらに処理することができます。

重要

クライアント証明書を使用して secure_foward プラグインを設定することはできません。認証は SSL/TLS プロトコルを介して実行できますが、shared_key と宛先 Fluentdsecure_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_certyour_private_key の値は configmap/logging-fluentdsecure-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 のリスナーサービスです。

パラメーター説明

openshift_logging_use_mux

デフォルトは False に設定されています。True に設定されている場合は、mux というサービスがデプロイされます。このサービスは、クラスターで実行されるノードエージェント Fluentd deamonset の Fluentd secure_forward アグリゲーターとして機能します。openshift_logging_use_mux を使用して OpenShift API サーバーへの接続数を減らし、生ログを mux に送信して Kubernetes メタデータプラグインをオフにするように Fluentd の各ノードを設定します。これには、openshift_logging_mux_client_mode を使用する必要があります。

openshift_logging_mux_client_mode

openshift_logging_mux_client_mode の値は minimalmaximal で、デフォルトはありません。openshift_logging_mux_client_mode により、Fluentd ノードエージェントが Elasticsearch に直接ではなく mux にログを送信します。maximal の値 は、Fluentd がレコードを mux に送信する前にできるだけ多くの処理をノードで実行することを意味しています。maximal 値は mux を使用する場合に推奨されます。minimal の値は、Fluentd がまったく処理を行わないことを意味しており、処理用に生ログを mux に送信します。minimal 値の使用は推奨されません。

openshift_logging_mux_allow_external

デフォルトは False に設定されています。True に設定されている場合は、mux サービスがデプロイされ、クラスターの外部で実行されている Fluentd クライアントが secure_forward を使用してログを送信できるように設定されます。これにより、OpenShift ロギングを OpenShift 以外のクライアント、または他の OpenShift クラスターの中央ロギングサービスとして使用することができます。

openshift_logging_mux_hostname

デフォルトは muxopenshift_master_default_subdomain を追加した値です。これは、external_clientsmux に接続するために使用するホスト名であり、TLS サーバーの証明書サブジェクトで使用されます。

openshift_logging_mux_port

24284

openshift_logging_mux_cpu_limit

500M

openshift_logging_mux_memory_limit

2 Gi

openshift_logging_mux_default_namespaces

デフォルトは mux-undefined です。一覧の最初の値は未定義のプロジェクトに使用する namespace であり、これにデフォルトで作成する追加の namespace が続きます。通常、この値を設定する必要はありません。

openshift_logging_mux_namespaces

デフォルト値は空であり、外部の mux クライアント向けに追加の namespace を作成し、ログと関連付けることができます。この値を設定する必要があります。

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 インスタンスに転送される場合