Stockage

LINSTOR

Stockage bloc répliqué Kubernetes basé sur DRBD (LINBIT). Réplication synchrone, faible latence, pools LVM et ZFS. CSI driver inclus. Idéal bases de données.

LINSTOR est un système de gestion du stockage bloc distribué développé par LINBIT (Autriche), construit sur DRBD (Distributed Replicated Block Device), la technologie de réplication bloc synchrone au niveau kernel que LINBIT maintient également. DRBD est utilisé depuis des décennies pour les clusters haute disponibilité Linux (Pacemaker/Corosync) - LINSTOR en fait un système moderne géré via une API REST.

LINSTOR gère des pools de stockage (LVM, ZFS, LVM-thin), crée des volumes DRBD répliqués, et expose un CSI driver pour Kubernetes. Sa réplication synchrone au niveau bloc avec très faible overhead le rend particulièrement adapté aux bases de données nécessitant HA et performances.


Informations essentielles

Origine : LINBIT (Autriche)  ·  Licence : GPL v3 (Community), commerciale (LINBIT SDS)  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Support entreprise LINBIT SDS. Communauté via GitHub Issues.

Stack par défaut

ComposantValeur
RéplicationDRBD (synchrone, au niveau kernel)
Backends de poolLVM, LVM-thin, ZFS, ZFS-thin
CSI driverlinstor-csi (Piraeus)
Interfacelinstor CLI + API REST
Kubernetes minimum1.20+

Composants

ComposantRôleDéploiement
linstor-controllerPlan de contrôle - gestion des ressources, API RESTPod K8s
linstor-satelliteAgent sur chaque nœud - gère les pools LVM/ZFSDaemonSet
linstor-csiCSI driver pour KubernetesDaemonSet + Deployment
DRBDRéplication synchrone des blocs entre nœudsModule kernel

Prérequis

RessourceValeur
Kubernetes1.20+
OSRHEL/Rocky Linux 8+, Ubuntu 20.04+, Debian 11+
KernelModule DRBD (via DKMS ou kernel-modules LINBIT)
Nœuds de stockage2 minimum, 3 recommandé pour réplication 3x
DisquesDisques ou partitions dédiés aux pools

Installer DRBD (modules kernel)

# Ubuntu 22.04
sudo add-apt-repository \
  'deb http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu jammy main'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0xCC6BACF8
sudo apt-get update && sudo apt-get install -y drbd-dkms drbd-utils

# Rocky Linux 9
sudo dnf install -y elrepo-release
sudo dnf --enablerepo=elrepo-kernel install -y drbd9x-utils kmod-drbd9x

# Vérifier
sudo modprobe drbd
lsmod | grep drbd
drbdadm --version

Installation sur Kubernetes

Via Piraeus Operator (recommandé)

helm repo add piraeus https://piraeus.io/helm-charts/
helm repo update

helm install piraeus-op piraeus/piraeus-operator \
  --namespace piraeus-datastore \
  --create-namespace

kubectl get pods -n piraeus-datastore

Créer le cluster LINSTOR

# linstorcluster.yaml
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec: {}
kubectl apply -f linstorcluster.yaml
kubectl get linstorcluster

Créer les pools de stockage (un par nœud)

# storage-pools.yaml
apiVersion: piraeus.io/v1
kind: LinstorStoragePool
metadata:
  name: linstor-pool-node1
spec:
  nodeName: node1
  poolName: linstor-pool
  source:
    hostDevices:
    - /dev/sdb              # Disque brut - sera initialisé en LVM
---
apiVersion: piraeus.io/v1
kind: LinstorStoragePool
metadata:
  name: linstor-pool-node2
spec:
  nodeName: node2
  poolName: linstor-pool
  source:
    hostDevices:
    - /dev/sdb
---
apiVersion: piraeus.io/v1
kind: LinstorStoragePool
metadata:
  name: linstor-pool-node3
spec:
  nodeName: node3
  poolName: linstor-pool
  source:
    hostDevices:
    - /dev/sdb
kubectl apply -f storage-pools.yaml
kubectl get linstorstoragepool

StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: linstor-replicated-2
provisioner: linstor.csi.linbit.com
parameters:
  linstor.csi.linbit.com/storagePool: linstor-pool
  linstor.csi.linbit.com/placementCount: "2"        # Nombre de réplicas
  property.linstor.csi.linbit.com/DrbdOptions/Net/protocol: "C"  # Sync complet
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

Protocoles DRBD

ProtocoleComportementUsage
AAsync - écriture confirmée localement, réseau asynchroneWAN longue distance
BSemi-sync - confirmée quand reçue par le peerÉquilibre perf/sécurité
CSync complet - confirmée quand persistée sur tous les peersProduction recommandé

Vérification de l'installation

# 1. Vérifier les pods Piraeus
kubectl get pods -n piraeus-datastore
# Attendre : linstor-controller (1/1), linstor-satellite (1/1 sur chaque nœud)

