Introduction

OpenSearch mono-nœud

Dossier de la composition : opensearch-mono/.

Cette composition fait tourner sur un même nœud :

Vector récupère les logs systemd de tous les services de la machine et les stockes dans une base de données (« index ») OpenSearch (une par jour en fait).

Colmet fait de même, en agrégeant des données depuis plusieurs machines. Ces données sont des métriques à propos de l'utilisation d'un système distribué, pas des logs. Elles sont stockés dans un autre index.

OpenSearch Dashboards vient ensuite se connecter à l'API REST d'OpenSearch et propose une interface graphique pour consulter les données qui sont stockées dans OpenSearch par Vector. On peut notamment définir des visualisations et des graphiques pour afficher des statistiques sur les données collectées.

Le serveur OpenSearch écoute sur le port 9200 (pour l'API REST) et sur le port 9300 (pour les interactions inter-nœuds, pas utile ici). OpenSearch Dashboards écoute sur le port 5601 : il faut penser à forward ce port (c'est le cas automatiquement avec Docker).

Sécurité

Une grande partie du code de la composition est dédié à la configuration du plugin sécurité d'OpenSearch. Ce plugin est désactivé par défaut dans le module NixOS, mais OpenSearch Dashboards en a besoin pour authentifier et autoriser les utilisateurs.

On crée un certificat racine (derivation opensearch-root-cert) et on signe un autre certificat avec (stocké dans ssl-keystore.p12) pour le serveur OpenSearch, qui servira à chiffrer les connexions à l'API REST et les échanges entre nœuds. On crée également une liste de certificats de confiance (dans ssl-truststore.p12) qui ne contient qu'un seul certificat : le certificat racine. Cette mise en place est un peu plus complexe que ce qu'elle pourrait être, mais elle a l'avantage de bien s'adapter si on veut déployer un cluster de plusieurs nœuds, ce qui nous permet de partager du code entre nos différentes compositions.

On crée ces fichiers principalement parce qu'ils sont demandés par le plugin security, en pratique ils ne sont pas (ou très peu) utilisés. En effet, il n'y a pas de traffic inter-nœuds, et on demande à OpenSearch Dashboards de ne pas vérifier les certificats.

Grid5000

Pour lancer cette composition sur Grid5000, il faut utiliser le flavour g5k-nfs-store. Il est possible que l'ouverture des ports SSH prenne quelques dizaines de secondes.

Le flavour g5k-ramdisk fonctionne aussi mais les nœuds ne sont pas accessibles via nxc connect ou ssh dans ce cas de figure.

API REST

Pour interagir avec l'API REST en ligne de commande, on peut utiliser :

curl -u admin:admin https://localhost:9200/

-u admin:admin permet de s'authentifier et d'avoir tous les droits.

Si jamais des problèmes de certificats sont rencontrés, il est possible d'ajouter l'option -k à cURL pour les ignorer. Mais si tout va bien, il devraient être configurés comme il faut.

Utiliser OpenSearch Dashboards

OpenSearch Dashboards écoute sur le port 5601. Un tunnel est automatiquement mis en place avec Docker, mais en VM ou sur un serveur, il faut faire un tunnel SSH.

On peut ensuite ouvrir http://localhost:5601/ dans un navigateur.

On peut se connecter avec l'user admin et le mot de passe admin.

À la première connection, il sera demandé de choisir un « tenant ». Il faut choisir « Private » pour avoir accès au Dashboard par défaut. Si jamais vous avez choisi un autre tenant et que vous voulez changer, vous pouvez le faire à tout moment en cliquant sur votre avatar en haut à droite, puis sur « Switch tenants ».

Un dashboard par défaut (assez minimaliste) est disponible. Pour le voir, cliquer sur « Visualize & analyze » (au centre de l'écran d'accueil), puis « Dashboard » puis « Vector data ».

