Aller au contenu

Cluster glusterfs sur raspberry pi

Jusqu’à maintenant lorsque j’avais besoin d’un volume persistent sur mon cluster k3s j’utilisais un montage nfs depuis un des noeuds du cluster kubernetes. Je me suis donc mis en quête d’un système de fichier réseau synchronisé et j’ai fait le choix de tester dans un premier temps glusterfs.

Installation de glusterfs sur les 3 noeuds de mon cluster de raspberry pi

J’ai pris 3 raspberry pi 3B+ avec hypriot comme système d’exploitation sur lequel j’ai monté 3 clés USB de 64Gb. Commençons par identifier le nom du device sur lequel est installé la clé USB.

Terminal window
sudo lsblk
*NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 57.3G 0 disk
└─sda1 8:1 1 57.3G 0 part
mmcblk0 179:0 0 14.4G 0 disk
├─mmcblk0p1 179:1 0 64M 0 part /boot
└─mmcblk0p2 179:2 0 14.4G 0 part /

Lés clés sont montées sur les 3 rpi sur le device /dev/sda. Créons le filesystem qui accueillera les données :

Terminal window
sudo fdisk -w auto /dev/sda
g
n
(Valider les valeurs par défaut pour les 3 questions)
w

Formatons la partition et montons-la :

Terminal window
sudo mkfs.xfs -f -L myvol-brick1 /dev/sda1
sudo mkdir -p /data/glusterfs/myvol1/brick1/
printf $(sudo blkid -o export /dev/sda1|grep PARTUUID)" /data/glusterfs/myvol1/brick1 xfs defaults,noatime 1 2\n" | sudo tee -a /etc/fstab
sudo mount /data/glusterfs/myvol1/brick1

Installons le service glusterfs et démarrons-le sur les 3 nœuds :

Terminal window
apt install glusterfs-server glusterfs-client -y
sudo systemctl enable glusterd
sudo systemctl start glusterd

Ajoutons les 2 autres nœuds sur lesquels vous aurez exécuté toutes les commandes ci-dessus également au préalable.

Terminal window
sudo gluster peer probe rpi2
sudo gluster peer probe rpi3
sudo gluster peer status
Number of Peers: 2
Hostname: rpi2
Uuid: f8e6bab0-ffed-4d89-86cc-af6d702a8eca
State: Peer in Cluster (Connected)
Hostname: rpi3
Uuid: f31ad7b1-78f5-4d95-811f-bb9d765a1953
State: Peer in Cluster (Connected)

Créons le volume avec les 3 nœuds :

Terminal window
sudo gluster volume create myvol1 replica 3 rpi1:/data/glusterfs/myvol1/brick1/brick rpi2:/data/glusterfs/myvol1/brick1/brick rpi3:/data/glusterfs/myvol1/brick1/brick

Démarrons le volume :

Terminal window
sudo gluster volume start myvol1sudo gluster volume start myvol1
volume start: myvol1: success

Faisons un test depuis notre nœud rpi1 :

Terminal window
sudo mkdir -p /mnt/myvol1
sudo mount -t glusterfs localhost:/myvol1 /mnt/myvol1
sudo touch /mnt/myvol1/toto
sudo umount /mnt/myvol1

Vérifions que le fichier toto est bien présent sur les 3 rpi :

Terminal window
ls -al /data/glusterfs/myvol1/brick1/brick

Montage du glusterfs sur notre cluster kubernetes k3s

Normalement glusterfs est pris en charge par kubernetes mais donc mon cas impossible de le faire fonctionner. Pour le moment je vais simplement le monter en nfs sur le nœud master de mon cluster et créer une storageClass pour mes futurs volumes persistants.

Dans un premier temps installons la partie client de glusterfs

Terminal window
sudo apt install glusterfs-client

Maintenant ajoutons cette ligne à fstab :

Terminal window
sudo mkdir -p /mnt/myvol1
sudo vi /etc/fstab
rpi1:/myvol1 /mnt/myvol1 glusterfs defaults,_netdev 0 0

Montons-le et vérifions que notre fichier toto est présent :

Terminal window
sudo mount /mnt/myvol1
cd /mnt/myvol1
ls

il l’est super effaçons le :

Terminal window
sudo rm toto

Normalement en vous rendant sur dans le répertoire /data/glusterfs/myvol1/brick1/brick sur vos raspberry le fichier toto devrait avoir disparu :)

Finissons par installer la partie nfs-server :

Terminal window
sudo apt install nfs-server
sudo vi /etc/exports

Ajouter cette ligne en fin de fichier :

/mnt/myvol1 *(rw,fsid=1,sync,no_root_squash,no_all_squash)

Terminal window
sudo systemctl enable nfs-server
sudo systemctl restart nfs-server

Vérifions que le répertoire est bien partagé :

Terminal window
sudo exportfs
/mnt/myvol1 <world>

Création de la storage class

Attention il faut installer le package nfs-client sur tous les nœuds de votre cluster kubernetes !

Éditez le fichier storage-class.yaml et ajoutez le contenu suivant en modifiant l’adresse ip avec celle de votre node master :

kind: ServiceAccount
apiVersion: v1
metadata:
name: nfs-client-provisioner-gfs
namespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-gfs-runner
namespace: default
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner-gfs
namespace: default
- kind: ServiceAccount
name: nfs-client-provisioner-gfs
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-gfs-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner-gfs
namespace: default
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner-gfs
namespace: default
- kind: ServiceAccount
name: nfs-client-provisioner-gfs
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner-gfs
apiGroup: rbac.authorization.k8s.io
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage-gfs
namespace: default
provisioner: fuseim.pri/nfs
parameters:
archiveOnDelete: "true"
reclaimPolicy: Retain
volumeBindingMode: Immediate
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: nfs-client-provisioner-gfs
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner-gfs
spec:
serviceAccountName: nfs-client-provisioner-gfs
containers:
- name: nfs-client-provisioner-gfs
image: quay.io/external_storage/nfs-client-provisioner:v3.1.0-k8s1.11
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/nfs
- name: NFS_SERVER
value: 192.168.1.43
- name: NFS_PATH
value: /mnt/myvol1
resources:
requests:
cpu: 400m
memory: 512M
limits:
cpu: 800m
memory: 1024M
volumes:
- name: nfs-client-root
nfs:
server: 192.168.1.43
path: /mnt/myvol1

Appliquons et vérifions que le montage est présent dans le pod :

Terminal window
kubectl apply -f storage-class.yaml
kubectl exec -it nfs-client-provisioner-gfs-774cc8f97c-qvqcx /bin/sh
touch toto

Allez sur vos raspberry et vérifiez que le fichier toto est apparu dans le répertoire /data/glusterfs/myvol1/brick1/brick

À vous les volumes persistants répliqués sur plusieurs nodes !!!