# 2. Vérifier que le cluster LINSTOR est actif
kubectl get linstorcluster
# ESTABLISHED = plan de contrôle opérationnel

# 3. Vérifier les nœuds LINSTOR (accès via le pod controller)
CTRL=$(kubectl get pod -n piraeus-datastore \
  -l app.kubernetes.io/component=linstor-controller \
  -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n piraeus-datastore $CTRL -- linstor node list
# Tous les nœuds doivent être en état Online

# 4. Vérifier les pools de stockage
kubectl exec -n piraeus-datastore $CTRL -- linstor storage-pool list
# Les pools doivent exister et ne pas être en état FAILED

# 5. Vérifier que DRBD est chargé sur chaque nœud
for node in $(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'); do
  echo "=== $node ===" && kubectl debug node/$node -it --image=busybox \
    -- chroot /host lsmod 2>/dev/null | grep drbd || true
done
# Alternative : kubectl exec sur le pod satellite du nœud
kubectl -n piraeus-datastore exec ds/linstor-satellite -- lsmod | grep drbd

Premier test de bout en bout

# test-linstor.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-linstor-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: linstor-replicated-2
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-linstor
  namespace: default
spec:
  containers:
  - name: writer
    image: busybox
    command: ["/bin/sh", "-c"]
    args:
    - |
      echo "LINSTOR test $(date)" > /data/test.txt
      cat /data/test.txt
      echo "Écriture OK"
      sleep 3600
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: test-linstor-pvc
kubectl apply -f test-linstor.yaml

# Suivre le binding du PVC (peut prendre 30-60s)
kubectl get pvc test-linstor-pvc -w
# Doit passer de Pending → Bound

# Vérifier que le pod tourne
kubectl get pod test-linstor
kubectl logs test-linstor
# Doit afficher "LINSTOR test <date>" puis "Écriture OK"

# Vérifier la réplication DRBD (depuis le pod controller)
kubectl exec -n piraeus-datastore $CTRL -- linstor resource list | grep test
# Doit afficher 2 lignes (un replica par nœud)

# Vérifier l'état DRBD sur un nœud de stockage
kubectl -n piraeus-datastore exec ds/linstor-satellite -- drbdsetup status --verbose

# Nettoyage
kubectl delete -f test-linstor.yaml

Utilisation

# PVC LINSTOR
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: db-data
  namespace: production
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: linstor-replicated-2
  resources:
    requests:
      storage: 50Gi

CLI linstor

# Accéder au CLI depuis le pod controller
kubectl exec -n piraeus-datastore \
  $(kubectl get pod -n piraeus-datastore -l app.kubernetes.io/component=linstor-controller \
    -o jsonpath='{.items[0].metadata.name}') \
  -- linstor node list

# Ou via kubectl plugin
kubectl linstor node list          # Si le plugin kubectl-linstor est installé

Commandes courantes

linstor node list                  # Nœuds du cluster
linstor storage-pool list          # Pools de stockage
linstor resource-definition list   # Volumes définis
linstor resource list              # Replicas actifs par nœud
linstor volume list                # Volumes et leur état
linstor error-reports list         # Erreurs récentes

Snapshots

# Créer une snapshot
linstor snapshot create <resource-name> snap1

linstor snapshot list

# Restaurer depuis une snapshot
linstor snapshot restore <resource-name> snap1 <new-resource-name>

Mise à jour

helm repo update

helm upgrade piraeus-op piraeus/piraeus-operator \
  --namespace piraeus-datastore \
  --reuse-values

kubectl rollout status deploy/linstor-controller -n piraeus-datastore

Mettre à jour les modules DRBD sur les nœuds avant l'opérateur. DRBD peut servir les I/O depuis les peers pendant la mise à jour d'un nœud - procéder en rolling update.


Troubleshooting

# Logs du controller
kubectl logs -n piraeus-datastore \
  -l app.kubernetes.io/component=linstor-controller --tail=100

# Logs du satellite sur un nœud
kubectl logs -n piraeus-datastore \
  -l app.kubernetes.io/component=linstor-satellite --tail=100

# État DRBD sur un nœud (exécuter sur le nœud)
sudo drbdsetup status --verbose
sudo drbdadm status

# Erreurs LINSTOR
linstor error-reports list --since-hours 24

Ressource en SyncSource / SyncTarget

# Resynchronisation normale après panne nœud - surveiller la progression
sudo drbdsetup status <resource>
# "out-of-sync" doit diminuer progressivement

# Si bloqué depuis longtemps
linstor resource toggle-disk <node> <resource> --diskful

Volume bloqué en Pending

kubectl describe pvc <nom> -n <namespace>

# Vérifier que les pools existent sur assez de nœuds
linstor storage-pool list
linstor resource list

Commandes utiles

linstor node list
linstor storage-pool list --show-props
linstor resource list
linstor volume list
linstor snapshot list
linstor error-reports list --since-hours 24

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