Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

36.5.2. Elasticsearch

Elasticsearch (ES): すべてのログが格納されるオブジェクトストア。

Elasticsearch はログデータを、インデックス と呼ばれる各データストアに編成します。Elasticsearch は各インデックスを シャード と呼ばれる複数の部分に分割し、クラスター内の Elasticsearch ノードセット全体に分散します。Elasticsearch を レプリカ というシャードのコピーを作成するように設定できます。Elasticsearch はレプリカを Elactisearch ノード全体に分散することもできます。シャードとレプリカの組み合わせは、冗長性および耐障害性を提供することを意図しています。たとえば、1 つのレプリカのあるインデックスの 3 つのシャードを設定する場合、Elasticsearch はそのインデックスの合計 6 つのシャード (3 つのプライマリーシャードとバックアップとしての 3 つのレプリカ) を生成します。

OpenShift Container Platform ロギングインストーラーは、独自のストレージボリュームを含む固有のデプロイメント設定を使用して各 Elasticsearch ノードがデプロイされるようにします。ロギングシステムに追加する各 Elasticsearch ノードについて 追加のデプロイメント設定を作成 できます。インストール時に、openshift_logging_es_cluster_size Ansible 変数を使用して Elasticsearch ノードの数を指定できます。

または、インベントリーファイルで openshift_logging_es_cluster_size を変更し、ロギング Playbook を再実行することで、既存クラスターを拡張することができます。追加のクラスターリングパラメーターは変更可能で、 ロギング Ansible 変数の指定 で説明されています。

以下に示すように、ストレージおよびネットワークの場所を選択する際の留意事項については、Elastic のドキュメント を参照してください。

注記

可用性の高い Elasticsearch 環境 には 3 つ以上の Elasticsearch ノードが必要であり、それぞれを異なるホストに配置する必要があります。 レプリカを作成するために、openshift_logging_es_number_of_replicas1 以上の値に設定します。

すべての Elasticsearch デプロイメントの表示

現在の Elasticsearch デプロイメントをすべて表示するには、以下を実行します。

$ oc get dc --selector logging-infra=elasticsearch

Elasticsearch での高可用性の設定

可用性の高い Elasticsearch 環境には 3 つ以上の Elasticsearch ノードが必要であり、それぞれを異なるホストに配置する必要があります。 レプリカを作成するために、openshift_logging_es_number_of_replicas Ansible 変数1 以上の値に設定します。

3 つの Elasticsearch ノードが含まれる OpenShift Container Platform クラスターについては、以下のシナリオを参照してください。

  • openshift_logging_es_number_of_replicas1 に設定すると、2 つのノードに、クラスター内の全 Elasticsearch データのコピーが含まれるようになります。これにより、Elasticsearch データを持つノードがダウンした場合に、別のノードにクラスター内のすべての Elasticsearch データのコピーがあります。
  • openshift_logging_es_number_of_replicas3 に設定すると、4 つのノードに、クラスター内の全 Elasticsearch データのコピーが含まれるようになります。これにより、Elasticsearch データを持つノードが 3 ゆダウンした場合に、1 つのノードにクラスター内のすべての Elasticsearch データのコピーが含まれるようになっています。

    このシナリオでは、複数の Elasticsearch ノードがダウンしているため、Elasticsearch のステータスは RED になり、新しい Elasticsearch シャードは割り当てられません。ただし、高可用性のために Elasticsearch データが失われることはありません。

高可用性とパフォーマンスの間にはトレードオフの関係があることに注意してください。たとえば、openshift_logging_es_number_of_replicas=2 および openshift_logging_es_number_of_shards=3 を設定すると、Elasticsearch が多くのリソースを使用してクラスター内のノード間でシャードデータを複製する必要あります。また、レプリカ数を増やすことにより、各ノードのデータストレージ要件を 2 倍または 3 倍に引き上げる必要があるため、Elasticsearch の 永続ストレージを計画する際に 考慮に入れる必要があります。

シャード数を設定する際の考慮事項

openshift_logging_es_number_of_shards パラメーターについては、以下を考慮してください。

  • パフォーマンスを上げるには、シャードの数を増やします。たとえば、3 つのノードで設定されるクラスターでは、openshift_logging_es_number_of_shards=3 を設定します。これにより、各インデックスは 3 つの部分 (シャード) に分割され、インデックスの処理による負荷は 3 つのノードすべてに分散されます。
  • 多数のプロジェクトがあり、クラスターに数千を超えるシャードがある場合にはパフォーマンスが低下する可能性があります。この場合は、シャードの数を減らすか、またはキュレーションの時間を減らします。
  • 少数の非常に大きなインデックスがある場合、openshift_logging_es_number_of_shards=3 以上を設定する必要がある場合があります。Elasticsearch では最大のシャードサイズを 50 GB 未満にすることを推奨しています。

