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.
sudo lsblk
*NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTsda 8:0 1 57.3G 0 disk└─sda1 8:1 1 57.3G 0 partmmcblk0 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 :
sudo fdisk -w auto /dev/sdagn(Valider les valeurs par défaut pour les 3 questions)w
Formatons la partition et montons-la :
sudo mkfs.xfs -f -L myvol-brick1 /dev/sda1sudo 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/fstabsudo mount /data/glusterfs/myvol1/brick1
Installons le service glusterfs
et démarrons-le sur les 3 nœuds :
apt install glusterfs-server glusterfs-client -ysudo systemctl enable glusterdsudo systemctl start glusterd
Ajoutons les 2 autres nœuds sur lesquels vous aurez exécuté toutes les commandes ci-dessus également au préalable.
sudo gluster peer probe rpi2sudo gluster peer probe rpi3sudo gluster peer status
Number of Peers: 2
Hostname: rpi2Uuid: f8e6bab0-ffed-4d89-86cc-af6d702a8ecaState: Peer in Cluster (Connected)
Hostname: rpi3Uuid: f31ad7b1-78f5-4d95-811f-bb9d765a1953State: Peer in Cluster (Connected)
Créons le volume avec les 3 nœuds :
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 :
sudo gluster volume start myvol1sudo gluster volume start myvol1volume start: myvol1: success
Faisons un test depuis notre nœud rpi1 :
sudo mkdir -p /mnt/myvol1sudo mount -t glusterfs localhost:/myvol1 /mnt/myvol1sudo touch /mnt/myvol1/totosudo umount /mnt/myvol1
Vérifions que le fichier toto est bien présent sur les 3 rpi :
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
sudo apt install glusterfs-client
Maintenant ajoutons cette ligne à fstab
:
sudo mkdir -p /mnt/myvol1sudo vi /etc/fstab
rpi1:/myvol1 /mnt/myvol1 glusterfs defaults,_netdev 0 0
Montons-le et vérifions que notre fichier toto est présent :
sudo mount /mnt/myvol1cd /mnt/myvol1ls
il l’est super effaçons le :
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 :
sudo apt install nfs-serversudo vi /etc/exports
Ajouter cette ligne en fin de fichier :
/mnt/myvol1 *(rw,fsid=1,sync,no_root_squash,no_all_squash)
sudo systemctl enable nfs-serversudo systemctl restart nfs-server
Vérifions que le répertoire est bien partagé :
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: ServiceAccountapiVersion: v1metadata: name: nfs-client-provisioner-gfs namespace: default---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: nfs-client-provisioner-gfs-runner namespace: defaultrules: - 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: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: run-nfs-client-provisioner-gfs namespace: default
- kind: ServiceAccount name: nfs-client-provisioner-gfs namespace: defaultroleRef: kind: ClusterRole name: nfs-client-provisioner-gfs-runner apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: leader-locking-nfs-client-provisioner-gfs namespace: defaultrules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: leader-locking-nfs-client-provisioner-gfs namespace: default
- kind: ServiceAccount name: nfs-client-provisioner-gfs namespace: defaultroleRef: kind: Role name: leader-locking-nfs-client-provisioner-gfs apiGroup: rbac.authorization.k8s.io---apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: managed-nfs-storage-gfs namespace: defaultprovisioner: fuseim.pri/nfsparameters: archiveOnDelete: "true"reclaimPolicy: RetainvolumeBindingMode: Immediate---kind: DeploymentapiVersion: extensions/v1beta1metadata: name: nfs-client-provisioner-gfs namespace: defaultspec: 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 :
kubectl apply -f storage-class.yamlkubectl exec -it nfs-client-provisioner-gfs-774cc8f97c-qvqcx /bin/shtouch 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 !!!