OpenEBS est une solution de stockage cloud-native pour Kubernetes créée par MayaData (acquis par DataCore Software en 2021) et projet CNCF Sandbox (réaccepté en octobre 2024 après une période d'archivage). Son approche est modulaire : plusieurs moteurs de stockage coexistent, chacun optimisé pour un cas d'usage. On choisit le moteur selon le workload, et non l'inverse.
Le moteur recommandé pour les nouveaux déploiements en production est Mayastor (hautes performances, NVMe/TCP, réplication synchrone). Pour des cas simples sans réplication, Local PV Hostpath ou Local PV Device suffisent et sont quasi sans overhead.
Informations essentielles
Origine : MayaData / DataCore Software → CNCF · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases
Support : Les 2 dernières versions majeures sont maintenues avec correctifs de sécurité.
Moteurs disponibles
| Moteur | Type | Réplication | Usage recommandé |
|---|---|---|---|
| Mayastor | Bloc (NVMe/TCP) | Oui (synchrone) | Production, bases de données, haute perf |
| Local PV Hostpath | Local | Non | Dev, CI, workloads mono-nœud |
| Local PV Device | Local (block device) | Non | Performances locales maximales |
| cStor | Bloc (iSCSI) | Oui | Production (legacy, maintenu) |
| Jiva | Bloc (iSCSI) | Oui | Workloads légers répliqués |
Mayastor est le successeur de cStor pour les nouveaux déploiements. cStor reste supporté mais n'est plus recommandé pour de nouvelles installations.
Prérequis
Communs à tous les moteurs
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.23+ |
| Helm | 3.x |
| Droits | cluster-admin |
Prérequis supplémentaires Mayastor
| Ressource | Valeur |
|---|---|
| CPU | Support des instructions AVX (processeurs modernes) |
| Hugepages | 1024 x 2Mi hugepages par nœud de stockage |
| Kernel | 5.13+ (io_uring) |
| Disques | Disques bruts (non montés) dédiés aux OSD |
Configurer les hugepages (Mayastor)
# Activation permanente
echo 'vm.nr_hugepages = 1024' | sudo tee /etc/sysctl.d/hugepages.conf
sudo sysctl --system
# Vérifier
grep HugePages_Total /proc/meminfo
# HugePages_Total: 1024
Installation
Via Helm (recommandé)
helm repo add openebs https://openebs.github.io/openebs
helm repo update
# Installation avec Mayastor + Local PV (recommandé)
helm install openebs openebs/openebs \
--namespace openebs \
--create-namespace \
--set engines.replicated.mayastor.enabled=true \
--set engines.local.lvm.enabled=false \
--set engines.local.zfs.enabled=false
# Vérifier
kubectl get pods -n openebs
Installation minimale - Local PV uniquement
helm install openebs openebs/openebs \
--namespace openebs \
--create-namespace \
--set engines.replicated.mayastor.enabled=false
Vérifier Mayastor
# DiskPool à créer par nœud (1 disque brut par nœud)
kubectl get diskpool -n openebs
# Les DiskPools doivent être en état Online
Vérification de l'installation
# 1. Pods OpenEBS
kubectl get pods -n openebs
# Composants attendus selon les moteurs activés :
# - openebs-localpv-provisioner (Local PV)
# - io-engine-* (DaemonSet Mayastor, 1 par nœud de stockage)
# - agent-core (Mayastor control plane)
# 2. Vérifier les DiskPools Mayastor
kubectl get diskpool -n openebs
# STATUS doit être Online pour chaque pool
# Capacity/Used affiche l'espace disponible
# 3. Vérifier les StorageClasses
kubectl get sc | grep openebs
# 4. Vérifier les logs Mayastor si un DiskPool est en erreur
kubectl logs -n openebs \
$(kubectl get pod -n openebs -l app=io-engine \
--field-selector spec.nodeName=<node-name> \
-o jsonpath='{.items[0].metadata.name}') --tail=30
Pièges courants à l'installation
| Symptôme | Cause | Correction |
|---|---|---|
DiskPool en état Error | Hugepages non configurées | echo 1024 > /proc/sys/vm/nr_hugepages sur chaque nœud |
DiskPool en état Error | Disque non disponible ou déjà monté | lsblk -f /dev/sdb - FSTYPE doit être vide |
io-engine en CrashLoopBackOff | CPU sans AVX ou kernel < 5.13 | Vérifier grep avx /proc/cpuinfo et la version kernel |
Local PV PVC Pending | WaitForFirstConsumer attend le pod | Normal - créer le pod pour déclencher le binding |
Moteur Mayastor (production)
Créer les DiskPools
Chaque nœud de stockage Mayastor doit avoir au moins un DiskPool pointant vers un disque ou partition brut :
# diskpool-node1.yaml
apiVersion: openebs.io/v1beta2
kind: DiskPool
metadata:
name: pool-node1
namespace: openebs
spec:
node: node1
disks:
- uring:///dev/sdb # Disque brut sans partition
kubectl apply -f diskpool-node1.yaml
kubectl get diskpool -n openebs
# STATUS doit être Online
StorageClass Mayastor
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mayastor-3replicas
parameters:
ioTimeout: "30"
protocol: nvmf
repl: "3" # Facteur de réplication
provisioner: io.openebs.csi-mayastor
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: Immediate
kubectl apply -f storageclass-mayastor.yaml
PVC Mayastor
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: db-data
namespace: production
spec:
accessModes:
- ReadWriteOnce
storageClassName: mayastor-3replicas
resources:
requests:
storage: 20Gi
Premier test Mayastor
# test-mayastor.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-mayastor-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: mayastor-3replicas
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: test-mayastor
namespace: default
spec:
containers:
- name: writer
image: busybox
command: ["/bin/sh", "-c"]
args:
- |
echo "Mayastor OK $(date)" > /data/test.txt
cat /data/test.txt
df -h /data
sleep 3600
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: test-mayastor-pvc
kubectl apply -f test-mayastor.yaml
kubectl get pvc test-mayastor-pvc -w
# Pending → Bound (quelques secondes)
kubectl logs test-mayastor
# "Mayastor OK <date>" + df affichant ~1G disponible
# Vérifier la réplication (3 replicas sur 3 pools différents)
kubectl get msv -n openebs 2>/dev/null || \
kubectl get nexus -n openebs 2>/dev/null
# Affiche l'état des volumes Mayastor
# Nettoyage
kubectl delete -f test-mayastor.yaml
Moteur Local PV Hostpath (dev / CI)
Aucun prérequis hardware. Les données sont stockées dans un répertoire du nœud (pas de réplication).
StorageClass Local PV Hostpath
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-hostpath
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
storageType: hostpath
basePath: /var/openebs/local
WaitForFirstConsumergarantit que le PV est créé sur le même nœud que le pod qui l'utilise.
Moteur Local PV Device
Pour accéder directement à un disque brut depuis un pod (performance maximale, pas de filesystem overhead) :
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-device
provisioner: openebs.io/local
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
storageType: device
blockDeviceSelectors:
ndm.io/disk-type: "SSD" # Sélectionner uniquement les SSD
Mise à jour
helm repo update
helm upgrade openebs openebs/openebs \
--namespace openebs \
--reuse-values
kubectl rollout status deploy/openebs-localpv-provisioner -n openebs
kubectl get pods -n openebs
Pour Mayastor, vérifier les notes de migration - des changements de DiskPool ou de CRD peuvent être requis entre versions majeures.
Troubleshooting
# État général
kubectl get pods -n openebs
kubectl get diskpool -n openebs # Mayastor uniquement
# Logs du provisioner Local PV
kubectl logs -n openebs -l name=openebs-localpv-provisioner --tail=50
# Logs Mayastor
kubectl logs -n openebs -l app=io-engine --tail=100
# Describe un PVC bloqué
kubectl describe pvc <nom> -n <namespace>
DiskPool en état Error
# Vérifier que le disque est bien disponible et non monté
kubectl describe diskpool <nom> -n openebs
# Sur le nœud concerné
lsblk -f /dev/sdb # FSTYPE doit être vide
PVC bloqué en Pending avec Local PV
# Vérifier le volumeBindingMode (WaitForFirstConsumer = attend que le pod soit schedulé)
kubectl describe pvc <nom> -n <namespace>
kubectl describe sc <storageclass>
Commandes utiles
# Ressources OpenEBS
kubectl get diskpool -n openebs # DiskPools Mayastor
kubectl get blockdevice -n openebs # Disques détectés par NDM
kubectl get blockdeviceclaim -n openebs # Disques réservés
# Volumes
kubectl get pv | grep openebs
kubectl get sc | grep openebs
# Status des moteurs
kubectl get pods -n openebs -o wide
Ressources
- Documentation officielle : https://openebs.io/docs/
- Moteur Mayastor : https://openebs.io/docs/user-guides/replicated-storage-user-guide/
- Local PV : https://openebs.io/docs/user-guides/local-storage-user-guide/
- GitHub : https://github.com/openebs/openebs
- Releases : https://github.com/openebs/openebs/releases