コンテンツにスキップ

OpenSearch 高可用性デプロイ

概要

OpenSearch は、Elasticsearch OSS 7.10.2 をベースにしたオープンソースの分散検索・分析スイートです。インタラクティブなログ分析、リアルタイムアプリケーションモニタリング、データ分析などの基本機能を容易に提供します。

ノードタイプ 説明 本番環境のベストプラクティス
Cluster manager クラスター全体の操作を管理し、クラスターの状態を追跡します。これには、インデックスの作成と削除、クラスターに参加・離脱するノードの追跡、各ノードのヘルスチェック(pingリクエストの実行による)、ノードへのシャード割り当てが含まれます。 3つの異なるアベイラビリティゾーンに3つの専用クラスターマネージャーノードを配置することが、ほぼすべての本番ユースケースにおける正しい方法です。この構成により、クラスターがクォーラムを失うことはありません。ほとんどの場合、2つのノードはアイドル状態ですが、いずれかのノードに障害が発生した場合やメンテナンスが必要な場合に備えています。
Cluster manager eligible 選挙プロセスを通じて、そのうちの1つのノードがクラスターマネージャーノードとして選択されます。 本番クラスターでは、専用のクラスターマネージャーノードを用意してください。専用ノードタイプを実現する方法は、他のすべてのノードタイプを false に設定することです。この場合、他のすべてのノードをクラスターマネージャー対象外としてマークする必要があります。
Data データを保存および検索します。ローカルシャード上でデータに関連するすべての操作(インデキシング、検索、集計)を実行します。これらはクラスターのワーカーノードであり、他のノードタイプよりも多くのディスク容量を必要とします。 データノードを追加する際は、アベイラビリティゾーン間でバランスを保ってください。例えば、3つのパーティションがある場合、データノードは3の倍数で追加し、各パーティションに1つずつ配置します。ストレージとRAMが大きいノードを使用することを推奨します。
Ingest データをクラスターに保存する前に前処理を行います。インジェストパイプラインを実行し、インデックスに追加する前にデータを変換します。 大量のデータを取り込み、複雑なインジェストパイプラインを実行する予定がある場合は、専用のインジェストノードを使用することを推奨します。また、データノードからインデキシングをオフロードして、データノードを検索と集計に特化させることも選択できます。
Coordinating クライアントリクエストをデータノード上のシャードに委任し、結果を収集して集約し、最終結果をクライアントに返します。 一対の専用コーディネーティングノードを用意することで、検索負荷の高いワークロードにおけるボトルネックを防ぐことができます。可能な限り多くのコアを搭載したCPUを推奨します。
Dynamic 特定のノードを機械学習(ML)タスクなどのカスタムワークに委任することで、データノードからのリソース消費を防ぎ、OpenSearchの機能に影響を与えません。

前提条件

  • Kubernetes クラスターがデプロイされていること
  • ストレージコンポーネントの決定(環境に応じて)
  • パブリッククラウドストレージブロックコンポーネント(パブリッククラウド)
  • OpenEBS ストレージプラグイン

リソース一覧

ホスト名 IPアドレス ロール K8s設定 データストレージ
k8s-master 192.168.100.101 k8s,master 4 CPU, 16G MEM, 100G DISK
K8s-node01 192.168.100.102 k8s,node01 4 CPU, 16G MEM, 100G DISK
K8s-node02 192.168.100.103 k8s,node02 4 CPU, 16G MEM, 100G DISK
K8s-node03 192.168.100.104 k8s,node03 4 CPU, 16G MEM, 100G DISK
K8s-node04 192.168.100.105 openes, master, client 4 CPU, 16G MEM, 100G DISK /data:200G
K8s-node05 192.168.100.106 openes, master, client 4 CPU, 16G MEM, 100G DISK /data:200G
K8s-node06 192.168.100.107 openes, master, client 4 CPU, 16G MEM, 100G DISK /data:200G
K8s-node07 192.168.100.108 openes, data 8CPU, 32G MEM, 100G DISK /data:1T
K8s-node08 192.168.100.109 openes, data 8CPU, 32G MEM, 100G DISK /data:1T
K8s-node09 192.168.100.110 openes, data 8CPU, 32G MEM, 100G DISK /data:1T

デフォルト設定

OpenSearch URL opensearch-cluster-client.middleware
OpenSearch ポート番号 9200
OpenSearch アカウント openes/kJMerxk3PwqQ
master JVM サイズ 2G
client JVM サイズ 4G
data JVM サイズ 20G

デプロイアーキテクチャ図

インストール準備

OpenSearch はリソースを多く消費し、クラスターリソースを専有する必要があるため、事前にクラスターのスケジューリングを設定する必要があります。

クラスターラベル設定

以下のコマンドを実行してクラスターをラベル付けします。

kubectl label node 192.168.100.105 192.168.100.106  192.168.100.107 openes=master-client
kubectl label node 192.168.100.108 192.168.100.109 192.168.100.110  openes=data

ラベルの確認:

kubectl get nodes --show-labels  | grep 'openes'

クラスターTaint設定

以下のコマンドを実行してクラスターにTaintを設定します。

kubectl taint node 192.168.100.105 192.168.100.106  192.168.100.107 192.168.100.108 192.168.100.109 192.168.100.110 app=openes:NoExecute

OpenEBS StorageClass の設定

パブリッククラウドを使用する場合は、パブリッククラウドのストレージブロックコンポーネントを参照してください。

