Stockage

OpenEBS

Stockage Kubernetes CNCF multi-moteurs - Mayastor (NVMe haute perf), Local PV Hostpath/Device, cStor. Chaque workload choisit son moteur. Install via Helm.

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

MoteurTypeRéplicationUsage recommandé
MayastorBloc (NVMe/TCP)Oui (synchrone)Production, bases de données, haute perf
Local PV HostpathLocalNonDev, CI, workloads mono-nœud
Local PV DeviceLocal (block device)NonPerformances locales maximales
cStorBloc (iSCSI)OuiProduction (legacy, maintenu)
JivaBloc (iSCSI)OuiWorkloads 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

RessourceValeur
Kubernetes1.23+
Helm3.x
Droitscluster-admin

Prérequis supplémentaires Mayastor

RessourceValeur
CPUSupport des instructions AVX (processeurs modernes)
Hugepages1024 x 2Mi hugepages par nœud de stockage
Kernel5.13+ (io_uring)
DisquesDisques 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ômeCauseCorrection
DiskPool en état ErrorHugepages non configuréesecho 1024 > /proc/sys/vm/nr_hugepages sur chaque nœud
DiskPool en état ErrorDisque non disponible ou déjà montélsblk -f /dev/sdb - FSTYPE doit être vide
io-engine en CrashLoopBackOffCPU sans AVX ou kernel < 5.13Vérifier grep avx /proc/cpuinfo et la version kernel
Local PV PVC PendingWaitForFirstConsumer attend le podNormal - 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

WaitForFirstConsumer garantit 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

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