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
| Composant | Valeur |
|---|---|
| Réplication | DRBD (synchrone, au niveau kernel) |
| Backends de pool | LVM, LVM-thin, ZFS, ZFS-thin |
| CSI driver | linstor-csi (Piraeus) |
| Interface | linstor CLI + API REST |
| Kubernetes minimum | 1.20+ |
Composants
| Composant | Rôle | Déploiement |
|---|---|---|
| linstor-controller | Plan de contrôle - gestion des ressources, API REST | Pod K8s |
| linstor-satellite | Agent sur chaque nœud - gère les pools LVM/ZFS | DaemonSet |
| linstor-csi | CSI driver pour Kubernetes | DaemonSet + Deployment |
| DRBD | Réplication synchrone des blocs entre nœuds | Module kernel |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.20+ |
| OS | RHEL/Rocky Linux 8+, Ubuntu 20.04+, Debian 11+ |
| Kernel | Module DRBD (via DKMS ou kernel-modules LINBIT) |
| Nœuds de stockage | 2 minimum, 3 recommandé pour réplication 3x |
| Disques | Disques 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
| Protocole | Comportement | Usage |
|---|---|---|
| A | Async - écriture confirmée localement, réseau asynchrone | WAN longue distance |
| B | Semi-sync - confirmée quand reçue par le peer | Équilibre perf/sécurité |
| C | Sync complet - confirmée quand persistée sur tous les peers | Production 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
- Documentation LINSTOR : https://linbit.com/drbd-user-guide/linstor-guide-1_0-en/
- Piraeus Operator : https://github.com/piraeusdatastore/piraeus-operator
- DRBD User Guide : https://linbit.com/drbd-user-guide/drbd-guide-9_0-en/
- GitHub LINSTOR : https://github.com/LINBIT/linstor-server
- GitHub linstor-csi : https://github.com/piraeusdatastore/linstor-csi
- LINBIT SDS (enterprise) : https://linbit.com/linbit-sds/