ノードセレクター

Elasticsearch は大量のリソースを使用する可能性があるため、クラスターのすべてのメンバーでは、メンバー同士およびリモートストレージとのネットワーク接続の待機時間が低く設定する必要があります。待機時間を低く設定するには、ノードセレクター を使用してインスタンスを専用ノード、つまりクラスター内の専用領域に指定します。

ノードセレクターを設定するには、インベントリーファイルで openshift_logging_es_nodeselector 設定オプションを指定します。これはすべての Elasticsearch デプロイメントに適用されます。そのため、ノードセレクターを個別化する必要がある場合は、デプロイメント後に各デプロイメント設定を手動で編集する必要があります。ノードセレクターは Python と互換性のある dict (辞書) として指定されます。たとえば、{"node-type":"infra", "region":"east"} のようになります。

36.5.2.1. 永続的な Elasticsearch ストレージ

デフォルトで、openshift_logging Ansible ロールは、Pod のすべてのデータが再起動時に失われる一時デプロイメントを作成します。

実稼働環境の場合、それぞれの Elasticsearch デプロイメント設定には永続ストレージボリュームが必要です。既存の Persistent Volume Claim (永続ボリューム要求、PVC) を指定するか、または OpenShift Container Platform がこれを作成することを許可することができます。

  • 既存 PVC を使用する。デプロイメントに独自の PVC を作成する場合、OpenShift Container Platform はそれらの PVC を使用します。

    openshift_logging_es_pvc_prefix 設定に一致するように PVC の名前を指定します。この設定のデフォルトは logging-es です。各 PVC にシーケンス番号が追加された名前 (logging-es-0logging-es-1logging-es-2 など) を割り当てます。

  • OpenShift Container Platform による PVC の作成を許可する。Elsaticsearch の PVC が存在しない場合、OpenShift Container Platform は Ansible インベントリーファイル のパラメーターに基づいて PVC を作成します。

    パラメーター説明

    openshift_logging_es_pvc_size

    PVC 要求のサイズを指定します。

    openshift_logging_elasticsearch_storage_type

    ストレージタイプを pvc と指定します。

    注記

    これはオプションのパラメーターです。openshift_logging_es_pvc_size パラメーターを 0 よりも大きな値に設定する場合、ロギングインストーラーはこのパラメーターをデフォルトで pvc に自動的に設定します。

    openshift_logging_es_pvc_prefix

    オプションで、PVC のカスタム接頭辞を指定します。

    以下に例を示します。

    openshift_logging_elasticsearch_storage_type=pvc
    openshift_logging_es_pvc_size=104802308Ki
    openshift_logging_es_pvc_prefix=es-logging

動的にプロビジョニングされた PV を使用している場合、OpenShift Container Platform ロギングインストーラーはデフォルトのストレージクラスを使用する PVC、または openshift_logging_elasticsearch_pvc_storage_class_name パラメーターで指定された PVC を作成します。

NFS ストレージを使用する場合、OpenShift Container Platform インストーラーは openshift_logging_storage_* パラメーターに基づいて永続ボリュームを作成し、OpenShift Container Platform ロギングインストーラーopenshift_logging_es_pvc_* パラメーターを使用して PVC を作成します。EFK で永続ボリュームを使用できるように正しいパラメーターを指定してください。また、ロギングインストーラーはコアインフラストラクチャーで NFS のインストールをデフォルトでブロックするため、Ansible インベントリーファイルで openshift_enable_unsupported_configurations=true パラメーターを設定してください。

警告

NFS ストレージをボリュームまたは永続ボリュームとして使用したり、 Gluster などの NAS を使用したりすることは Elasticsearch ストレージではサポートされません。Lucene が NFS が指定しないファイルシステムの動作に依存するためです。 データの破損およびその他の問題が発生する可能性があります。

お使いの環境で NFS ストレージが必要な場合は、以下の方法のいずれかを使用します。

36.5.2.1.1. 永続ボリュームとしての NFS の使用

NFS を 自動的にプロビジョニングされた永続ボリューム として、または 事前に定義された NFS ボリュームを使用して デプロイできます。

