Un laboratoire Ceph local est l'endroit le plus sûr pour apprendre le stockage distribué en pratique, répéter des changements et dépanner sans risquer des données de production. Dans ce guide, vous construirez un cluster Ceph pratique à trois nœuds sur des machines virtuelles locales en utilisant une installation par paquets (sans conteneurs), créerez du RBD et du CephFS pour des exercices concrets, vérifierez la santé du cluster avec des contrôles observables, et pratiquerez la récupération face aux modes de défaillance courants. Le résultat final est un flux de travail reproductible que vous pourrez reconstruire et étendre au fur et à mesure que votre compréhension progresse.

## Périmètre de ce guide

- Trois VMs (ceph1, ceph2, ceph3) avec un disque système et un disque de données chacune

- Pools répliqués avec une taille de 3 pour observer un vrai comportement de quorum et de placement

- Exemples RBD et CephFS pour pratiquer les flux de travail bloc et système de fichiers

## Inventaire des versions et de l'environnement

Choisissez des versions simples et cohérentes ainsi qu'une topologie adaptée à un ordinateur portable ou une station de travail. Gardez le premier pilote petit, mesurable et facile à inspecter.

Exemple construit (adaptez selon la capacité de votre hôte) :

- OS : Ubuntu Server 22.04 LTS sur tous les nœuds

- Version Ceph : Reef 18.x (installation par paquets, sans conteneurs)

- CPU et RAM par VM : 2 vCPU, 4-8 Go RAM

- Disques par VM : 1 x OS (40 Go), 1 x données (50-200 Go)

- Réseau : un segment de réseau privé (exemple 192.168.56.0/24)

- Noms d'hôtes et IPs (exemple) : ceph1 192.168.56.11, ceph2 192.168.56.12, ceph3 192.168.56.13

Inventaire du laboratoire :

<div class="my-stack-md overflow-x-auto">
<table class="w-full min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Hôte</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Rôles (initiaux)</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">vCPU/RAM</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">OS</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Disques (OS + données)</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">ceph1</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">mon, mgr, osd, mds</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2/8G</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Ubuntu 22.04</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">40G + 100G</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">ceph2</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">mon, osd</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2/4G</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Ubuntu 22.04</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">40G + 100G</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">ceph3</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">mon, osd</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">2/4G</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Ubuntu 22.04</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">40G + 100G</td></tr></tbody>
</table>
</div>
Notes :

- Trois moniteurs (un par nœud) forment un quorum approprié. Évitez les laboratoires à moniteur unique si vous voulez pratiquer le vrai basculement.

- Utilisez des disques de données dédiés pour les OSD. Ne placez pas les données OSD sur le disque OS.

- La synchronisation de l'heure est obligatoire. Activez NTP ou chrony sur tous les nœuds.

## Chemin de configuration sécurisé

Cette section fournit un chemin clair et réversible vers un laboratoire fonctionnel. Toutes les commandes destructives sont étiquetées ; vérifiez deux fois les noms des périphériques avant d'exécuter quoi que ce soit qui modifie les disques.

### Prérequis sur les trois nœuds (exécutez en tant qu'utilisateur avec sudo)

- Définissez les noms d'hôtes et assurez la résolution de noms directe et inverse (ou entrées statiques /etc/hosts) entre les nœuds.

- Assurez la synchronisation de l'heure :

sudo apt update && sudo apt install -y chrony
 sudo systemctl enable --now chrony 

