Elastic Certified Engineer Exam対策 – Cross Cluster検証環境の構築

Training banner for Elastic Certified Engineer Exam with JP subtitle; vertical TRAINING label on the right. トレーニング
  1. このブログの目的
    1. 筆者のLocal環境
  2. 第2章 Elasticsearch Cluster1の構築
    1. Rancher Desktopインストール
      1. Rancher Desktop Installer 取得
      2. Installerの実行
    2. home directory 環境準備
      1. home directoryの作成
      2. Composeファイルの配備
      3. “Dockerfile”ファイルの配置
    3. Rancher Desktopの設定
      1. Rancher Desktopを起動 – Preferences をクリック
      2. Container Engineを開く
      3. Kubernetesを開く
    4. Containerの作成
      1. VSCodeを開き、Terminalウィンドウを開く
      2. TerminalでカレントディレクトリをHome Directoryへ移動
      3. コンテナを起動する
      4. コンテナ起動確認
    5. パスワードの設定
      1. elasticのコンテナに入る
      2. kibana_systemアカウントのパスワードの生成とセット
    6. コンテナ再作成
    7. 動作確認
  3. Elasticsearch Cluster2の構築とRemote Clusterの登録
    1. Cluster2を作成
      1. Cluster1のフォルダを丸ごとコピー&ペースト
      2. cluster2のdocker-compose.yml修正
      3. cluster2の起動
      4. パスワードを生成
      5. 生成されたパスワードをymlファイルに設定
      6. コンテナを再作成し、passwordを反映させる
    2. Cluster2の動作確認
      1. ブラウザをシークレットモードで開く
      2. Kibanaでログイン確認
    3. Cluster1でCluster2をRemote Cluster登録する
      1. Stack Management > Remote Clustersを開く
      2. 各種設定
      3. Add remote cluster ボタンをクリック
      4. Connection StatusがConnectedになればOK
  4. Trial Licenseの適用
    1. Cluster1でTrial Licenseを適用
    2. Cluster2でTrial Licenseを適用
  5. CCSとCCRの動作確認
    1. cluster2でsample dataを有効化する
    2. cluster1でcross-cluster searchをテスト
    3. cluster1でcross-cluster replicationをテスト

このブログの目的

Cross Cluster Search(CCS)およびCross Cluster Replication(CCR)は、Elastic Certified Engineer Examにおいて重要な学習項目です。しかし、これらの機能を検証するには複数のElasticsearch Clusterを用意し、Remote Clusterの設定まで行う必要があるため、環境構築でつまずくケースも少なくありません。

また、CCSとCCRでは必要なライセンスが異なります。CCSはBasic Licenseでも利用できますが、CCRはPlatinumまたはEnterprise Licenseが必要です。そのため、ローカル環境でCCRを検証するには、Trial Licenseを適用してライセンス機能を有効化する必要があります。

本記事では、ローカル環境に2つのElasticsearch Clusterを構築し、Trial Licenseの適用、Remote Clusterの登録、CCSおよびCCRの動作確認までを順を追って解説します。実際に環境を構築しながら学習することで、Cross Cluster機能の設定方法と動作を効率よく理解できることを目的としています。

また、本記事で構築した環境は、Elastic Certified Engineer Examの学習だけでなく、CCSやCCRの検証環境としても継続的に活用できます。

筆者のLocal環境

項目内容
端末OSWindows 11 Pro
TerminalVSCode 1.99.3
コンテナ実行環境Rancher Desktop 1.18.2 / Containerd
Elasticsearch / Kibana8.15.5

第2章 Elasticsearch Cluster1の構築

この章では、まず、コンテナ実行環境として、Rancher Desktopをダウンロード、インストールし、Elasticsearch Cluster1を構築します。続いて、Rancher Desktopの初期設定、ComposeファイルおよびDockerfileの作成、コンテナの起動、パスワードの設定を行い、最後にKibanaへアクセスして正常に動作することを確認します。ここで構築した環境をベースとして、第3章ではCluster2を構築し、Cross Cluster環境を作成していきます。