詳細は、2 つの Persistent Volume Claim (永続ボリューム要求) 間での NFS マウントの共有 を参照して、2 つの別個のコンテナーで使用されるシャードストレージを利用します。

自動的にプロビジョニングされた NFS の使用

NFS が自動的にプロビジョニングされる永続ボリュームとして使用するには、以下を実行します。

  1. 以下の行を Ansible インベントリーファイルに追加して、NFS の自動プロビジョニングされるストレージクラスを作成し、バッキングストレージを動的にプロビジョニングします。

    openshift_logging_es_pvc_storage_class_name=$nfsclass
    openshift_logging_es_pvc_dynamic=true
  2. 以下のコマンドを使用して、ロギング Playbook を使用した NFS ボリュームのデプロイを実行します。

    ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
  3. 以下の手順を実行して PVC を作成します。

    1. Ansible インベントリーファイルを編集して PVC サイズを設定します。

      openshift_logging_es_pvc_size=50Gi
      注記

      ロギング Playbook はサイズに基づいてボリュームを選択し、その他の永続ボリュームのサイズが同じ場合に予想しないボリュームを使用する可能性があります。

    2. 以下のコマンドを使用して Ansible deploy_cluster.yml Playbook を返します。

      ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml

      インストーラー Playbook は、openshift_logging_storage 変数に基づいて NFS ボリュームを作成します。

事前に定義された NFS ボリュームの使用

既存の NFS ボリュームを使用して、OpenShift Container Platform クラスターと共にロギングをデプロイするには、以下を実行します。

  1. Ansible インベントリーファイルを編集して、NFS ボリュームを設定し、PVC サイズを設定します。

    openshift_logging_storage_kind=nfs
    openshift_logging_storage_access_modes=['ReadWriteOnce']
    openshift_logging_storage_nfs_directory=/share 1
    openshift_logging_storage_nfs_options='*(rw,root_squash)' 2
    openshift_logging_storage_labels={'storage': 'logging'}
    openshift_logging_elasticsearch_storage_type=pvc
    openshift_logging_es_pvc_size=10Gi
    openshift_logging_es_pvc_storage_class_name=''
    openshift_logging_es_pvc_dynamic=true
    openshift_logging_es_pvc_prefix=logging
    1 2
    これらのパラメーターは、/usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml インストール Playbook でのみ動作します。このパラメーターは /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml Playbook では機能しません。
  2. 以下のコマンドを使用して、EFK スタックを再デプロイします。

    ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
36.5.2.1.2. NFS のローカルストレージとしての使用

NFS サーバーに大規模なファイルを割り当て、ファイルをノードにマウントすることができます。次に、ファイルをホストパスデバイスとして使用できます。

$ mount -F nfs nfserver:/nfs/storage/elasticsearch-1 /usr/local/es-storage
$ chown 1000:1000 /usr/local/es-storage

次に、以下で説明するように /usr/local/es-storage をホストマウントとして使用します。異なるバッキングファイルをそれぞれの Elasticsearch ノードのストレージとして使用します。

このループバックはノード上で、OpenShift Container Platform の外部から手動で保守する必要があります。コンテナー内から保守することはできません。

各ノードホスト上のローカルディスクボリューム (利用可能な場合) を Elasticsearch レプリカのストレージとして使用することができます。これを実行するには、以下のような準備が必要です。

  1. 関連するサービスアカウントに、ローカルボリュームをマウントし、編集する権限を指定する必要があります。

      $ oc adm policy add-scc-to-user privileged  \
             system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
    注記

    以前のバージョンの OpenShift Container Platform からアップグレードする場合、クラスターロギングは logging プロジェクトにインストールされている可能性があります。サービスアカウントを随時調整する必要があります。

  2. それぞれの Elasticsearch ノード定義には、権限を要求できるようにパッチが適用されている必要があります。以下は例になります。

    $ for dc in $(oc get deploymentconfig --selector component=es -o name); do
        oc scale $dc --replicas=0
        oc patch $dc \
           -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}'
      done
  3. Elasticsearch レプリカは、ローカルストレージを使用するために適切なノード上に配置する必要があります。また、適切なノードが一定期間ダウンしている場合であっても、移動させてはなりません。この場合、各 Elasticsearch レプリカに対し、管理者がストレージを割り当てたノードに固有のノードセレクターを指定する必要があります。 ノードセレクターを設定するには、各 Elasticsearch デプロイメント設定を編集し、nodeSelector セクションを追加または編集して、必要な各ノードに対して適用した一意のラベルを指定します。