- Désactivez le swap (Ceph préfère fortement l'absence de swap) :

 sudo swapoff -a
 # Commentez toute ligne swap dans /etc/fstab 

- Ouvrez le pare-feu ou désactivez-le dans le réseau de laboratoire. Pour des laboratoires rapides sur Ubuntu, vous pouvez autoriser le trafic Ceph courant ou désactiver temporairement UFW dans le réseau de laboratoire isolé :

 sudo ufw disable 

### Préparer un nœud d'administration

- Utilisez ceph1 comme nœud d'administration. Générez une clé SSH et copiez-la sur ceph1, ceph2, ceph3 pour un accès sans mot de passe :

 ssh-keygen -t ed25519 -C "ceph-admin"
 ssh-copy-id user@ceph1; ssh-copy-id user@ceph2; ssh-copy-id user@ceph3 

- Créez un répertoire de travail :

 mkdir -p ~/ceph-lab && cd ~/ceph-lab 

- Installez ceph-deploy sur le nœud d'administration (installation par paquets, sans conteneurs) :

 sudo apt update && sudo apt install -y ceph-deploy 

### Initialiser la configuration du cluster (adresses d'exemple construites)

- Créez un nouveau cluster avec trois moniteurs :

 ceph-deploy new ceph1 ceph2 ceph3 

- Éditez le fichier ceph.conf généré dans ~/ceph-lab et ajoutez des lignes correspondant à votre réseau :

 public_network = 192.168.56.0/24
 osd_pool_default_size = 3
 osd_pool_default_min_size = 2
 mon_allow_pool_delete = true # laboratoire seulement ; ne pas utiliser en production 

### Installer les paquets Ceph sur tous les nœuds

 ceph-deploy install ceph1 ceph2 ceph3 
 Optionnellement, épinglez une version prise en charge par les paquets de votre distribution.

### Créer les moniteurs initiaux et rassembler les clés

ceph-deploy mon create-initial
ceph-deploy admin ceph1 ceph2 ceph3 
 Sur chaque nœud, vérifiez que /etc/ceph/ceph.client.admin.keyring existe et est lisible par votre utilisateur ou via sudo.

### Déployer un démon gestionnaire

ceph-deploy mgr create ceph1 

### Préparer et créer les OSD (DESTRUCTIF : efface le périphérique cible)

- Assurez-vous que chaque nœud a un disque dédié vide (exemple /dev/sdb ). Vérifiez avec lsblk .

- Pour chaque nœud, exécutez l'une des commandes suivantes depuis le répertoire d'administration :

 ceph-deploy osd create --data /dev/sdb ceph1
 ceph-deploy osd create --data /dev/sdb ceph2
 ceph-deploy osd create --data /dev/sdb ceph3 

### Optionnel : déployer un serveur de métadonnées pour CephFS ultérieurement

 ceph-deploy mds create ceph1 
 À ce stade, le cluster devrait avoir 3 mons, 1 mgr et 3 OSDs up/in.

### Créer un petit RBD pour tests pratiques

- Créez un pool et activez l'application :

sudo ceph osd pool create rbd 32 32 # comptes PG d'exemple construits
 sudo ceph osd pool application enable rbd rbd 

- Créez et mappez une image :

 rbd create --size 512M rbd/labimg
 sudo rbd map rbd/labimg --name client.admin
 sudo mkfs.ext4 /dev/rbd0
 sudo mkdir -p /mnt/rbd && sudo mount /dev/rbd0 /mnt/rbd 

- Test d'écriture rapide et nettoyage :

 dd if=/dev/zero of=/mnt/rbd/testfile bs=4M count=16 status=progress
 ls -lh /mnt/rbd 

### Créer un CephFS minimal pour tests basés sur répertoires

- Créez les pools de données et de métadonnées et un système de fichiers (comptes PG d'exemple construits) :

 sudo ceph osd pool create cephfs_data 32 32
 sudo ceph osd pool create cephfs_metadata 8 8
 sudo ceph fs new cephfs cephfs_metadata cephfs_data 

- Montez via le client noyau (utilise les adresses mon ou noms résolvables dans votre laboratoire) :

 sudo mkdir -p /mnt/cephfs
 sudo mount -t ceph ceph1,ceph2,ceph3:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/ceph.client.admin.keyring 

- Test de répertoire rapide :

 sudo mkdir -p /mnt/cephfs/lab && sudo sh -c 'echo hello > /mnt/cephfs/lab/greeting.txt'
 sudo ls -l /mnt/cephfs/lab 

## Vérification et diagnostics

 Utilisez ces contrôles pour confirmer que le cluster est sain et que les chemins de données fonctionnent comme prévu.

### Matrice de vérification

<div class="my-stack-md overflow-x-auto">
<table class="w-full min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Commande</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Ce qu&#39;elle montre</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Motif attendu</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ceph -s</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Santé globale</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">HEALTH_OK, 3 mons en quorum, 3 osds up/in</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ceph health detail</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Avertissements ou erreurs</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Aucun PG bloqué, aucun nearfull/full</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ceph osd tree</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Placement OSD</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">3 OSDs sous 3 hôtes, poids correspondant aux disques</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ceph df</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Utilisation de l&#39;espace</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Pools listés, used/avail raisonnables</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">rbd ls rbd</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Présence RBD</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">labimg visible</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">mount</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Montages de systèmes de fichiers</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">/mnt/rbd et /mnt/cephfs présents si montés</td></tr></tbody>
</table>
</div>

### Résultats attendus (exemples construits)

- ceph -s affiche quelque chose comme : health: HEALTH_OK; mon: 3 daemons, quorum ceph1, ceph2, ceph3; osd: 3 up, 3 in; mgr: active: ceph1 .

- dd vers /mnt/rbd se termine et le fichier apparaît avec ~64 Mio quand bs=4M count=16 .

- /mnt/cephfs/lab/greeting.txt contient "hello\).

### Diagnostics utiles pendant les expériences

- Suivez l'état des groupes de placement pendant les écritures :

watch -n2 "ceph pg stat" 

- Inspectez les logs OSD pour un démon individuel (chemins variables selon la distribution, exemple construit) :

 sudo journalctl -u ceph-osd@0 -f 

- Confirmez l'état MDS pour CephFS :

 ceph fs status 

## Modes de défaillance et récupération

 Pratiquez-les dans le laboratoire pour développer votre intuition. Notez toujours l'état du cluster avant et après.

### 1. Défaillance de disque OSD (simulée en arrêtant un OSD ou en éteignant un nœud)

Déclencheur : éteignez ceph2 ou arrêtez son OSD :

sudo systemctl stop ceph-osd@0 sur ceph2 
 Observation : ceph -s montre une redondance de données dégradée, PGs remappés, le backfilling peut démarrer.

Chemin de récupération :

- Si transitoire, redémarrez l'OSD : sudo systemctl start ceph-osd@0

- Si disque perdu, marquez l'OSD out, supprimez-le, remplacez le disque et recréez l'OSD :

ceph osd out 0
 ceph osd purge 0 --yes-i-really-mean-it
 # Préparez le disque de remplacement et exécutez :
 ceph-deploy osd create --data /dev/nouveaudisque ceph2 
 Vérification : ceph -s revient à HEALTH_OK et PGs active+clean.

### 2. Perte de quorum des moniteurs (ne pas faire avec moins de 3 mons)

Déclencheur : arrêtez deux démons moniteurs (pour démonstration seulement). Attendez-vous à ce que le cluster devienne indisponible pour les écritures.

Approche de pratique sûre : Arrêtez seulement un moniteur pour voir le quorum réduire à 2/3 :

sudo systemctl stop ceph-mon@ceph2 
 Observation : mon: 2 daemons in quorum ; les clients continuent de fonctionner.

Chemin de récupération : Redémarrez le moniteur et vérifiez que le quorum revient à 3 :

sudo systemctl start ceph-mon@ceph2 
 Vérification : ceph quorum_status

### 3. Cluster nearfull ou full (exemple construit ; attention à ne pas réellement remplir votre disque hôte)

Déclencheur : écrivez de grosses données vers /mnt/rbd jusqu'à l'apparition de l'avertissement nearfull.

Observation : ceph health detail affiche des avertissements nearfull/full et bloque les écritures quand full.

Chemin de récupération : Supprimez les données de test, augmentez optionnellement la capacité en ajoutant un OSD, ou réduisez temporairement la réplication dans le laboratoire (ne compromettez jamais la durabilité en production) :

ceph osd pool set rbd size 2 # laboratoire seulement, revenez à 3 après les tests 
 Vérification : La santé revient à OK ; les écritures réussissent à nouveau.

### 4. PGs mal placés ou sous-dimensionnés après changements de topologie

Déclencheur : ajoutez ou supprimez un OSD.

Observation : ceph -s montre des PGs remapped, backfilling, recovering ; la performance chute temporairement.

Chemin de récupération : Attendez la fin du backfill. Évitez de redémarrer les démons en plein milieu de la récupération.

Vérification : Les PGs atteignent l'état active+clean.

### 5. Échecs d'authentification client ou de montage

Déclencheur : mauvaise clé ou ceph.conf manquant sur le client.

Observation : Le montage ou rbd map échoue avec des erreurs de permission ou introuvable.

Chemin de récupération : Copiez /etc/ceph/* depuis le nœud d'administration vers le client et assurez les bonnes permissions sur la clé.

Vérification : Le montage et rbd map réussissent.

### Procédures de retour arrière et réinitialisation (laboratoire seulement)

- Supprimez un OSD erroné (DESTRUCTIF) :

ceph osd out <id>
 ceph osd purge <id> --yes-i-really-mean-it
 # Effacez manuellement le disque avant réutilisation :
 sudo sgdisk --zap-all /dev/sdb && sudo wipefs -a /dev/sdb 

- Purgez tout le laboratoire (DESTRUCTIF) :

 # Depuis le répertoire d'administration :
 ceph-deploy purge ceph1 ceph2 ceph3
 ceph-deploy purgedata ceph1 ceph2 ceph3
 # Supprimez tout /etc/ceph restant sur les nœuds. 

- Reconstruisez proprement en utilisant les étapes du Chemin de configuration sécurisé.

## Liste de contrôle des opérations

 Utilisez cette liste courte pour répéter le laboratoire de manière cohérente.

### Planification et inventaire

- Choisissez l'OS et les versions Ceph pour tous les nœuds ; notez-les.

- Allouez 3 VMs avec un disque de données supplémentaire chacune ; vérifiez la synchronisation de l'heure.

- Assurez la résolution de noms et l'accès SSH par clés entre les nœuds.

### Mise en route du cluster

- Créez un répertoire de travail et lancez ceph-deploy new ceph1 ceph2 ceph3 .

- Définissez public_network et les défauts de pool dans ceph.conf.

- ceph-deploy install sur tous les nœuds.

- ceph-deploy mon create-initial ; ceph-deploy admin sur tous les nœuds.

- ceph-deploy mgr create ceph1 .

- ceph-deploy osd create --data /dev/sdb sur chaque nœud.

### Tests fonctionnels

- Créez le pool rbd ; activez l'application ; créez et mappez une image de 512M.

- Écrivez un testfile vers /mnt/rbd et listez-le.

- Créez cephfs_data et cephfs_metadata ; ceph fs new ; montez CephFS.

### Vérification

- ceph -s affiche HEALTH_OK ; 3 mons ; 3 osds up/in ; 1 mgr actif.

- ceph df montre les pools avec l'utilisation attendue ; rbd ls affiche labimg.

- mount montre /mnt/rbd et /mnt/cephfs si montés.

### Exercer les défaillances en sécurité

- Arrêtez un seul moniteur et observez le quorum ; redémarrez-le.

- Arrêtez un seul OSD et vérifiez l'état dégradé puis guéri au redémarrage.

- Optionnellement simulez nearfull avec prudence, puis nettoyez.

### Réinitialisation et documentation

- Quand terminé, démontez les clients et supprimez les données de test.

- Si reconstruction, ceph-deploy purge et purgedata , puis répétez la mise en route.

- Capturez vos commandes exactes, versions et observations pour la reproductibilité.

## Conclusion

Vous disposez maintenant d'un laboratoire Ceph compact et réaliste que vous pouvez construire et reconstruire localement pour pratiquer les flux de travail essentiels : formation du quorum, provisionnement OSD, création et mapping RBD, configuration et montage CephFS. Vous avez vérifié la santé avec des contrôles concrets, exercé les modes de défaillance courants, et utilisé des procédures de retour arrière sécurisées pour réinitialiser l'environnement. Gardez le premier pilote étroit et observable, puis étendez progressivement : ajoutez un OSD supplémentaire, testez différentes tailles de pool, ou essayez un client sur une VM séparée. Avec un inventaire cohérent, un chemin de configuration sûr et un runbook court, votre équipe peut apprendre et dépanner Ceph en confiance avant de changer quoi que ce soit dans des environnements plus complexes.