Installation d’un cluster elasticsearch 8.x (et son piège)

Dans cet article nous abordons l’installation sous Linux d’un cluster elasticsearch et non pas d’une infrastructure ELK complète. L’installation de Kibana qui est néanmoins indispensable pour à minima l’administration du cluster sera décrite dans un autre article.

La procédure d’installation d’un cluster elasticsearch 8.x n’a pas fondamentalement changée comparée à la procédure pour une version 7.x. Cependant, il y a quelques nouveautés et un piège à éviter. 

Les nouveautés sont les suivantes :

  • Activation de la sécurité par défaut (ssl + authentification)
  • Notion de « enrollment » pour l’ajout d’un nœud au cluster

Dans cette procédure basée sur les packages officiels, nous indiquons les étapes communes de l’installation des différents nœuds, puis les procédures spécifiques pour le premier nœud et les nœuds suivants. 

L’installation est réalisée sous Debian 12 sous un compte utilisateur qui n’est pas root. Nous installons deux nœuds dont les noms de host sont es1 et es2.

Étapes communes à tous les nœuds

  • Mise en place des dépôts officiels
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
$ sudo apt install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main"  | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
  • Création d’un utilisateur elasticsearch
    Cette étape n’est pas obligatoire, mais comme l’installation crée un utilisateur avec lequel il est impossible de se logguer, nous anticipons avec la création d’un compte « complet » 
$ sudo useradd -m -d /home/elasticsearch -s /bin/bash elasticsearch
$ sudo passwd elasticsearch
$ sudo usermod -aG sudo elasticsearch
  • Installation
$ sudo apt update && sudo apt install elasticsearch

Nœud 1 (es1)

elasticsearch est installé et est configuré par défaut avec la sécurité activée et l’enrollment. Il est possible de les désactiver et dans ce cas, l’installation est identique à celle d’une version 7.x. Dans /etc/elasticsearch/elactiserach.yml, on modifie ces paramètres.

xpack.security.enabled: false
xpack.security.enrollment.enabled: false

Dans notre cas, nous poursuivons bien sûr en conservant ces deux fonctionnalités activées et surtout en ne modifiant pas le fichier de configuration avant le premier démarrage afin que tout se passe correctement. En effet, c’est lors du premier démarrage que tout se joue et que la configuration de sécurité suivante s’effectue automatiquement : 

  • l’authentification et l’autorisation sont activées et un mot de passe est généré pour le superutilisateur intégré Elastic. 
  • les certificats et les clés pour TLS sont générés pour la couche transport et HTTP, et TLS est activé et configuré avec ces clés et certificats.
  • Démarrage
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
$ sudo systemctl start elasticsearch.service
  • Modification du mot de passe du compte elastic
    J’utilise le mot de passe « elastic » qui présente l’avantage d’être simple pour un environnement de tests.
$ cd /usr/share/elasticsearch/bin/
$ ./elasticsearch-reset-password -i -u elastic
  • Quelques vérifications
$ curl -k -u elastic:elastic https://localhost:9200/
$ curl -k -u elastic:elastic https://localhost:9200/_cluster/health?pretty
$ curl -k -u elastic:elastic https://localhost:9200/_cat/nodes
$ curl -k -u elastic:elastic https://localhost:9200/_cat/master

On constate qu’il n’y a qu’un nœud dans le cluster.

  • Modifications importantes de configuration avant d’ajouter des nœuds au cluster

C’est là que l’on déjoue le piège. En effet, par défaut un nœud elasticsearch n’est accessible qu’en local sur son port 9300 (communications entre les nœuds d’un cluster) et donc les autres nœuds ne vont pas pouvoir communiquer avec lui et le premier effet est que leur « enrollment » va échouer.

C’est le paramètre « network.host » qui doit être positionné. Voici les paramètres à vérifier et éventuellement modifier dans le fichier /etc/elasticsearch/elasticsearch.yml

cluster.name: <- modifier si autre que "elasticsearch"
network.host: <- ip locale
discovery.seed_hosts: ["es1"]
cluster.initial_master_node: ["es1"]
  • Redémarrage
$ sudo systemctl restart elasticsearch.service
  • Génération d’un token d’enrollment
$ cd /usr/share/elasticsearch/bin/
$ ./elasticsearch-create-enrollment-token -s node
eyJ2ZXIiOiI4LjExLjEi.........fQ==

Nœuds suivants (es2, …)

  • Vérification
    Une première chose à faire est de vérifier que le nœud 1 est joignable sur le port 9200, mais surtout sur le port 9300. Pour cela j’utilise netcat.
$ nc -zv es1 9300
Connection to es1 (192.168.1.33) 9300 port [tcp/*] succeeded!
  • enrollment auprès de es1 avec le token généré
$ cd /usr/share/elasticsearch/bin/
$ ./elasticsearch-reconfigure-node --enrollment-token eyJ2ZXIiOiI4LjExLjEi.........fQ==

Cette étape, modifie principalement la configuration dans le fichier /etc/elasticsearch/elasticsearch.yml en positionnant le paramètre discovery.seed_hosts afin d’indiquer ou joindre le nœud es1. Le port utilisé est le 9300 d’où la vérification précédente. 
discovery.seed_hosts: [« 192.168.1.33:9300 »]

  • Modifications importantes de configuration avant le premier démarrage

Editer /etc/elasticsearch/elasticsearch.yml

cluster.name: <- modifier si autre que "elasticsearch"
network.host: <- ip locale
  • Démarrage
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
$ sudo systemctl start elasticsearch.service
  • Quelques vérifications
$ curl -k -u elastic:elastic https://localhost:9200/
$ curl -k -u elastic:elastic https://localhost:9200/_cluster/health?pretty
$ curl -k -u elastic:elastic https://localhost:9200/_cat/nodes
$ curl -k -u elastic:elastic https://localhost:9200/_cat/master

On constate que le nouveau nœud est intégré au cluster.

Et ensuite 

Une fois tous les nœuds ajoutés et ensuite lors de chaque ajout ou suppression d’un nœud, on pense à : 

  • Maintenir discovery.seed_hosts
  • Maintenir cluster.initial_master_nodes avec tous les nœuds ayant pour rôle « master » (master-eligible node)

Dans cet article nous avons vu la procédure d’installation d’un cluster elastisearch et comment déjouer le piège de communication entre les nœuds. Ce dernier point n’est pas clairement indiqué dans la documentation officielle et peut faire perdre beaucoup de temps. Ce piège est également à contourner lors de l’installation avec les archives tar.