apiVersion: v1
kind: DeploymentConfig
spec:
  template:
    spec:
      nodeSelector:
        logging-es-node: "1" 1
1
このラベルは、該当するラベルを持つ単一ノードのレプリカを一意に特定できるものである必要があります。 この場合は、logging-es-node=1 になります。
  1. それぞれの必要なノードのノードセレクターを作成します。
  2. oc label コマンドを使用して、必要な分のノードにラベルを適用します。

たとえば、デプロイメントに 3 つのインフラストラクチャーノードが含まれる場合、以下のようにそれらのノードのラベルを追加できます。

$ oc label node <nodename1> logging-es-node=0
$ oc label node <nodename2> logging-es-node=1
$ oc label node <nodename3> logging-es-node=2

ラベルのノードへの追加に関する情報については、ノードのラベルの更新 を参照してください。

代わりに oc patch コマンドを使用して、ノードセレクターの適用を自動化することもできます。

$ oc patch dc/logging-es-<suffix> \
   -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"0"}}}}}'

これらの手順を実行したら、ローカルホストマウントを各レプリカに適用できます。以下の例では、ストレージが各ノードの同じパスにマウントされていることを前提とします。

$ for dc in $(oc get deploymentconfig --selector component=es -o name); do
    oc set volume $dc \
          --add --overwrite --name=elasticsearch-storage \
          --type=hostPath --path=/usr/local/es-storage
    oc rollout latest $dc
    oc scale $dc --replicas=1
  done
36.5.2.1.3. Elasticsearch の hostPath ストレージの設定

Elasticsearch の hostPath ストレージを使用して OpenShift Container Platform クラスターをプロビジョニングできます。

各ノードホストでローカルディスクボリュームを Elasticsearch レプリカのストレージとして使用するには、以下を実行します。

  1. ローカル Elasticsearch ストレージのローカルマウントポイントを各インフラストラクチャーノードに作成します。

    $ mkdir /usr/local/es-storage
  2. ファイルシステムを Elasticsearch ボリュームに作成します。

    $ mkfs.ext4 /dev/xxx
  3. elasticsearch ボリュームをマウントします。

    $ mount /dev/xxx /usr/local/es-storage
  4. 以下の行を /etc/fstab に追加します。

    $ /dev/xxx /usr/local/es-storage ext4
  5. マウントポイントの所有権を変更します。

    $ chown 1000:1000 /usr/local/es-storage
  6. ローカルボリュームをマウントし、編集する権限を関連するサービスアカウントに付与します。

      $ oc adm policy add-scc-to-user privileged  \
             system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
    注記

    以前のバージョンの OpenShift Container Platform からアップグレードする場合、クラスターロギングは logging プロジェクトにインストールされている可能性があります。サービスアカウントを随時調整する必要があります。

  7. 該当する権限を要求するには、例に示すように Ops クラスターの --selector component=es-ops を指定する各 Elasticsearch レプリカ定義にパッチを適用します。

      $ for dc in $(oc get deploymentconfig --selector component=es -o name);
    do
        oc scale $dc --replicas=0
        oc patch $dc \
           -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged":
    true}}]}}}}'
    done
  8. 適切なノードの Elasticsearch レプリカを見つけ、ローカルストレージを使用します。それらのノードが一定期間停止する場合でも、レプリカを移動することはできません。 ノードの場所を指定するには、それぞれの Elasticsearch レプリカに対し、管理者がストレージを割り当てたノードに固有のノードセレクターを指定します。

    ノードセレクターを設定するには、各 Elasticsearch デプロイメント設定を編集し、nodeSelector セクションを追加または編集して、必要なそれぞれのノードに適用した一意のラベルを指定します。

    apiVersion: v1
    kind: DeploymentConfig
    spec:
      template:
        spec:
          nodeSelector:
            logging-es-node: "1"

    このラベルは、該当するラベルを持つ単一ノードのレプリカを一意に特定できるものである必要があります。 この場合は、logging-es-node=1 になります。

  9. それぞれの必要なノードのノードセレクターを作成します。oc label コマンドを使用して、必要な分のノードにラベルを適用します。

    たとえば、デプロイメントに 3 つのインフラストラクチャーノードが含まれる場合、以下のようにそれらのノードのラベルを追加できます。

      $ oc label node <nodename1> logging-es-node=0
      $ oc label node <nodename2> logging-es-node=1
      $ oc label node <nodename3> logging-es-node=2

    ノードセレクターの適用を自動化するには、以下のように oc label コマンドではなく、oc patch コマンドを使用します。

      $ oc patch dc/logging-es-<suffix> \
         -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"1"}}}}}'
  10. これらの手順を実行したら、ローカルホストマウントを各レプリカに適用できます。以下の例では、ストレージが各ノードの同じパスにマウントされていることを前提とし、Ops クラスターに --selector component=es-ops を指定します。

    $ for dc in $(oc get deploymentconfig --selector component=es -o name);
    do
        oc set volume $dc \
              --add --overwrite --name=elasticsearch-storage \
              --type=hostPath --path=/usr/local/es-storage
        oc rollout latest $dc
        oc scale $dc --replicas=1
    done