以下のYAML設定をデプロイします。

apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:
  annotations:
    cas.openebs.io/config: |
      - name: StorageType
        value: "hostpath"
      - name: BasePath
        value: "/data/opensearch"
  name: openebs-opensearch
provisioner: openebs.io/local
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

/data ディレクトリのディスク容量が十分であることを確認してください。

インストール

設定の変更

インフラ関連のチャートは /etc/kubeasz/guance/infrastructure/charts ディレクトリにあります。このディレクトリに移動して操作します。

$ cd /etc/kubeasz/guance/infrastructure/charts
$ ls
localpv-provisioner-3.3.0.tgz  opensearch-cluster-0.0.1.tgz  tdengine-0.4.0.tgz

チャートからデフォルト設定を展開し、カスタマイズします。

$ tar -zxvf opensearch-cluster-0.0.1.tgz opensearch-cluster/values.yaml

opensearch-cluster ディレクトリ内の values.yaml を編集します。各ノードタイプの opensearchJavaOptsnodeSelectortolerationsstorageClass パラメータに注意してください。 resourcesopensearchJavaOpts は実際の環境に応じて設定します。Kubernetes が割り当てるメモリは JVM ヒープメモリを下回らないようにしてください。replicas は奇数が推奨で、クラスターのスプリットブレインを防ぎます。

opensearch-master:
...
  replicas: 3
  # sysctlInit:
  #   enabled: true
  opensearchJavaOpts: "-Xmx2g -Xms2g" 
  nodeSelector:
    openes: master-client
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes  
  persistence:
    ...
    storageClass: openebs-opensearch

opensearch-client:
...
  replicas: 3
  # sysctlInit:
  #   enabled: true
  opensearchJavaOpts: "-Xmx2g -Xms2g" 
  nodeSelector:
    openes: master-client
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes  
  persistence:
    ...
    storageClass: openebs-opensearch

opensearch-data:
...
  replicas: 3
  # sysctlInit:
  #   enabled: true
  opensearchJavaOpts: "-Xmx20g -Xms20g" 
  nodeSelector:
    openes: data
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes    
  persistence:
    ...
    storageClass: openebs-opensearch    

ホスト上で手動でカーネルパラメータ vm.max_map_count を設定したくない場合は、sysctlInit 設定を有効にして init コンテナで設定することができます。 init コンテナでこのパラメータを設定した後は、マシンが再起動されるか sysctl -p で設定がリフレッシュされない限り、カーネルパラメータはコンテナのライフサイクルとは独立して保持されます。 vm.max_map_count は namespace で隔離されないカーネルパラメータです。影響範囲を最小限にするため、OpenSearch を専用のマシンに隔離してデプロイすることを推奨します。

インストールの実行

/etc/kubeasz/guance/infrastructure/charts ディレクトリで以下のコマンドを実行します。

$ helm install opensearch-cluster -n middleware --create-namespace -f opensearch-cluster/values.yaml opensearch-cluster-0.0.1.tgz

出力結果:

Release "opensearch-cluster" has been isntalld. Happy Helming!
NAME: opensearch-cluster
LAST DEPLOYED: Wed Nov  2 20:26:16 2022
NAMESPACE: middleware
STATUS: deployed
REVISION: 1
TEST SUITE: None

デプロイと設定の確認

コンテナステータスの確認

kubectl get pods -A -l app.kubernetes.io/instance=opensearch-cluster

出力結果:

NAMESPACE    NAME                          READY   STATUS    RESTARTS   AGE
middleware   opensearch-cluster-client-0   1/1     Running   0          63m
middleware   opensearch-cluster-client-1   1/1     Running   0          4m52s
middleware   opensearch-cluster-client-2   1/1     Running   0          4m47s
middleware   opensearch-cluster-data-0     1/1     Running   0          63m
middleware   opensearch-cluster-data-1     1/1     Running   0          63m
middleware   opensearch-cluster-data-2     1/1     Running   0          63m
middleware   opensearch-cluster-master-0   1/1     Running   0          63m
middleware   opensearch-cluster-master-1   1/1     Running   0          63m
middleware   opensearch-cluster-master-2   1/1     Running   0          4m31s

Running はデプロイ成功を示します。

アカウントの設定

ユーザーの作成

kJMerxk3PwqQ は設定するパスワードです。必要に応じて変更できます。

kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client \
    -- curl -X PUT -u admin:admin  http://127.0.0.1:9200/_plugins/_security/api/internalusers/openes \
    -H  'Content-Type: application/json' \
    -d '{"password": "kJMerxk3PwqQ","opendistro_security_roles": ["all_access"]}'

出力結果:

{"status":"CREATED","message":"'openes' created."}

ユーザーの確認

ユーザー作成時にデフォルトのパスワードを変更した場合は、コマンドを修正してください。

以下のコマンドを実行します。

kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client -- curl -u openes:kJMerxk3PwqQ  http://127.0.0.1:9200/_cat/indices

出力結果:

green open security-auditlog-2022.11.02 bwpC6JXiTzeqcC9YT8vksg 1 1  3 0  87.7kb 43.8kb
green open .kibana_1                    D_GsZGbKT0aIGEGkhnTajg 1 1  0 0    416b   208b
green open .opendistro_security         _723x9PCQZO8BosxrG_2cg 1 2 10 0 182.1kb 78.7kb

フィードバック

このページは役に立ちましたか?