Aller au contenu
medium

Ceph : déployer un stockage distribué unifié

32 min de lecture

logo ceph

Ceph est le système de stockage distribué open source le plus complet : un seul cluster fournit du stockage objet (compatible S3), bloc (RBD) et fichier (CephFS). Conçu pour n’avoir aucun point de défaillance unique, il réplique les données automatiquement grâce à l’algorithme CRUSH. Ce guide vous accompagne du bootstrap d’un cluster 3 nœuds à l’utilisation des trois types de stockage, avec toutes les commandes testées sur Ubuntu 24.04.

  • Architecture Ceph : RADOS, MON, OSD, MGR, MDS et algorithme CRUSH
  • Trois types de stockage : objets RADOS, blocs RBD, fichiers CephFS
  • Lab complet : déployer un cluster 3 nœuds avec KVM et cephadm
  • Commandes essentielles : créer des pools, des images bloc, un CephFS
  • Monitoring : dashboard intégré, Grafana, Prometheus
  • Dépannage et bonnes pratiques : diagnostic, sécurité, performance

Ceph est un système de stockage distribué open source créé en 2004 par Sage Weil dans le cadre de sa thèse de doctorat à l’UC Santa Cruz. Il est conçu pour fournir d’excellentes performances, fiabilité et scalabilité sur du matériel standard.

Analogie : imaginez un entrepôt logistique géant avec des dizaines de hangars (les OSD). Un système intelligent (l’algorithme CRUSH) détermine dans quels hangars stocker chaque colis et crée automatiquement des copies dans d’autres hangars. Des superviseurs (MON) surveillent l’état de chaque hangar, et un tableau de bord (MGR) donne une vue d’ensemble en temps réel. Le tout sans chef central : si un hangar brûle, les colis restent accessibles depuis les copies dans les autres hangars.

CaractéristiqueDescription
Stockage unifiéObjets (S3/Swift), blocs (RBD) et fichiers (CephFS) dans un seul cluster
Algorithme CRUSHPlacement des données sans serveur de métadonnées central pour les objets
Auto-réparationRe-réplication automatique après panne d’un OSD
ScalabilitéDe quelques nœuds à des exaoctets sur des milliers de serveurs
ConteneuriséDéploiement via cephadm avec Docker/Podman
Open sourceLicence LGPL 2.1/3.0, maintenu par la fondation Ceph (Linux Foundation)
CritèreCephGlusterFSMinIONFS classique
Types de stockageObjet + Bloc + FichierFichierObjet (S3)Fichier
ComplexitéÉlevéeModéréeFaibleTrès faible
ScalabilitéExaoctetsPétaoctetsPétaoctetsLimité
Cas d’usage idéalCloud privé completStockage partagéStockage S3Partages simples
MétadonnéesMON + MDS (CephFS)Distribuées (DHT)DistribuéesCentralisées
Intégration KubernetesRook (natif)CSI tiers (Heketi archivé)Native (S3)Provisioner NFS

Architecture d'un cluster Ceph avec ses composants

Un cluster Ceph repose sur une couche de stockage distribuée appelée RADOS (Reliable Autonomic Distributed Object Store) et plusieurs types de daemons :

  • OSD (Object Storage Daemon) : un daemon par disque, responsable du stockage des données, de la réplication et de la récupération. C’est le composant le plus nombreux du cluster.

  • MON (Monitor) : maintient la carte du cluster (cluster map). Un quorum de 3 ou 5 monitors assure la cohérence. Les MON ne stockent pas de données utilisateur.

  • MGR (Manager) : fournit les modules de monitoring (dashboard, Prometheus, Grafana), le balancing et les métriques. Au moins 2 MGR (1 actif + 1 standby).

  • MDS (Metadata Server) : gère les métadonnées du système de fichiers CephFS (arborescence, permissions, verrouillage). Requis uniquement si vous utilisez CephFS.

  • RGW (RADOS Gateway) : passerelle HTTP qui expose une API compatible S3 et Swift. Requis uniquement pour le stockage objet via HTTP.

