Stockage

Rook / Ceph

Opérateur Kubernetes pour Ceph. Stockage bloc (RBD), fichier (CephFS) et objet S3 (RGW). Production-grade, CNCF graduated. 3 nœuds avec disques dédiés minimum.

Rook est un opérateur Kubernetes qui automatise le déploiement, la configuration et la gestion de Ceph, le système de stockage distribué open source le plus complet. Rook traduit les concepts Ceph en ressources Kubernetes (CRDs) et prend en charge la totalité du cycle de vie : installation, scaling, mises à jour, récupération après panne.

Ceph offre trois types de stockage en un seul cluster : bloc (RBD via CSI), fichier partagé (CephFS, ReadWriteMany) et objet compatible S3 (RADOS Gateway). C'est la solution de référence pour les clusters on-premises exigeants. Rook est un projet CNCF graduated depuis 2020.


Informations essentielles

Origine : Rook : communauté CNCF  ·  Ceph : Red Hat / communauté  ·  Licence : Apache 2.0 (Rook), LGPL 2.1 (Ceph)

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Architectures : x86_64, ARM64

Support : Rook maintient les 2 dernières versions majeures. Ceph suit son propre cycle (LTS ~2 ans).

Stack par défaut

ComposantValeur
Stockage blocCeph RBD via CSI (ReadWriteOnce)
Stockage fichierCephFS via CSI (ReadWriteMany)
Stockage objetRADOS Gateway - API S3 et Swift
Réplication3 par défaut (pool replicated) ou erasure coding
InterfaceCeph Dashboard (HTTPS, port 8443)
Kubernetes minimum1.25+ (Rook 1.14)

Composants Ceph

ComposantRôleNombre recommandé
MON (Monitor)Quorum du cluster, carte des données (CRUSH map)3 ou 5 (impair)
MGR (Manager)Metrics, dashboard, modules de gestion2 (actif/passif)
OSD (Object Storage Daemon)Stockage réel des données, 1 par disque≥ 3
MDS (Metadata Server)Métadonnées CephFS uniquement1 actif + 1 standby
RGW (RADOS Gateway)API S3/Swift1 ou + selon charge

Prérequis

RessourceValeur
Kubernetes1.25+
Nœuds3 minimum, 1 disque brut par nœud pour les OSD
Disques OSDNon formatés, sans partition, sans système de fichiers
RAM4-8 GB par nœud (OSD utilise ~1 GB par OSD)
Kernel4.17+ (RBD), 5.4+ (CephFS avec kernel client)

Vérifier les disques disponibles

# Les disques OSD ne doivent pas avoir de système de fichiers
lsblk -f
# Les disques destinés aux OSD doivent afficher FSTYPE vide

# Nettoyer un disque si nécessaire (DÉTRUIT LES DONNÉES)
sudo wipefs -a /dev/sdb
sudo sgdisk --zap-all /dev/sdb

Installation

1. Déployer l'opérateur Rook

git clone --single-branch --branch v1.14.0 https://github.com/rook/rook.git
cd rook/deploy/examples

# CRDs, RBAC, opérateur
kubectl create -f crds.yaml -f common.yaml -f operator.yaml

# Vérifier l'opérateur
kubectl -n rook-ceph rollout status deploy/rook-ceph-operator

2. Créer le cluster Ceph

# cluster.yaml - configuration minimale pour 3 nœuds
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: quay.io/ceph/ceph:v18.2.0        # Ceph Reef (LTS)
    allowUnsupported: false
  dataDirHostPath: /var/lib/rook
  mon:
    count: 3
    allowMultiplePerNode: false
  mgr:
    count: 2
  storage:
    useAllNodes: true
    useAllDevices: true                      # Utiliser tous les disques non partitionnés
    # Ou spécifier les disques explicitement :
    # nodes:
    # - name: "node1"
    #   devices:
    #   - name: sdb
  dashboard:
    enabled: true
    ssl: true
kubectl create -f cluster.yaml

# Suivre la progression (peut prendre 5-10 min)
watch kubectl get pods -n rook-ceph
kubectl -n rook-ceph get cephcluster
# HEALTH_OK = cluster prêt

3. Créer les StorageClasses

Stockage bloc (RBD)

# storageclass-rbd.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: replicapool
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: replicapool
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true

Stockage fichier partagé (CephFS - ReadWriteMany)

# filesystem.yaml
apiVersion: ceph.rook.io/v1
kind: CephFilesystem
metadata:
  name: myfs
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
  dataPools:
  - name: replicated
    replicated:
      size: 3
  metadataServer:
    activeCount: 1
    activeStandby: true
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-cephfs
provisioner: rook-ceph.cephfs.csi.ceph.com
parameters:
  clusterID: rook-ceph
  fsName: myfs
  pool: myfs-replicated
  csi.storage.k8s.io/provisioner-secret-name: rook-csi-cephfs-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
  csi.storage.k8s.io/node-stage-secret-name: rook-csi-cephfs-node
  csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
allowVolumeExpansion: true
kubectl create -f storageclass-rbd.yaml
kubectl create -f filesystem.yaml

Stockage objet (S3 via RGW)

apiVersion: ceph.rook.io/v1
kind: CephObjectStore
metadata:
  name: my-store
  namespace: rook-ceph