Rancher Desktopを採用するメリット
Rancher Desktopは、WindowsやmacOS上でコンテナ環境を構築・実行するためのオープンソースソフトウェアです。Docker Desktopと同様にコンテナの開発・検証環境として利用できますが、商用利用時のライセンス面に違いがあります。

Docker Desktopは、個人利用や小規模企業であれば無償で利用できますが、一定規模以上の企業で商用利用する場合は、有償サブスクリプションの契約が必要です。一方、Rancher Desktopにはこのようなライセンス要件がなく、企業規模を問わず追加のライセンス費用を気にすることなく利用できます。

また、Rancher DesktopはDocker Engine(dockerd)だけでなく、Kubernetesで広く採用されているcontainerdを直接利用できる点も特徴です。そのため、Kubernetesとの親和性が高く、本番環境に近い構成でコンテナを検証したい場合にも適しています。

このような理由から、ライセンスコストを抑えながらコンテナ開発環境を構築したい場合や、containerdを利用した環境で検証を行いたい場合には、Rancher Desktopは有力な選択肢となります。

Rancher Desktopインストール

Rancher Desktop Installer 取得

以下サイトからinstallerをダウンロードし、実行します。
https://rancherdesktop.io

今回はWindows端末を使用する手順なので、”Download for Windows(x64)”を選択しています。

Installerの実行

ダウンロードしたInstallerを実行して、表示されるウィザードに従ってInstallを完了させます。

下図はRancher Desktopの起動画面です。

home directory 環境準備

home directoryの作成

任意のpathにフォルダを作成してください。この説明資料では、”C:\dxdoc\local_elk_08_15_5”をhome directoryとして作成しています。

次に、home directoryの下に、snapshot保管用のフォルダとして”repo”というフォルダを作成してください。

Composeファイルの配備

以下の内容で”docker-compose.yml”ファイルを作成し、home directory直下に配置します。

この docker-compose.yml は、Elastic Stack(Elasticsearch・Kibana)を 単一ノード構成でローカル環境に立ち上げるための設定ファイルです。以下は、docker-compose.ymlファイルの内容です。

# version: '3.8'
services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: elasticsearch_08_15_5
    environment:
      - node.name=es01
      - discovery.type=single-node
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=GkU+E7ELd8K-M4lSZlwJ
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - path.repo=/var/tmp/snapshots
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9202:9200
      - 9302:9300
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - /mnt/c/dxdoc/local_elk_08_15_5/repo:/var/tmp/snapshots

    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.5
    container_name: kibana_08_15_5
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=cJEeOEz2pblKfGuzSx9y
      - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=4589168f9e660e06933ed916a7ab4dd985e7d8008cc67f1559c3261190e68d84
      - XPACK_REPORTING_ENCRYPTIONKEY=e6d562b300c3d4ed77efc8e1daa6330a790147cdcefd40d9932ed0a26f0da62f
      - XPACK_SECURITY_ENCRYPTIONKEY=9f76eb7838abf34f16db7f19cc0bde434d5fa4619b10400b5a10bb7bf0f5257e
    ports:
      - "5603:5601"
    networks:
      - elk

volumes:
  es_data:

networks:
  elk:
    driver: bridge

elasticsearch > environment の「path.repo=/var/tmp/snapshots」の指定と、elasticsearch > volumes の
「- /mnt/c/dxdoc/local_elk_08_15_5/repo:/var/tmp/snapshots」
の指定は一致させる必要があります。

Portの指定は、空きPortであれば問題ありません。ブラウザから呼び出す際のURLは指定したPortを使用してください。

“Dockerfile”ファイルの配置

“Dockerfile”ファイルを、同一ディレクトリに作成します。

Dockerfileの内容は以下としてください。

FROM docker.elastic.co/elasticsearch/elasticsearch:8.15.5

RUN bin/elasticsearch-plugin install --batch analysis-kuromoji

Rancher Desktopの設定

Rancher Desktopを起動 – Preferences をクリック

“Preferences”をクリックします。

Container Engineを開く

Container Engineを開き、”containerd”を選択、Applyボタンをクリックし、設定する。