CRUSH (Controlled Replication Under Scalable Hashing) est l’algorithme qui détermine où stocker chaque objet dans le cluster. Contrairement à une table de correspondance centralisée, CRUSH est un algorithme déterministe : chaque client peut calculer indépendamment la position d’un objet.

Fonctionnement :

  1. Les données sont découpées en objets (4 MiB par défaut pour RBD)
  2. Chaque objet est assigné à un Placement Group (PG)
  3. L’algorithme CRUSH mappe chaque PG vers N OSD (selon le facteur de réplication)
  4. La CRUSH map définit la topologie du cluster (racks, hôtes, disques)

Un pool est un espace logique de stockage avec ses propres règles de réplication :

  • Pool répliqué : chaque objet est copié N fois (typiquement 3). Simple et sûr.
  • Pool erasure-coded : les données sont découpées en fragments avec parité (comme un RAID 5/6). Plus efficace en espace mais plus coûteux en CPU.

Les PG (Placement Groups) sont l’intermédiaire entre les objets et les OSD. Un pool contient typiquement 32 à 256 PG, chaque PG est répliqué sur N OSD.

  • 3 machines virtuelles Ubuntu 24.04 (KVM, VirtualBox ou cloud)
  • 4 Go de RAM et 2 vCPU minimum par VM
  • 1 disque système (20 Go) + 1 disque dédié aux OSD (10 Go minimum) par VM
  • Docker ou Podman installé sur chaque nœud
  • Connectivité réseau entre les 3 nœuds

Le script suivant crée 3 VMs avec cloud-init, chacune avec 2 disques :

#!/bin/bash
# Créer 3 VMs pour le lab Ceph
for i in 1 2 3; do
# Disque système
qemu-img create -f qcow2 /var/lib/libvirt/images/ceph${i}.qcow2 20G
# Disque OSD dédié
qemu-img create -f qcow2 /var/lib/libvirt/images/ceph${i}-osd.qcow2 10G
virt-install --name ceph${i} \
--ram 4096 --vcpus 2 \
--disk /var/lib/libvirt/images/ceph${i}.qcow2 \
--disk /var/lib/libvirt/images/ceph${i}-osd.qcow2 \
--os-variant ubuntu24.04 \
--cloud-init user-data=cloud-init-ceph${i}.yaml \
--network network=default \
--graphics none --noautoconsole
done
  1. Installer cephadm sur le premier nœud

    cephadm est l’outil officiel de déploiement de Ceph. Il gère tous les daemons via des conteneurs Docker ou Podman :

    Fenêtre de terminal
    curl --silent --remote-name --location \
    https://download.ceph.com/rpm-squid/el9/noarch/cephadm
    chmod +x cephadm
    sudo mv cephadm /usr/sbin/

    Le chemin rpm-squid/el9/noarch peut surprendre sur Ubuntu : cephadm est un script Python autonome (“noarch”), le répertoire RPM est simplement le chemin officiel pour le récupérer, il fonctionne sur toute distribution.

    Vérification :

    Fenêtre de terminal
    cephadm version
    # cephadm version 19.2.3 (...) squid (stable)
  2. Bootstrapper le cluster

    Le bootstrap initialise le premier MON, le premier MGR et configure le dashboard :

    Fenêtre de terminal
    sudo cephadm bootstrap \
    --mon-ip 192.168.122.173 \
    --initial-dashboard-password cephadmin \
    --dashboard-password-noupdate \
    --allow-fqdn-hostname

    Cette commande :

    • Crée le premier MON et le premier MGR
    • Active le dashboard (interface web) sur le port 8443
    • Peut déployer Prometheus, Grafana et Alertmanager (selon la version et la configuration)
    • Génère une clé SSH pour la communication entre nœuds

    Vérification :

    Fenêtre de terminal
    sudo ceph --version
    # ceph version 19.2.3 (c92aebb...) squid (stable)
  3. Installer les outils CLI

    Pour utiliser les commandes Ceph en dehors du conteneur :

    Fenêtre de terminal
    sudo cephadm install ceph-common
  4. Ajouter les nœuds au cluster

    Récupérez la clé SSH publique de Ceph et copiez-la sur chaque nœud :

    Fenêtre de terminal
    # Récupérer la clé SSH de Ceph
    sudo cat /etc/ceph/ceph.pub
    # Copier cette clé dans /root/.ssh/authorized_keys sur ceph2 et ceph3
    # Ajouter les nœuds
    sudo ceph orch host add ceph2 192.168.122.174
    sudo ceph orch host add ceph3 192.168.122.175

    Vérification :

    Fenêtre de terminal
    sudo ceph orch host ls
    # HOST ADDR LABELS STATUS
    # ceph1 192.168.122.173 _admin
    # ceph2 192.168.122.174
    # ceph3 192.168.122.175

    Cephadm déploie automatiquement les MON et MGR supplémentaires sur les nouveaux nœuds.

  5. Déployer les OSD

    Les OSD utilisent les disques vierges disponibles sur chaque nœud :

    Fenêtre de terminal
    sudo ceph orch apply osd --all-available-devices

    Attendez 1 à 2 minutes que les OSD se déploient, puis vérifiez :

    Fenêtre de terminal
    sudo ceph status
    cluster:
    id: 900350e1-148f-11f1-a563-525400ccdd01
    health: HEALTH_OK
    services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3
    mgr: ceph1.llmtxu(active), standbys: ceph2.ybyuif
    osd: 3 osds: 3 up, 3 in
    data:
    pools: 1 pools, 1 pgs
    objects: 2 objects, 449 KiB
    usage: 80 MiB used, 30 GiB / 30 GiB avail
    pgs: 1 active+clean
  6. Vérifier la topologie CRUSH

    L’arbre OSD montre la répartition des disques par hôte :

    Fenêtre de terminal
    sudo ceph osd tree
    ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
    -1 0.02939 root default
    -3 0.00980 host ceph1
    0 hdd 0.00980 osd.0 up 1.00000 1.00000
    -5 0.00980 host ceph2
    1 hdd 0.00980 osd.1 up 1.00000 1.00000
    -7 0.00980 host ceph3
    2 hdd 0.00980 osd.2 up 1.00000 1.00000

