このブログの目的

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環境
| 項目 | 内容 |
|---|---|
| 端末OS | Windows 11 Pro |
| Terminal | VSCode 1.99.3 |
| コンテナ実行環境 | Rancher Desktop 1.18.2 / Containerd |
| Elasticsearch / Kibana | 8.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の起動画面です。

※ Rancher Desktop Installerで以下のようにWSL2を求められた場合
「PowerShell」/ 「コマンドプロンプト」 / 「Windowsターミナル」いずれかの方法で、以下コマンドを実行し、WSL2を有効にします。当資料下図では、VSCodeのターミナルにて実行した例となります。
wsl --installinstall後、PC再起動を要求されますので、その際はPCを再起動してください。
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: bridgeelasticsearch > 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-kuromojiRancher 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
Rancher Desktopで確認
Rancher DesktopでContainersを開くと、以下のように2つのコンテナが”running”になっています。
パスワードの設定
以下の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: bridgecluster2の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 -bbin/elasticsearch-reset-password -u kibana_system -b生成されたパスワードをymlファイルに設定
生成されたパスワードをdocker-compose.ymlに設定します(2箇所)。

コンテナを再作成し、passwordを反映させる
以下コマンドで、コンテナを再作成し、passwordを反映させる
nerdctl compose -f docker-compose.yml downnerdctl compose -f docker-compose.yml up -dCluster2の動作確認
ブラウザをシークレットモードで開く
ローカル環境で複数の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
※ Seed nodes
remote環境として用意したclusterの”docker-compose.yml”より、transportでセットした値を指定します。
Nextをクリックします。
Add remote cluster ボタンをクリック


“Add remote cluster”をクリックします。
Connection StatusがConnectedになればOK

“not connected”の場合
not connectedとなった場合、cluster2側の
docker-compose.ymlで、Elasticsearchに以下パラメータが正しく設定されているか、確認してください。- transport.host=0.0.0.0 - transport.publish_host=host.docker.internal - transport.publish_port=9305反映手順
docker-compose.ymlを修正後、cluster2のコンテナを再生成してください。
nerdctl compose downnerdctl compose up -d反映後確認
cluster1のKibanaでRemote Clusterを一度削除し、再作成します。
項目 値 Remote cluster name (任意) Seed nodes host.docker.internal:9305 Node connections 3 Skip if unavailable ONでもOFFでも可 確認はcluster1のDev Toolsで以下です。
GET _remote/info
connected: trueになれば成功です。
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 /_licensetypeが”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 index | kibana_sample_data_ecommerce |
| Follower index | replicated_kibana_sample_data_ecommerce |
以下のように表示されたら成功です。

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

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