Il est possible de modifier ce Dashboard et d'y ajouter des visualisations. Pour sauvegarder les changements et les conserver même si la composition est relancée (ce qui efface toutes les données du système), il faut exporter les données. Pour celà, aller dans l'onglet « Manage » (en haut à droite de la page d'accueil), puis « Saved objects » (menu de gauche) puis exporter tous les objets (« Export X objects », en haut à droite). Le fichier export.ndjson doit être enregistré dans opensearch-mono/export.ndjson.

OpenSearch multi-nœud

Quatre rôles existent :

  • vector qui fait tourner vector, connecté à OpenSearch
  • manager, nœud OpenSearch manager, qui fait aussi tourner OpenSearch Dashboards
  • ingest, nœud OpenSearch ingest (uniquement, pas de data)
  • data, nœud OpenSearch data

Note : nous n'avons pas eu le temps de finir l'intégration de Colmet dans cette configuration, mais les premiers pas on été faits dans la branche multi_colmet.

La plupart des informations valable pour Opensearch mono-nœud sont aussi valable pour cette composition (connexion à OpenSearch Dashboards et à l'API, tunnel SSH, dashboards par défaut).

Sécurité

Les échanges entre les nœuds sont chiffrés avec TLS. Pour celà, nous avons mis en place une chaîne de certification. Un certificat racine est généré au moment de la compilation (derivation opensearch-root-cert dans l'overlay opensearch-security.nix). Grâce à des scripts bash exécutés par Systemd au lancement d'OpenSearch, des certificats pour chaque nœuds sont ensuite générés et configurés lors du démarrage des machines. Ces certificats de nœuds sont signés par le certificat racine (et placés dans le keystore). Le certificat racine est listé comme étant de confiance (en étant copié dans le truststore de chaque nœud, mais aussi en étant ajouté à la liste des certificats du système).

Sur le nœud manager, un script pour configurer les permissions et utilisateurs par défaut est également lancé (wait-and-run-secyrityadmin). Afin d'avoir des droits d'administration, ce script a également besoin d'un certificat pour s'authentifier. Nous en générons donc un et le signons avec le même certificat racine.

Note pour Docker

Le cluster peut ne pas démarrer avec Docker, avec le message d'erreur suivant dans les logs d'OpenSearch (systemctl status opensearch.service).

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

Cette option est une option du noyau Linux qui peut être configurée avec sysctl. Dans les autres flavours, elle est configurée via NixOS dans le code de la composition, mais dans le cas de Docker, comme le noyau est partagé avec la machine hôte, on doit changer l'option manuellement sur sa machine.

En dehors des containers, il faut donc faire :

sudo sysctl -w vm.max_map_count=262144

Lancer plusieurs nœuds du même type

Pour lancer plusieurs même noeud à partir d'un code on utilise la commande :

nxc start -r nom_du_noeud=nombre_de_noeud -f vm

Par exemple, on peut lancer la commande suivante pour avoir 2 noeuds data identique : nxc start -r data=2 -f vm

K3S

Dossier de la composition : k3s/

K3S est un orchestrateur de container léger, compatible avec Kubernetes (k8s).

Cette composition fait tourner deux nœuds1 : un serveur K3S et un agent.

Le serveur est le point d'entrée avec lequel on interagit. Les agents sont les machines sur lesquelles les containers vont tourner et reçoivent leurs instructions du serveur.

Le serveur écoute sur le port 6443.

1

sur Grid5000, il faut donc bien penser à réserver deux nœuds

Erreurs communes

La commande nix ne marche pas

Message d'erreur :

error: experimental Nix feature 'nix-command' is disabled; add '--extra-experimental-features nix-command' to enable it

Pour régler le souci, on peut ajouter les arguments à chaque commande qu'on tape comme expliqué dans le message d'erreur, ou les ajouter dans la config Nix pour que ça soit fait automatiquement. Il faut rajouter cette ligne dans ~/.config/nix/nix.conf :

experimental-features = nix-command

Il y aura sans doute besoin de la feature flakes aussi, donc autant mettre cette ligne plutôt :

experimental-features = nix-command flakes

CGroups V2

Avec Docker, il arrive que les containers ne se lancent pas, sans faire de message d'erreur.

Ce problème est connu.

Pour contourner le problème, il faut désactiver cgroups V2 en ajoutant ces options au Noyau Linux, sur la machine hôte: systemd.unified_cgroup_hierarchy=0.

Cette solution a marché pour des machines sous ArchLinux, mais semble insuffisante si on est sous Ubuntu (dans ce cas nous avons préféré utiliser les VM Qemu).

Beaucoup de paquets sont recompilés

Parfois quand on compile avec nxc build, beaucoup de paquets sont recompilés au lieu d'être récupérés depuis le cache binaire.

Une des raisons qui peut causer ces cache-miss est que NixOS-compose désactive X11 par défaut, alors qu'il est activé sur Hydra (et donc dans les paquets stockés dans le cache binaire). Cette différence se répercute dans les dépendances de certains paquets (compilés ou non avec le support de X11) et change donc leur hashs.

Pour contourner le souci, on peut réactiver X11 en ajoutant cette option dans sa composition :

environment.noXlibs = false;

Les images générées par nxc seront un tout petit plus lourde, car quelques bibliothèques en plus seront présentes, mais la différence devrait être négligeable.

Anti-sèche

Travailler sur une composition

cd DOSSIER-DE-LA-COMPOSITION
nix develop
nxc build -f FLAVOUR
nxc start
nxc connect ROLE

Lancer les tests

nxc start
# Bien attendre que la machine soit démarrée, puis
nxc driver -t

Accéder à un service en TCP / HTTP

Pour accéder à un service qui tourne dans une VM qemu, on peut faire un tunnel SSH (à la place de faire nxc connect ROLE).

ssh -L PORT:localhost:PORT root@localhost -p 22022

Le port 22022 est à remplacer avec le port SSH de la machine (22022 est le premier, puis on a 22023, etc).

En théorie, on peut aussi ajouter des arguments à QEMU pour qu'il fasse le forwarding, mais en pratique ça ne marche pas :

env QEMU_OPTS="-netdev user,id=n0,hostfwd=tcp::PORT-:PORT" nxc start

Si jamais les VM QEMU ont du mal à tourner, on peut essayer d'activer explicitement KVM avec la variable d'environnement QEMU_OPTS=--enable-kvm. On peut aussi ajouter de la mémoire avec MEM=2048 (en Mio, par défaut il y en 1024).

Une fois qu'un port est « forwardé », on peut y accéder depuis la machine hôte, par exemple en ouvrant http://localhost:PORT dans un navigateur, ou en utilisant curl.

Grid5000

Pour configurer les alias SSH, voir le wiki Grid5000.

Envoyer une composition sur Grid5000

On a deux options.

Option 1 :Copier les fichiers

scp -r DOSSIER-DE-LA-COMPO VILLE.g5k:~

Option 2 : Cloner le dépôt Git

Il faut s'assurer que tous les changements dont on a besoin on été commit et push sur GitHub. Ensuite, on fait un clone classique (en utilisant l'URL HTTPS du dépôt, pas SSH).

Connexion au serveur d'accueil de la ville

ssh VILLE.g5k

Installation de nxc sur le Grid5000

À la première connexion, il faut installer nxc avec :

# On installe poetry, un gestionnaire de projet et de
# dépendances pour Python, utilisé par nxc
curl -sSL https://install.python-poetry.org | python3 -
# On fait en sorte que poetry soit accessible dans le shell
export PATH=$PATH:~/.local/bin
# On récupère le code source de nxc
git clone https://github.com/oar-team/nixos-compose.git
cd nixos-compose
# On installe les dépendances
poetry install
# On entre dans un shell où l'exécutable nxc est disponible
poetry shell
# On installe Nix (cette commande l'installe pour l'utilisateur
# courant seuleument, en téléchargeant une version pré-compilée
# et ne demande donc pas de droits particuliers) 
nxc helper install-nix

Mise en place automatique

À chaque connexion, il faut taper les commandes suivantes, pour s'assurer que tous les exécutables dont on a besoin sont disponibles :

export PATH=~/.local/bin:$PATH
exec poetry shell -C nixos-compose

Il est possible d'ajouter ces commandes à la fin du fichier ~/.profile pour qu'elles soient exécutées automatiquement à chaque nouvelle connexion.

Compiler et lancer la composition

nxc build -f g5k-ramdisk

# Modifier nodes=1 pour réserver le nombre de nœuds dont
# on a besoin
export $(oarsub -l nodes=1,walltime=1:0:0 "$(nxc helper g5k_script) 1h" | grep OAR_JOB_ID)
oarstat -u -J | jq --raw-output 'to_entries | .[0].value.assigned_network_address | .[]' > machines
nxc start -f g5k-ramdisk -m machines

Si vous avez une erreur par rapport au flake/linux_x86_64, il faut exit et se reconnecter (aucune idée de pourquoi ça règle le souci).

Réserver un nœud et s'y connecter

oarsub -I

Annuler une réservation de nœud

oardel $OAR_JOB_ID

Liens utiles

NixOS

NixOS Compose

Configurer son éditeur

VS Code

Installer l'extension Nix IDE.

Pour avoir du formattage, installer nixpkgs-fmt avec :

nix profile install 'nixpkgs#nixpkgs-fmt'