Après le bootstrap et l’ajout des nœuds, cephadm peut déployer automatiquement une pile complète de monitoring (le comportement exact dépend de la version et des options de bootstrap) :

Fenêtre de terminal
sudo ceph orch ls
NAME PORTS RUNNING REFRESHED AGE PLACEMENT
alertmanager ?:9093,9094 1/1 103s ago 10m count:1
ceph-exporter 3/3 103s ago 10m *
crash 3/3 103s ago 10m *
grafana ?:3000 1/1 103s ago 10m count:1
mgr 2/2 103s ago 10m count:2
mon 3/5 103s ago 10m count:5
node-exporter ?:9100 3/3 103s ago 10m *
osd.all-available-devices 3 103s ago 4m *
prometheus ?:9095 1/1 103s ago 10m count:1

La liste détaillée des daemons :

Fenêtre de terminal
sudo ceph orch ps
NAME HOST PORTS STATUS VERSION IMAGE ID
alertmanager.ceph1 ceph1 *:9093,9094 running 0.25.0 c8568f914cd2
crash.ceph1 ceph1 running 19.2.3 aade1b12b8e6
crash.ceph2 ceph2 running 19.2.3 aade1b12b8e6
crash.ceph3 ceph3 running 19.2.3 aade1b12b8e6
grafana.ceph1 ceph1 *:3000 running 10.4.0 c8b91775d855
mgr.ceph1.llmtxu ceph1 *:9283,8443 running 19.2.3 aade1b12b8e6
mgr.ceph2.ybyuif ceph2 *:8443,9283 running 19.2.3 aade1b12b8e6
mon.ceph1 ceph1 running 19.2.3 aade1b12b8e6
mon.ceph2 ceph2 running 19.2.3 aade1b12b8e6
mon.ceph3 ceph3 running 19.2.3 aade1b12b8e6
osd.0 ceph1 running 19.2.3 aade1b12b8e6
osd.1 ceph2 running 19.2.3 aade1b12b8e6
osd.2 ceph3 running 19.2.3 aade1b12b8e6
prometheus.ceph1 ceph1 *:9095 running 2.51.0 1d3b7f56885b