本手順書では、Container Engineとして「containerd」を使用します。ただし、「containerd」の使用は必須ではなく、「dockerd」を使用した場合でも同様の環境を構築できます。

Kubernetesを開く

Kubernetesを開き、”Enable Kubernetes”のcheckを外し、Applyボタンをクリックし、設定する。

Containerの作成

VSCodeを開き、Terminalウィンドウを開く

TerminalでカレントディレクトリをHome Directoryへ移動

以下コマンドでカレントディレクトリを移動します。

cd C:\dxdoc\local_elk_08_15_5

コンテナを起動する

以下コマンドをTerminalで実行し、コンテナを作成、起動します。

nerdctl compose -f docker-compose.yml up -d

実行後に出力されるログ

コンテナ起動確認

以下コマンドをTerminalで実行し、2つのコンテナが起動していることを確認する。

nerdctl ps

パスワードの設定

以下の2つのパスワードを設定します。

  • elasticsearch用の”elastic”アカウント
  • kibana用(kibanaが内部でelasticsearchに接続する)”kibana_system”アカウント

elasticのコンテナに入る

以下コマンドをTerminalで実行し、elasticsearchのコンテナに入ります。

“elasticsearch_08_15_5”の部分はdocker-compose.ymlの”container_name”で指定した値となります。

nerdctl exec -it elasticsearch_08_15_5 /bin/bash

プロンプトが以下のように変わります。

以下コマンドを実行し、elasticアカウントのパスワードを発行します。

bin/elasticsearch-reset-password -u elastic -b

上図のように、New valueとして、新規にパスワードが発行されます。新たに発行されたパスワードを、docker-composeファイルの該当箇所に反映させます。

passwordは実行された環境毎に異なりますので、自端末で出力された値を使用してください。

kibana_systemアカウントのパスワードの生成とセット

elasticsearchのコンテナに入ったまま、続けて以下コマンドを実行します。

bin/elasticsearch-reset-password -u kibana_system -b

同様に、New valueとして、新規にkibana_systemアカウント用のパスワードが発行されます。新たに発行されたパスワードを、docker-composeファイルの該当箇所に反映させます。

コンテナ再作成

以下コマンドで、コンテナを再作成し、Composeファイルに設定したパスワード反映させます。

docker-compose.ymlを修正したので、その修正を反映させたコンテナを作成する為に、既存のコンテナを削除し、再度生成します。

削除コマンド

nerdctl compose -f docker-compose.yml down

作成、起動コマンド

nerdctl compose -f docker-compose.yml up -d

動作確認

以下URLでkibanaにアクセスし、動作確認します。

http://localhost:5603

筆者Local環境の都合により、Portに5603を指定していますが、この数値に深い意図はありません。既にLocalで5601、5602が使用されている為、5603を指定しています。最初にElasticsearch環境を作成される方は、5601を使用して構いません。

kibanaへのログイン画面が表示されます。

usernameに”elastic”、Passwordに生成、設定したパスワードを入力し、Log inを押下します。

home画面が表示されれば成功です。

これで、Cluster1の構築は完了です。

Elasticsearch Cluster2の構築とRemote Clusterの登録

この章では、Cluster2の環境を構築します。Cluster1のリソースをベースにして構築します。

Cluster2を作成

Cluster1をベースにCluster2を作成します。

Cluster1のフォルダを丸ごとコピー&ペースト

cluster1用に用意したhome directoryをコピー&ペーストして、cluster2用のhome directoryを用意します。ここでは、cluster2のhome directoryを”local_elk_08_15_5_cross_cluster”としています。

cluster2のdocker-compose.yml修正

cluster2のdocker-compose.ymlを修正します。

(参考) cluster1のdocker-compose.yml

