Introduction
OpenSearch mono-nœud
Dossier de la composition : opensearch-mono/
.
Cette composition fait tourner sur un même nœud :
- l'agrégateur de logs Vector.
- l'outil de monitoring Colmet
- un serveur OpenSearch.
- un serveur OpenSearch Dashboards
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é à OpenSearchmanager
, nœud OpenSearch manager, qui fait aussi tourner OpenSearch Dashboardsingest
, 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
.
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.
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
- Moteur de recherche pour
nixpkgs
et les options NixOS - Tutoriel Zero-to-nix
- Le Wiki NixOS. Il manque pas mal de trucs et c'est pas toujours à jour, mais ça aide bien des fois.
- Le NixOS & Flakes book. Plutôt à jour, assez court et clair.
- Fonctions de la bibliothèque standard
NixOS Compose
- Tutoriel « en travaux ». Incomplet mais relativement à jour.
- Tutoriel « pas en travaux ». Plus complet, mais pas à jour.
Configurer son éditeur
VS Code
Installer l'extension Nix IDE.
Pour avoir du formattage, installer nixpkgs-fmt
avec :
nix profile install 'nixpkgs#nixpkgs-fmt'