RADOS est la couche fondamentale de Ceph. Tous les types de stockage (RBD, CephFS, RGW) reposent dessus. Vous pouvez interagir directement avec RADOS via la commande rados.

Fenêtre de terminal
# Créer un pool répliqué avec 32 PG
sudo ceph osd pool create test-pool 32 32 replicated
# Configurer la réplication (3 copies)
sudo ceph osd pool set test-pool size 3
# Activer l'application sur le pool
sudo ceph osd pool application enable test-pool rbd
Fenêtre de terminal
# Écrire un objet dans le pool
echo "Bonjour depuis le cluster Ceph !" | sudo rados -p test-pool put test-object -
# Lister les objets du pool
sudo rados -p test-pool ls
# test-object
# Lire un objet
sudo rados -p test-pool get test-object -
# Bonjour depuis le cluster Ceph !
Fenêtre de terminal
sudo ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 30 GiB 30 GiB 100 MiB 100 MiB 0.33
TOTAL 30 GiB 30 GiB 100 MiB 100 MiB 0.33
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.mgr 1 1 449 KiB 2 904 KiB 0 14 GiB
test-pool 2 32 33 B 1 12 KiB 0 9.5 GiB
rbd-pool 3 32 652 KiB 12 1.3 MiB 0 14 GiB
cephfs.cephfs.meta 4 16 6.2 KiB 22 72 KiB 0 14 GiB
cephfs.cephfs.data 5 128 12 B 1 8 KiB 0 14 GiB

RBD (RADOS Block Device) fournit des volumes bloc similaires à des disques durs virtuels. Chaque image RBD est découpée en objets de 4 MiB et répliquée dans le cluster. C’est le choix idéal pour les VM, les bases de données et Kubernetes (via le CSI driver).

  1. Créer le pool RBD et l’image

    Fenêtre de terminal
    # Créer un pool dédié au stockage bloc
    sudo ceph osd pool create rbd-pool 32 32 replicated
    sudo ceph osd pool application enable rbd-pool rbd
    # Créer une image de 1 Go
    sudo rbd create rbd-pool/test-image --size 1024
  2. Vérifier l’image

    Fenêtre de terminal
    sudo rbd ls rbd-pool
    # test-image
    sudo rbd info rbd-pool/test-image
    rbd image 'test-image':
    size 1 GiB in 256 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 8546de9f7be9
    block_name_prefix: rbd_data.8546de9f7be9
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    create_timestamp: Sat Feb 28 10:35:46 2026
  3. Mapper, formater et monter

    /dev/rbd0
    # Mapper l'image RBD comme block device
    sudo rbd map rbd-pool/test-image
    # Formater en ext4
    sudo mkfs.ext4 /dev/rbd0
    # Monter
    sudo mkdir -p /mnt/rbd-test
    sudo mount /dev/rbd0 /mnt/rbd-test
    # Écrire un fichier de test
    echo "Test RBD Ceph" | sudo tee /mnt/rbd-test/test.txt
    # Test RBD Ceph
  4. Vérifier le montage

    Fenêtre de terminal
    df -h /mnt/rbd-test
    Filesystem Size Used Avail Use% Mounted on
    /dev/rbd0 974M 28K 907M 1% /mnt/rbd-test
FonctionnalitéDescription
Snapshotsrbd snap create rbd-pool/test-image@snap1 — sauvegarde instantanée
ClonesCréer un volume à partir d’un snapshot (Copy-on-Write)
MirroringRéplication asynchrone vers un autre cluster Ceph
EncryptionChiffrement côté client (LUKS) depuis la version Pacific
QoSLimitation d’IOPS et de bande passante par image

CephFS fournit un système de fichiers POSIX distribué. Il utilise un serveur de métadonnées (MDS) pour gérer l’arborescence et les permissions, tandis que les données sont stockées directement dans RADOS.