# version: '3.8'
services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: elasticsearch_08_15_5
    environment:
      - node.name=es01
      - discovery.type=single-node
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=GkU+E7ELd8K-M4lSZlwJ
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - path.repo=/var/tmp/snapshots
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9202:9200
      - 9302:9300
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - /mnt/c/dxdoc/local_elk_08_15_5/repo:/var/tmp/snapshots

    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.5
    container_name: kibana_08_15_5
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=cJEeOEz2pblKfGuzSx9y
      - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=4589168f9e660e06933ed916a7ab4dd985e7d8008cc67f1559c3261190e68d84
      - XPACK_REPORTING_ENCRYPTIONKEY=e6d562b300c3d4ed77efc8e1daa6330a790147cdcefd40d9932ed0a26f0da62f
      - XPACK_SECURITY_ENCRYPTIONKEY=9f76eb7838abf34f16db7f19cc0bde434d5fa4619b10400b5a10bb7bf0f5257e
    ports:
      - "5603:5601"
    networks:
      - elk

volumes:
  es_data:

networks:
  elk:
    driver: bridge

cluster2のdocker-compose.yml

# version: '3.8'
services:
  elasticsearch:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: elasticsearch_08_15_5_cluster2
    environment:
      - node.name=es01
      - discovery.type=single-node
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=VMCT*d3ttgnUqqr9osR6
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - path.repo=/var/tmp/snapshots
      - transport.host=0.0.0.0
      - transport.publish_host=host.docker.internal
      - transport.publish_port=9305

    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9205:9200
      - 9305:9300
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - /mnt/c/dxdoc/local_elk_08_15_5_cross_cluster/repo:/var/tmp/snapshots

    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.5
    container_name: kibana_08_15_5_cluster2
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=B-SjcXcxqxHGbhU+_LD*
      - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=4589168f9e660e06933ed916a7ab4dd985e7d8008cc67f1559c3261190e68d84
      - XPACK_REPORTING_ENCRYPTIONKEY=e6d562b300c3d4ed77efc8e1daa6330a790147cdcefd40d9932ed0a26f0da62f
      - XPACK_SECURITY_ENCRYPTIONKEY=9f76eb7838abf34f16db7f19cc0bde434d5fa4619b10400b5a10bb7bf0f5257e
    ports:
      - "5605:5601"
    networks:
      - elk

volumes:
  es_data:

networks:
  elk:
    driver: bridge

“cluster2″用のDocker Compose環境は、”cluster1″用の”docker-compose.yml”をベースに作成しています。主な変更点は以下のとおりです。

  • container_nameを”elasticsearch_08_15_5_cluster2”に変更
  • HTTPポートを”9205″、Transportポートを”9305″、Kibanaポートを”5605″へ変更し、”cluster1″との競合を回避
  • Snapshot保存先を”cluster2″用のディレクトリへ変更(”volumes”の指定)
  • CCSでRemote Clusterとして接続できるよう、以下3つのパラメータの追加
    • transport.host=0.0.0.0
    • transport.publish_host=host.docker.internal
    • transport.publish_port=9305

これらの設定により、”cluster1″と”cluster2″の2つのElasticsearchクラスタを同一ホスト上で同時に起動し、Cross Cluster 関連の機能を検証することができます。

cluster2の起動

1. vscodeでterminalを開く

2. カレントディレクトリをdocker-compose.ymlのあるフォルダにする

cd C:\dxdoc\local_elk_08_15_5_cross_cluster

※ 上記コマンドのpathは自分の環境にあったものに修正してください。

3. コンテナを生成する

nerdctl compose -f docker-compose.yml up -d

パスワードを生成

terminalで以下コマンドにて、elasticsearchのコンテナにログインし、パスワードを生成します。

nerdctl exec -it elasticsearch_08_15_5_cluster2 /bin/bash

パスワード生成コマンド (2つ)

bin/elasticsearch-reset-password -u elastic -b
bin/elasticsearch-reset-password -u kibana_system -b

生成されたパスワードをymlファイルに設定

生成されたパスワードをdocker-compose.ymlに設定します(2箇所)。

コンテナを再作成し、passwordを反映させる

以下コマンドで、コンテナを再作成し、passwordを反映させる

nerdctl compose -f docker-compose.yml down
nerdctl compose -f docker-compose.yml up -d

Cluster2の動作確認

ブラウザをシークレットモードで開く