36.5.2.1.4. Elasticsearch のスケールの変更

クラスター内の Elasticsearch ノード数を増やす必要がある場合は、追加する必要のある各 Elasticsearch ノードについてデプロイメント設定を作成することができます。

永続ボリュームの性質上、また Elasticsearch がデータを保存し、クラスターを復元する方法により、Elasticsearch デプロイメント設定でノードを単純に増やすことはできません。

Elasticsearch のスケールを変更する最も簡単な方法は、前述のようにインベントリーホストファイルを変更し、ロギング Playbook を再実行することです。デプロイメント用の永続ストレージを指定していると仮定すると、この方法によって混乱が生じることはないはずです。

注記

openshift_logging_es_cluster_size の値が、クラスターにある現在の Elasticsearch のノード数 (スケールアップした後) より多い場合のみ、ロギング Playbook を使用して Elasticsearch クラスターのサイズを調節できます。

36.5.2.1.5. Elasticsearch レプリカ数の変更

Elasticsearch レプリカ数は、インベントリーホストファイルの openshift_logging_es_number_of_replicas 値を編集し、前述のようにロギング Playbook を再実行して変更できます。

変更は新規インデックスにのみ適用されます。既存のインデックスは、継続して以前のレプリカ数を使用します。たとえば、インデックスの数を 3 から 2 に変更すると、クラスターは、新規インデックスにはレプリカ数 2 を、既存のインデックスには 3 を使用します。

以下のコマンドを実行して、既存のインデックスのレプリカ数を変更できます。

$ oc exec -c elasticsearch $pod -- es_util --query=project.* -d '{"index":{"number_of_replicas":"2"}}' 1
1
既存のインデックスに使用するレプリカ数を指定します。
36.5.2.1.6. Elasticsearch のルートとしての公開

デフォルトでは、OpenShift の集計ロギングでデプロイされた Elasticsearch はロギングクラスターの外部からアクセスできません。データにアクセスする必要があるツールに対しては、Elasticsearch への外部アクセスのルートを有効にすることができます。

OpenShift トークンを使用して Elasticsearch にアクセスできます。 また、サーバー証明書を作成する際に (Kibana と同様に)、外部の Elasticsearch および Elasticsearch Ops ホスト名を指定することができます。

  1. re-encrypt ルートとして Elasticsearch にアクセスするには、以下の変数を定義します。

    openshift_logging_es_allow_external=True
    openshift_logging_es_hostname=elasticsearch.example.com
  2. Playbook ディレクトリーに切り替え、以下の Ansible Playbook を実行します。

    $ cd /usr/share/ansible/openshift-ansible
    $ ansible-playbook [-i </path/to/inventory>] \
        playbooks/openshift-logging/config.yml
  3. Elasticsearch にリモートでログインするには、要求に 3 つの HTTP ヘッダーが含まれている必要があります。

    Authorization: Bearer $token
    X-Proxy-Remote-User: $username
    X-Forwarded-For: $ip_address
  4. ログにアクセスできるようになるには、プロジェクトへのアクセスが必要です。以下に例を示します。

    $ oc login <user1>
    $ oc new-project <user1project>
    $ oc new-app <httpd-example>
  5. 要求内で使用するこの ServiceAccount のトークンを取得する必要があります。

    $ token=$(oc whoami -t)
  6. 以前に設定したトークンを使用して、公開ルート経由で Elasticsearch にアクセスできる必要があります。

    $ curl -k -H "Authorization: Bearer $token" -H "X-Proxy-Remote-User: $(oc whoami)" -H "X-Forwarded-For: 127.0.0.1" https://es.example.test/project.my-project.*/_search?q=level:err | python -mjson.tool