Fenêtre de terminal
# Créer le volume CephFS (crée automatiquement les pools data et metadata)
sudo ceph fs volume create cephfs

Vérification :

Fenêtre de terminal
sudo ceph fs ls
# name: cephfs, metadata pool: cephfs.cephfs.meta, data pools: [cephfs.cephfs.data ]
Fenêtre de terminal
sudo ceph fs status cephfs
cephfs - 0 clients
======
RANK STATE MDS ACTIVITY DNS INOS DIRS CAPS
0 active cephfs.ceph1.eajrqr Reqs: 0 /s 10 13 12 0
POOL TYPE USED AVAIL
cephfs.cephfs.meta metadata 64.0k 14.2G
cephfs.cephfs.data data 0 14.2G
STANDBY MDS
cephfs.ceph3.docawv
MDS version: ceph version 19.2.3 (c92aebb...) squid (stable)

Le montage FUSE est le plus simple et ne nécessite pas de module noyau. Idéal pour le lab et le dépannage :

Fenêtre de terminal
sudo apt-get install -y ceph-fuse
sudo mkdir -p /mnt/cephfs
sudo ceph-fuse /mnt/cephfs

Test d’écriture :

Fenêtre de terminal
echo "Test CephFS" | sudo tee /mnt/cephfs/test.txt
# Test CephFS
df -h /mnt/cephfs
Filesystem Size Used Avail Use% Mounted on
ceph-fuse 15G 0 15G 0% /mnt/cephfs
Cas d’usageAdapté ?Alternative
Partages de fichiers en équipe✅ OuiNFS, GlusterFS
Home directories✅ OuiNFS
Données d’applications conteneurisées✅ Oui (via CSI)RBD
Base de données⚠️ Préférer RBDRBD
Stockage S3❌ Utiliser RGWRGW
Fenêtre de terminal
# Statut global (commande la plus utilisée)
sudo ceph status
# Détail des problèmes de santé
sudo ceph health detail
# Utilisation du stockage par pool
sudo ceph df
# Arbre OSD (topologie CRUSH)
sudo ceph osd tree
# Crashs récents (devrait être vide)
sudo ceph crash ls
Fenêtre de terminal
# Lister les pools avec détails
sudo ceph osd pool ls detail
# Créer un pool répliqué
sudo ceph osd pool create mon-pool 32 32 replicated
# Configurer la taille de réplication
sudo ceph osd pool set mon-pool size 3
# Activer l'application
sudo ceph osd pool application enable mon-pool rbd
# Supprimer un pool (double confirmation)
sudo ceph osd pool rm mon-pool mon-pool --yes-i-really-really-mean-it
Fenêtre de terminal
# Lister les hôtes
sudo ceph orch host ls
# Lister les services
sudo ceph orch ls
# Lister les daemons
sudo ceph orch ps
# Ajouter un hôte
sudo ceph orch host add nouveau-noeud 10.0.0.10
# Supprimer un hôte
sudo ceph orch host rm ancien-noeud
# Redémarrer un service
sudo ceph orch restart mon
Fenêtre de terminal
# Lister les disques disponibles
sudo ceph orch device ls
# Déployer les OSD sur tous les disques disponibles
sudo ceph orch apply osd --all-available-devices
# Marquer un OSD hors service (maintenance)
sudo ceph osd out 0
# Remettre un OSD en service
sudo ceph osd in 0

Ceph utilise par défaut CephX, un protocole d’authentification basé sur des clés partagées. Chaque client et chaque daemon possède une clé unique.