ローカル環境で複数のElasticsearch Clusterを起動し、それぞれのKibanaを同じブラウザで開くと、Cookieやセッション情報が競合し、意図せずログイン画面へ戻されることがあります。この問題は、シークレットモードを使用することで通常ウィンドウとは独立したCookie・セッション情報が利用されるため、互いに影響を受けずに複数のKibanaへ同時にアクセスできます。

シークレットモードのブラウザで、cluster2のkibanaにログインできるか確認します。

http://localhost:5605/

Kibanaでログイン確認

・username : elastic
・passowrd : 新規に発行したelastic ユーザ用のパスワード

home画面が表示されればOKです。

これで、cluster2の環境構築は完了です。

Cluster1でCluster2をRemote Cluster登録する

ここまで、2つのElasticsearch Clusterを構築し、Cross Cluster環境を構成しました。続いて本節では、Cluster1からCluster2をRemote Clusterとして登録し、Cluster1からCluster2へ接続できる状態を構成します。

Remote Clusterを登録することで、Cross Cluster Search(CCS)ではRemote Cluster上のIndexを検索できるようになり、Cross Cluster Replication(CCR)ではFollower Indexを作成するための前提条件が整います。本節では、Kibanaを使用してRemote Clusterを登録し、正常に接続できることを確認します。

Stack Management > Remote Clustersを開く

画面中央の”Add a remote cluster”をクリックします。

各種設定

  • Remote cluster name : 任意の名称 (画面では”0815_cluster2”を指定)
  • Seed nodes(※) : host.docker.internal:9305

Nextをクリックします。

Add remote cluster ボタンをクリック

“Add remote cluster”をクリックします。

Connection StatusがConnectedになればOK

Trial Licenseの適用

ElasticのBasic Licenseでは、Cross Cluster Search(CCS)は利用できますが、Cross Cluster Replication(CCR)やSearchable Snapshotなどの機能は利用できません。そのため、Trial Licenseを適用し、上位ライセンスの機能を有効化する必要があります。

Trial Licenseは、1つのClusterにつき30日間無料で利用ます。本章では、Cluster1およびCluster2へTrial Licenseを適用し、CCRやSearchable Snapshotを利用できる状態にします。

Cluster1でTrial Licenseを適用

Cluster1でkibanaにログインし、Stack Management > License Management を開きます。

“Start a 30-day trial”の”Start trial”をクリックします。

“Start my trial”をクリックします。

以下の画面になり、Trial licenseが有効になったことを確認できます。

Dev Toolsを開き、以下コマンドを実行します。

get /_license

typeが”trial”となっていることを確認してください。

以上で、cluster1がtrial licenseとなりました。続けて、cluster2にtrial licenseを適用します。

Cluster2でTrial Licenseを適用

シークレットモードでCluster2のkibanaにログインしてください(※)。

Cluster1のkibanaを閉じていればシークレットモードを使う必要はありません

Stack Management > License Management を開きます。

cluster1と同様に、start trialをクリックし、trial licenseを有効化してください。

Dev Toolsでも、trialになっていることを確認します。

これで、cluster1、2双方がtrialとなり、30日間、enterprise license相当の機能が使用できるようになりました。

30日が経過すると、licenseがbasicに戻りますが、新たにclusterを用意すれば、そのclusterにあらためてtrial licenseを適用することが可能です。

CCSとCCRの動作確認

cluster2のkibanaにて、sample dataを有効にし、cluster1から検索できることを確認します。

cluster2でsample dataを有効化する

home > Try sample data > Other sample data sets

cluster1でcross-cluster searchをテスト

cluster1のkibanaでDev Toolsを開き、以下ccsのsearchコマンドを実行する。

get 0815_cluster2:kibana_sample_data_ecommerce/_search

cluster1でcross-cluster replicationをテスト

cluster1のkibanaにログインし、Stack Management > Cross-Cluster Replicationを開く。

“Create a follower index”をクリックする。

以下のように入力し、Createをクリックする。

パラメータ
Leader indexkibana_sample_data_ecommerce
Follower indexreplicated_kibana_sample_data_ecommerce

以下のように表示されたら成功です。

しばらくすると、StatusがActiveに変わります。

以上、Cross Cluster環境の構築と、CCS、CCRの動作確認が完了です。