Elasticsearchクラスタ検証(4): Elasticsearch 8.xのクラスタ化(HTTPS対応)

##### [前回] [Elasticsearchクラスタ検証(3): Elasticsearch 8.xのクラスタ化(HTTPS未対応)](https://qiita.com/mingchun_zhao/items/7385c750351dcfa0c5e2)

## はじめに

前回は、HTTPS未対応の3ノードElasticsearchクラスタを構築しました。
今回は、まっさらからHTTPS対応の3ノードElasticsearchクラスタを構築します。

- node1: `AlmaLinux8-1`
- node2: `AlmaLinux8-2`
- node3: `AlmaLinux8-3`

## node1で、以下実施(管理者権限)

### ファイアウォール設定

- ノード間通信を可能にするため、ポート9200、9300へのアクセス許可

```shell
# firewall-cmd --add-port={9200,9300}/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-port
9200/tcp 9300/tcp
```

### `/etc/hosts`に3ノードのIPアドレスを追加

```/etc/hosts
172.21.192.11 node1
172.21.192.12 node2
172.21.192.13 node3
```

### Elasticsearchを削除

まっさらからElasticsearchをインストールするため、
Elasticsearchを停止してから削除します。

```shell
# systemctl stop elasticsearch
# dnf remove elasticsearch --enablerepo=elasticsearch -y
# rm -rf /var/lib/elasticsearch
# rm -rf /etc/elasticsearch
# rm -rf /usr/share/elasticsearch
```

### Elasticsearchをインストール

- EslasticsearchリポジトリのGPG keyをインポート

```shell
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

- rpm repositoryを登録

```/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
```

- RPMパッケージをインストール

```shell
# dnf check-update --enablerepo=elasticsearch
# dnf install elasticsearch --enablerepo=elasticsearch -y
```

### Elasticsearchをサービスとして有効化
```
# systemctl enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.
```

### Elasticsearchの設定ファイルを編集

`/etc/elasticsearch/elasticsearch.yml`に、下記項目を設定し保存

- クラスタ名
    - `cluster.name: mycluster`
- クラスタ参加ノード
    - `discovery.seed_hosts: ["node1", "node2", "node3"]`
- Elasticsearchサービスに他のノードからアクセス可能に
    - `network.host: 0.0.0.0`
- index自動作成設定を最終行に追加
    - `action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*`

### Elasticsearchを起動し、elasticユーザーのパスワードをリセット

- Elasticsearchを起動

```shell
# systemctl start elasticsearch
```

- elasticユーザーのパスワードをリセット

```shell
# /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Re-enter password for [elastic]:
Password for the [elastic] user successfully reset.
```

- Elasticsearchにhttpsアクセスし、ステータス確認

```shell
# curl -k -u elastic https://localhost:9200
Enter host password for user 'elastic':
{
  "name" : "node1",
  "cluster_name" : "mycluster",
  "cluster_uuid" : "FyfnAcg5TI-OGB6VWfUysg",
  "version" : {
    "number" : "8.3.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "801fed82df74dbe537f89b71b098ccaff88d2c56",
    "build_date" : "2022-07-23T19:30:09.227964828Z",
    "build_snapshot" : false,
    "lucene_version" : "9.2.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

### node1のみで構成されたクラスタに、他のノード登録用トークンを作成

```shell
# /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
eyJ2ZXI...(中略)...cifQ==
```

作成された登録トークンを控える

## node2で、以下実施(管理者権限)

### ファイアウォール設定

- ノード間通信を可能にするため、ポート9200、9300へのアクセス許可

```shell
# firewall-cmd --add-port={9200,9300}/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-port
9200/tcp 9300/tcp
```

### `/etc/hosts`に3ノードのIPアドレスを追加

```/etc/hosts
172.21.192.11 node1
172.21.192.12 node2
172.21.192.13 node3
```

### Elasticsearchを削除

まっさらからElasticsearchをインストールするため、
Elasticsearchを停止してから削除します。

※ 既に起動されているノードをクラスタに登録できません。登録時に以下のエラーが発生します。
```
ERROR: Skipping security auto configuration because it appears that the node is not starting up for the first time. The node might already be part of a cluster and this auto setup utility is designed to configure Security for new clusters only.
```

```shell
# systemctl stop elasticsearch
# dnf remove elasticsearch --enablerepo=elasticsearch -y
# rm -rf /var/lib/elasticsearch
# rm -rf /etc/elasticsearch
# rm -rf /usr/share/elasticsearch
```

### Elasticsearchをインストール

- EslasticsearchリポジトリのGPG keyをインポート

```shell
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

- rpm repositoryを登録

```/etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
```

- RPMパッケージをインストール

```shell
# dnf check-update --enablerepo=elasticsearch
# dnf install elasticsearch --enablerepo=elasticsearch -y
```

### Elasticsearchをサービスとして有効化

```shell
# systemctl enable elasticsearch
Created symlink /etc/systemd/system/multi-user.target.wants/elasticsearch.service → /usr/lib/systemd/system/elasticsearch.service.
```

### node1で作成した登録トークンを使用し、node2をクラスタに登録

```shell
# /usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token eyJ2ZXI...(中略)...cifQ==

This node will be reconfigured to join an existing cluster, using the enrollment token that you provided.
This operation will overwrite the existing configuration. Specifically:
  - Security auto configuration will be removed from elasticsearch.yml
  - The [certs] config directory will be removed
  - Security auto configuration related secure settings will be removed from the elasticsearch.keystore
Do you want to continue with the reconfiguration process [y/N]y
```

### Elasticsearchの設定ファイルを編集

`/etc/elasticsearch/elasticsearch.yml`に、下記項目を設定し保存

- クラスタ名
    - `cluster.name: mycluster`
- Elasticsearchサービスに他のノードからアクセス可能に
    - `network.host: 0.0.0.0`
- index自動作成設定を最終行に追加
    - `action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*`

### Elasticsearchを起動

```
# systemctl start elasticsearch
```

- Elasticsearchへhttpsアクセスし、ステータス確認

```
# curl -k -u elastic https://localhost:9200
Enter host password for user 'elastic':
{
  "name" : "node2",
  "cluster_name" : "mycluster",
  "cluster_uuid" : "FyfnAcg5TI-OGB6VWfUysg",
  "version" : {
    "number" : "8.3.3",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "801fed82df74dbe537f89b71b098ccaff88d2c56",
    "build_date" : "2022-07-23T19:30:09.227964828Z",
    "build_snapshot" : false,
    "lucene_version" : "9.2.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

## node3でnode2と同じ手順を実施(管理者権限)

(略)

## いずれかのノードで、クラスタのステータスを確認

```shell

# curl -k -u elastic https://localhost:9200/_cat/nodes?v
Enter host password for user 'elastic':
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
172.21.192.12           19          95   0    0.15    0.09     0.07 cdfhilmrstw -      node2
172.21.192.13           40          95   1    0.37    0.19     0.07 cdfhilmrstw -      node3
172.21.192.11           44          91   1    0.00    0.00     0.00 cdfhilmrstw *      node1
```

クラスタにノードが三つ存在し、node1がmasterになっています。

## おわりに

HTTPS対応の3ノードElasticsearchクラスタを構築しました。
次回も続きます。お楽しみに。

##### [次回] [Elasticsearchクラスタ検証(5): Elasticsearchシステム構成の基本](https://qiita.com/mingchun_zhao/items/92929225d06e3e596324)