Longhorn doit permettre de présenter un stockage persistant pour les pods entre les noeuds du cluster. La réplication se fera sur les 3 noeuds.
Il exploitera sur chacun des noeuds le volume monté dans /opt/data.
root@kube-01:/home/guillaume# apt install -y open-iscsi
root@kube-01:/home/guillaume# systemctl enable --now iscsid
root@kube-02:/home/guillaume# systemctl enable --now iscsid
root@kube-03:/home/guillaume# systemctl enable --now iscsid
root@kube-01:/home/guillaume# systemctl status iscsid
● iscsid.service - iSCSI initiator daemon (iscsid)
Loaded: loaded (/usr/lib/systemd/system/iscsid.service; enabled; preset: enabled)
Active: active (running) since Sat 2026-01-17 11:15:06 UTC; 1min 10s ago
TriggeredBy: ● iscsid.socket
Docs: man:iscsid(8)
Process: 4336 ExecStartPre=/usr/lib/open-iscsi/startup-checks.sh (code=exited, status=0/SUCCESS)
Process: 4340 ExecStart=/usr/sbin/iscsid (code=exited, status=0/SUCCESS)
Main PID: 4342 (iscsid)
Tasks: 2 (limit: 4603)
Memory: 3.8M (peak: 4.1M)
CPU: 14ms
CGroup: /system.slice/iscsid.service
├─4341 /usr/sbin/iscsid
└─4342 /usr/sbin/iscsid
janv. 17 11:15:06 kube-01 systemd[1]: Starting iscsid.service - iSCSI initiator daemon (iscsid)...
janv. 17 11:15:06 kube-01 iscsid[4340]: iSCSI logger with pid=4341 started!
janv. 17 11:15:06 kube-01 systemd[1]: Started iscsid.service - iSCSI initiator daemon (iscsid).
janv. 17 11:15:07 kube-01 iscsid[4341]: iSCSI daemon with pid=4342 started!
root@kube-01:/home/guillaume# kubectl create namespace longhorn-system
namespace/longhorn-system created
root@kube-01:/home/guillaume# kubectl apply -n longhorn-system \
-f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/longhorn.yaml
root@kube-01:/home/guillaume# kubectl -n longhorn-system get pods
Exemple :
root@kube-01:/home/guillaume# kubectl -n longhorn-system get pods
NAME READY STATUS RESTARTS AGE
csi-attacher-79bffbd58f-5tjvl 0/1 ContainerCreating 0 11s
csi-attacher-79bffbd58f-lgbcm 0/1 ContainerCreating 0 11s
csi-attacher-79bffbd58f-mxfbc 0/1 ContainerCreating 0 11s
csi-provisioner-6c7d4cd8d6-g5v7g 0/1 ContainerCreating 0 11s
csi-provisioner-6c7d4cd8d6-rjsg8 0/1 ContainerCreating 0 11s
csi-provisioner-6c7d4cd8d6-wqdqx 0/1 ContainerCreating 0 11s
csi-resizer-869f89c9c5-djl49 0/1 ContainerCreating 0 11s
csi-resizer-869f89c9c5-gd8nd 0/1 ContainerCreating 0 11s
csi-resizer-869f89c9c5-xnsmb 0/1 ContainerCreating 0 11s
csi-snapshotter-74f57f68b5-lrb6j 0/1 ContainerCreating 0 11s
csi-snapshotter-74f57f68b5-nrkhl 0/1 ContainerCreating 0 11s
csi-snapshotter-74f57f68b5-zl9tr 0/1 ContainerCreating 0 11s
engine-image-ei-f4f7aa25-9w4vg 1/1 Running 0 61s
engine-image-ei-f4f7aa25-hbr7x 1/1 Running 0 61s
engine-image-ei-f4f7aa25-p8tbk 1/1 Running 0 61s
instance-manager-5c7dcfa444f6e5a751258186c001c04f 1/1 Running 0 31s
instance-manager-a17b56109abd5a748c346f1749d76f1f 0/1 ContainerCreating 0 31s
instance-manager-f42ea0866ab7c8c5b0b0bcb664d644a9 0/1 ContainerCreating 0 30s
longhorn-csi-plugin-99rrm 0/3 ContainerCreating 0 11s
longhorn-csi-plugin-k9cv6 0/3 ContainerCreating 0 11s
longhorn-csi-plugin-v8vbg 0/3 ContainerCreating 0 11s
longhorn-driver-deployer-9bb744c89-r8mdv 1/1 Running 0 94s
longhorn-manager-75fcw 2/2 Running 0 94s
longhorn-manager-7qvwj 2/2 Running 0 94s
longhorn-manager-t2grg 2/2 Running 0 94s
longhorn-ui-798df7fbc8-266zb 1/1 Running 0 94s
longhorn-ui-798df7fbc8-rz6mx 1/1 Running 0 94s
Suivre jusqu'a ce que l'intégralité des pods soient en Running (plusieurs minutes).
root@kube-01:/home/guillaume# kubectl -n longhorn-system port-forward --address 0.0.0.0 svc/longhorn-frontend 8080:80
Attention : un
CTRL + C, coupe la redirection.

Edit node and Disks
Operation, cliquer sur Edit node and disks:
Add Disk :
L'ensemble des noeuds doit présenter les disque /opt/data de disponible:

Settings, puis General :
CTRL + Croot@kube-01:/home/guillaume# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-01 Ready control-plane,etcd 62m v1.34.3+k3s1
kube-02 Ready control-plane,etcd 55m v1.34.3+k3s1
kube-03 Ready control-plane,etcd 54m v1.34.3+k3s1
root@kube-01:/home/guillaume# kubectl -n longhorn-system get pods
NAME READY STATUS RESTARTS AGE
csi-attacher-79bffbd58f-5tjvl 1/1 Running 0 38m
csi-attacher-79bffbd58f-lgbcm 1/1 Running 0 38m
csi-attacher-79bffbd58f-mxfbc 1/1 Running 0 38m
csi-provisioner-6c7d4cd8d6-g5v7g 1/1 Running 0 38m
csi-provisioner-6c7d4cd8d6-rjsg8 1/1 Running 0 38m
csi-provisioner-6c7d4cd8d6-wqdqx 1/1 Running 0 38m
csi-resizer-869f89c9c5-djl49 1/1 Running 0 38m
csi-resizer-869f89c9c5-gd8nd 1/1 Running 0 38m
csi-resizer-869f89c9c5-xnsmb 1/1 Running 0 38m
csi-snapshotter-74f57f68b5-lrb6j 1/1 Running 0 38m
csi-snapshotter-74f57f68b5-nrkhl 1/1 Running 0 38m
csi-snapshotter-74f57f68b5-zl9tr 1/1 Running 0 38m
engine-image-ei-f4f7aa25-9w4vg 1/1 Running 0 39m
engine-image-ei-f4f7aa25-hbr7x 1/1 Running 0 39m
engine-image-ei-f4f7aa25-p8tbk 1/1 Running 0 39m
instance-manager-5c7dcfa444f6e5a751258186c001c04f 1/1 Running 0 39m
instance-manager-a17b56109abd5a748c346f1749d76f1f 1/1 Running 0 39m
instance-manager-f42ea0866ab7c8c5b0b0bcb664d644a9 1/1 Running 0 39m
longhorn-csi-plugin-99rrm 3/3 Running 0 38m
longhorn-csi-plugin-k9cv6 3/3 Running 0 38m
longhorn-csi-plugin-v8vbg 3/3 Running 0 38m
longhorn-driver-deployer-9bb744c89-r8mdv 1/1 Running 0 40m
longhorn-manager-75fcw 2/2 Running 0 40m
longhorn-manager-7qvwj 2/2 Running 0 40m
longhorn-manager-t2grg 2/2 Running 0 40m
longhorn-ui-798df7fbc8-266zb 1/1 Running 0 40m
longhorn-ui-798df7fbc8-rz6mx 1/1 Running 0 40m
root@kube-01:/home/guillaume# mkdir -p /opt/k3s_services/test-longhorn
root@kube-01:/home/guillaume# cd /opt/k3s_services/test-longhorn/
root@kube-01:/opt/k3s_services/test-longhorn# vim pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-longhorn-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi
root@kube-01:/opt/k3s_services/test-longhorn# kubectl apply -f pvc-test.yaml
root@kube-01:/opt/k3s_services/test-longhorn# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
test-longhorn-pvc Bound pvc-55e03c8e-9f84-48fa-b894-1f8db0b00ab9 1Gi RWO longhorn <unset> 39s
Le STATUS attendu est Bound.
root@kube-01:/opt/k3s_services/test-longhorn# vim pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-longhorn-pod
spec:
containers:
- name: alpine
image: alpine
command: ["sh", "-c", "echo 'Longhorn OK' > /data/test.txt && sleep 3600"]
volumeMounts:
- mountPath: /data
name: vol
volumes:
- name: vol
persistentVolumeClaim:
claimName: test-longhorn-pvc
root@kube-01:/opt/k3s_services/test-longhorn# kubectl apply -f pod-test.yaml
root@kube-01:/opt/k3s_services/test-longhorn# kubectl exec test-longhorn-pod -- cat /data/test.txt
Résultat :
root@kube-01:/opt/k3s_services/test-longhorn# kubectl exec test-longhorn-pod -- cat /data/test.txt
Longhorn OK
root@kube-01:/opt# kubectl -n longhorn-system get volumes
NAME DATA ENGINE STATE ROBUSTNESS SCHEDULED SIZE NODE AGE
pvc-55e03c8e-9f84-48fa-b894-1f8db0b00ab9 v1 attached healthy 1073741824 kube-02 31m
root@kube-01:/opt# kubectl -n longhorn-system get replicas
NAME DATA ENGINE STATE NODE DISK INSTANCEMANAGER IMAGE AGE
pvc-55e03c8e-9f84-48fa-b894-1f8db0b00ab9-r-6c9f6458 v1 running kube-03 47e814d5-3d35-4ca0-9d8d-047e9dcb15e4 instance-manager-a17b56109abd5a748c346f1749d76f1f longhornio/longhorn-engine:v1.7.1 33m
pvc-55e03c8e-9f84-48fa-b894-1f8db0b00ab9-r-b6da532e v1 running kube-02 6124a4ef-4ff4-410b-a410-df30d9f0c33c instance-manager-f42ea0866ab7c8c5b0b0bcb664d644a9 longhornio/longhorn-engine:v1.7.1 33m
pvc-55e03c8e-9f84-48fa-b894-1f8db0b00ab9-r-bdbb83b9 v1 running kube-01 5a525b87-6e12-48f4-bc86-7cbd000b99b8 instance-manager-5c7dcfa444f6e5a751258186c001c04f longhornio/longhorn-engine:v1.7.1 33m