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
| Composant | Valeur |
|---|---|
| Stockage bloc | Ceph RBD via CSI (ReadWriteOnce) |
| Stockage fichier | CephFS via CSI (ReadWriteMany) |
| Stockage objet | RADOS Gateway - API S3 et Swift |
| Réplication | 3 par défaut (pool replicated) ou erasure coding |
| Interface | Ceph Dashboard (HTTPS, port 8443) |
| Kubernetes minimum | 1.25+ (Rook 1.14) |
Composants Ceph
| Composant | Rôle | Nombre recommandé |
|---|---|---|
| MON (Monitor) | Quorum du cluster, carte des données (CRUSH map) | 3 ou 5 (impair) |
| MGR (Manager) | Metrics, dashboard, modules de gestion | 2 (actif/passif) |
| OSD (Object Storage Daemon) | Stockage réel des données, 1 par disque | ≥ 3 |
| MDS (Metadata Server) | Métadonnées CephFS uniquement | 1 actif + 1 standby |
| RGW (RADOS Gateway) | API S3/Swift | 1 ou + selon charge |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.25+ |
| Nœuds | 3 minimum, 1 disque brut par nœud pour les OSD |
| Disques OSD | Non formatés, sans partition, sans système de fichiers |
| RAM | 4-8 GB par nœud (OSD utilise ~1 GB par OSD) |
| Kernel | 4.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
- Documentation Rook : https://rook.io/docs/rook/latest/
- Exemples de configuration : https://github.com/rook/rook/tree/master/deploy/examples
- Documentation Ceph : https://docs.ceph.com/
- GitHub Rook : https://github.com/rook/rook
- Releases : https://github.com/rook/rook/releases
- Matrice de compatibilité Rook/Ceph/K8s : https://rook.io/docs/rook/latest/Getting-Started/k8s-pre-reqs/