Fenêtre de terminal
# Lister les clés d'authentification
sudo ceph auth ls
# Créer un utilisateur avec accès restreint
sudo ceph auth get-or-create client.app \
mon 'allow r' \
osd 'allow rw pool=app-pool' \
-o /etc/ceph/ceph.client.app.keyring
PratiqueDescription
Réseau dédiéSéparer le réseau public (clients) du réseau cluster (réplication OSD)
Utilisateurs restreintsCréer un utilisateur CephX par application avec des droits minimaux
Chiffrement en transitActiver ms_cluster_mode = secure pour le trafic inter-daemon
Pare-feuPorts MON : 3300 (msgr2/v2, privilégié) et 6789 (v1 legacy/compat). OSD/MDS/MGR : 6800-7300. Dashboard : 8443. Prometheus MGR : 9283
Dashboard HTTPSToujours actif par défaut avec certificat auto-signé
Mise à jourSuivre les releases de sécurité, cephadm facilite les upgrades rolling
SymptômeCause probableSolution
HEALTH_WARN: X OSD(s) downDaemon OSD en pannesudo ceph orch daemon restart osd.X
HEALTH_WARN: pool X has no applicationApplication non activéesudo ceph osd pool application enable X rbd
HEALTH_WARN: X nearfull osd(s)Disque OSD presque pleinAjouter des OSD ou supprimer des données
HEALTH_ERR: X pg(s) degradedRéplication incomplèteVérifier les OSD down avec ceph osd tree
ceph orch host add échoueClé SSH non copiéeCopier /etc/ceph/ceph.pub dans authorized_keys du root
Dashboard inaccessiblePort 8443 bloquésudo ufw allow 8443/tcp
no available devicesDisques déjà utiliséssudo ceph orch device ls pour vérifier, ceph-volume lvm zap pour nettoyer
clock skew detectedHorloge désynchroniséeInstaller et configurer chrony sur tous les nœuds
Fenêtre de terminal
# Vérifier la santé détaillée
sudo ceph health detail
# Voir le statut de chaque PG
sudo ceph pg stat
# Analyser la performance en temps réel
sudo ceph osd perf
# Voir les événements récents
sudo ceph log last 20
# Tester les performances d'un pool
sudo rados bench -p test-pool 30 write --no-cleanup
sudo rados bench -p test-pool 30 seq
ComposantMinimum (test)Recommandé (production)
MON35 (tolérance 2 pannes)
OSD310+ (au moins 3 hôtes)
RAM par OSD2 Go8 Go (Bluestore)
Réseau1 Gbps10 Gbps (25 Gbps idéal)
Disques OSDHDDSSD pour WAL/DB + HDD données
MGR12 (actif + standby)
  • Chaque OSD utilise un disque dédié : pas de partitions partagées.
  • Séparer WAL/DB sur SSD si les données sont sur HDD : ceph-volume lvm create --data /dev/sdb --block.db /dev/nvme0n1p1
  • Utiliser des pools séparés par application (bases de données, fichiers, objets).
  • PG Autoscaler activé : voir la section Créer un pool pour le détail. Vérifiez avec ceph osd pool autoscale-status.
  • Étiqueter les hôtes avec des labels pour contrôler le placement : ceph orch host label add ceph1 osd.
  • BlueStore (par défaut depuis Luminous) : stockage natif sur disque, sans filesystem intermédiaire.
  • Compression : activer la compression sur les pools peu sensibles à la latence : ceph osd pool set pool-name compression_algorithm lz4.
  • Cache tiering : utiliser un pool SSD comme cache devant un pool HDD pour les workloads mixtes.
  • Réduire le facteur de réplication à 2 pour les données non critiques (logs, caches temporaires).
  • Ceph = stockage unifié : objets (S3), blocs (RBD) et fichiers (CephFS) dans un même cluster.
  • RADOS est la couche fondamentale : tous les types de stockage reposent dessus.
  • CRUSH élimine le point de défaillance central : chaque client calcule indépendamment où stocker les données.
  • cephadm simplifie le déploiement : un seul outil pour bootstrapper, ajouter des nœuds et gérer les daemons en conteneurs.
  • 3 MON minimum pour le quorum, 3 OSD minimum pour la réplication.
  • RBD pour les VM et bases de données, CephFS pour le partage de fichiers, RGW pour l’accès S3.
  • Monitoring inclus : dashboard, Prometheus, Grafana déployés automatiquement.
  • Séparer les réseaux public et cluster en production pour éviter la saturation.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.