spec:
  metadataPool:
    replicated:
      size: 3
  dataPool:
    replicated:
      size: 3
  gateway:
    port: 80
    instances: 1
kubectl create -f object-store.yaml

# Récupérer l'endpoint S3
kubectl -n rook-ceph get svc rook-ceph-rgw-my-store

Accéder au dashboard Ceph

kubectl -n rook-ceph port-forward svc/rook-ceph-mgr-dashboard 8443:8443

# Récupérer le mot de passe admin
kubectl -n rook-ceph get secret rook-ceph-dashboard-password \
  -o jsonpath="{['data']['password']}" | base64 --decode
# Ouvrir https://localhost:8443 (user: admin)

Vérification de l'installation

# 1. État global du cluster Ceph (via la toolbox)
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph status
# Attendre HEALTH_OK (peut prendre 5-10 min après install)
# HEALTH_WARN "too few PGs" est normal à l'install, il se résout seul

# 2. Vérifier les composants
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph osd status
# Tous les OSDs doivent être "up" et "in"

kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- ceph df
# Affiche la capacité totale, utilisée et disponible

# 3. Vérifier les StorageClasses créées
kubectl get storageclass | grep rook
# rook-ceph-block (RBD) et rook-cephfs (CephFS) doivent apparaître

# 4. Vérifier que le CSI driver est opérationnel
kubectl -n rook-ceph get pods | grep csi
# csi-rbdplugin et csi-cephfsplugin doivent être Running (1/1)

Premier test de bout en bout

Test RBD (bloc, ReadWriteOnce)

# test-rook-rbd.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-rbd-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: rook-ceph-block
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-rbd
  namespace: default
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c", "echo 'Rook RBD OK' > /mnt/test.txt && cat /mnt/test.txt && sleep 3600"]
    volumeMounts:
    - name: data
      mountPath: /mnt
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-rbd-pvc
kubectl apply -f test-rook-rbd.yaml
kubectl get pvc test-rbd-pvc -w          # Doit passer Pending → Bound
kubectl logs test-rbd                    # Doit afficher "Rook RBD OK"

# Vérifier l'image RBD créée (depuis la toolbox)
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- rbd ls replicapool

Test CephFS (fichier partagé, ReadWriteMany)

# test-rook-cephfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-cephfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: rook-cephfs
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-cephfs-writer
  namespace: default
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c", "echo 'CephFS OK' > /mnt/test.txt && sleep 3600"]
    volumeMounts:
    - name: data
      mountPath: /mnt
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-cephfs-pvc
---
apiVersion: v1
kind: Pod
metadata:
  name: test-cephfs-reader
  namespace: default
spec:
  containers:
  - name: reader
    image: busybox
    command: ["/bin/sh", "-c", "sleep 5 && cat /mnt/test.txt && sleep 3600"]
    volumeMounts:
    - name: data
      mountPath: /mnt
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-cephfs-pvc
kubectl apply -f test-rook-cephfs.yaml
sleep 10
kubectl logs test-cephfs-reader
# Doit afficher "CephFS OK" (le reader lit ce qu'a écrit le writer via RWX)

# Nettoyage
kubectl delete -f test-rook-rbd.yaml -f test-rook-cephfs.yaml

Mise à jour

# Mettre à jour l'opérateur Rook
cd rook/deploy/examples
git pull
kubectl apply -f crds.yaml -f common.yaml -f operator.yaml

# La version Ceph se met à jour via le champ cephVersion.image dans CephCluster
kubectl -n rook-ceph edit cephcluster rook-ceph
# Changer image: quay.io/ceph/ceph:v18.2.x → v19.x.x

Toujours mettre à jour Rook avant Ceph. Lire les notes de migration - certaines versions requièrent des étapes manuelles.


Troubleshooting

# État du cluster
kubectl -n rook-ceph get cephcluster
kubectl -n rook-ceph get pods

# Toolbox Ceph (accès CLI ceph)
kubectl create -f deploy/examples/toolbox.yaml
kubectl -n rook-ceph exec -it deploy/rook-ceph-tools -- bash

# Dans la toolbox
ceph status
ceph osd status
ceph df
ceph health detail

Cluster en HEALTH_WARN ou HEALTH_ERR

# Dans la toolbox
ceph health detail            # Détail des warnings
ceph osd tree                 # Arbre des OSD (voir les down/out)
ceph osd repair <id>          # Lancer une réparation
ceph pg dump_stuck             # PGs bloqués

OSD ne démarre pas

# Logs de l'OSD
kubectl -n rook-ceph logs <pod-osd-xxx>

# Vérifier que le disque est propre
lsblk -f /dev/sdb              # Doit afficher FSTYPE vide

Commandes utiles (depuis la toolbox)

ceph status                    # État général du cluster
ceph osd status                # État des OSDs
ceph df                        # Espace utilisé / disponible
ceph health detail             # Détail des problèmes
ceph osd pool ls               # Lister les pools
ceph osd pool stats            # Statistiques par pool
ceph osd pool get <pool> all   # Paramètres d'un pool
rados df                       # Espace par pool
rbd ls <pool>                  # Lister les images RBD d'un pool

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic