Chargement en cours

K8S #02 : PV/PVC et GlusterFS

K8S #02 : PV/PVC et GlusterFS

P’tit stockage distribué 😎

Toujours dans la continuité du précédent article sur mon cluster Kubernetes, on va voir aujourd’hui comment installer GlusterFS pour avoir un sockage distribué, et tester le montage de volume avec apache !

Et ça, ça va être sympatoche.

Ah oui, petit disclaimer: il se peut que j’utilise storage ou stockage dépendant des phrases, vous voilà prévenus même si globalement on s’en fiche un peu~

II) Il était une fois GlusterFS, et le stockage distribué

J’avais déjà un peu bossé avec GlusterFS à l’époque, y’a de ça quatre ans environ… alors ça date un peu, mais le soft est toujours très utilisé et très souvent mis à jour ! C’est du solide.

Histoire de présenter une Infra un poil redondante, je suis donc parti sur ce choix de storage, en lieu et place de NFS ou même de Ceph. Voilà le topo :

  • glusterfs-01.tips4tech.local, en 192.168.0.51/24, avec 50Gb~ de disque ;
  • glusterfs-02.tips4tech.local, en 192.168.0.52/24, avec 50Gb~ de disque ;
  • glusterfs-03.tips4tech.local, en 192.168.0.53/24, avec 50Gb~ de disque ;

On remercie encore une fois Packer/Terraform pour le gain de temps !

L’idée, c’est de créer un dossier sur chacun de nos nœuds, qu’on va appeler par exemple /data/glusterfs/, et dont le contenu va être répliqué en temps réel sur chacun d’entre eux.

Si, sur glusterfs-01, je fais un touch /data/glusterfs/SuperFichier, ce fameux SuperFichier sera répliqué sur les deux autres serveurs !

Du coup, si l’un d’eux vient à tomber, les deux autres sont toujours disponibles, d’où le fameux stockage distribué.

Et au niveau de nos nœuds (mais cette fois je parle des nodes Kubernetes), on montera ce fameux volume en renseignant nos différents hôtes. Comme ça, si l’un vient à tomber, c’est transparent même jusqu’au montage. Ensuite, pour la partie pure K8S, car là je faisais allusion au niveau OS, on créera un PersistentVolume qui est une sorte de couche d’abstraction pour nos points de montage.

Et enfiiiiin, nos services/pods utiliseront un objet de type PersistentVolumeClaim pour accéder à ce fameux volume 🙂

Pour plus de clarté, j’ai réalisé rapidos un schéma sur draw.io, car j’adore ça et je sais que vous aussi :

On a donc notre cluster GlusterFS, avec notre folder. On va monter ce folder sur chacun de nos nœuds K8S, puis ensuite on créer un PersistentVolume dans Kubernetes, et ensuite nos différents pods ou services vont pouvoir utiliser un PersistentVolumeClaim pour finalement accéder à notre précieux storage.

P’tet que ça a l’air compliqué/pas très clair, mais je vous rassure, c’est plutôt facile à mettre en œuvre ! 😋

III) Mise en place du cluster

Assez bavardé, allons-y directement !

On installe le soft’ et on l’active au démarrage :

sudo apt update && sudo apt install -y glusterfs-server
sudo systemctl enable --now glusterd

On créer notre fameux dossier, et on donne les droits à glusterFS. A réaliser sur chacun des nœuds :

sudo mkdir -p /data/glusterfs
sudo chown -R gluster:gluster /data/glusterfs

On monte notre cluster :

# Commandes à réaliser sur glusterfs-01
sudo gluster peer probe glusterfs-02
sudo gluster peer probe glusterfs-03

Et on peut ensuite exécuter un petit gluster peer status histoire de voir si tout est en ordre :

C’est tout bon ! On poursuit.

Toujours sur glusterfs-01, on va créer notre volume. Par défaut la nomenclature est gvX, pour gluster_volume_X. Un peu comme avec LVM, on le nom par défaut est souvent vgX.

Bref, ici on créer donc un simple volume nommé sobrement gv0 :

sudo gluster volume create gv0 replica 3 transport tcp \
glusterfs-01:/data/glusterfs \
glusterfs-02:/data/glusterfs \
glusterfs-03:/data/glusterfs

L’argument replica 3 est utilisé car nous avons 3 noeuds, et transport tcp car ce sera le protocole utilisé pour la communication entre eux. GlusterFS propose aussi de l’udp, rdma, ou encore du P2P mais ça ne nous intéresse pas ici 😉

*Side note: si vous avez créer votre volume sur une partition système racine ( / ), vous devrez rajouter l’argument « force » à la fin de la précédente commande.

Ensuite, on peut démarrer notre volume :

sudo gluster volume start gv0

Et réaliser un petit coup de gluster volume info pour vérifier là encore que tout soit OK :

Maintenant passons à notre second cluster, le Kubernetes ! On va s’occuper de la partie purement OS/Système dans un premier temps, et ensuite seulement on gérera K8S.

IV) Montage sur chaque Node K8S

Bien, on se connecte donc en SSH sur nos trois nœuds, et on peut commencer par créer le dossier qui va accueillir notre volume à monter :

sudo mkdir /mnt/glusterfs

Et à partir d’ici, c’est encore plus simple !

On installe le client glusterfs :

sudo apt update && sudo apt install -y glusterfs-client

On monte ensuite manuellement le volume, et on peut y mettre un fichier pour tester la réplication :

sudo mount -t glusterfs glusterfs-01,glusterfs-02,glusterfs-03:/gv0 /mnt/glusterfs
# Depuis master-01
touch /mnt/glusterfs/SuperFichier

It works ! Le fichier est bien répliqué sur nos deux autres noeuds !

La dernière étape est de rajouter notre entrée au fichier fstab, afin que ce volume soit monté au démarrage. A noter aussi que, comme sur le schéma, cette commande indique bien nos trois différents serveurs, afin que si le premier venait à tomber, les deux autres sont là pour assurer l’accès aux datas :

# Rajouter l'entrée dans /etc/fstab

echo -e "# Mount the glusterFS volume\nglusterfs-01,glusterfs-02,glusterfs-03:/gv0 /mnt/glusterfs glusterfs defaults,_netdev 0 0" | sudo tee -a /etc/fstab

Et c’est tout bon ! 😎

Vous avez réussi à mettre en place un cluster GlusterFS avec un stockage distribué, et à monter ce volume sur 3 clients ! Maintenant, passons à la partie K8S…

V) Création du PersistentVolume sur Kubernetes

On touche presque au but ! Il ne nous reste plus qu’à indiquer que ce volume est disponible pour K8S, et ensuite de créer un service qui l’utilisera pour vérifier que tout roule.

Pour ce faire, on se créer un folder storage et on vient y mettre notre fichier YAML décrivant notre PV :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: glusterfs-volume
spec:
  capacity:
    storage: 40Gi
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /mnt/glusterfs/
    type: Directory

Rien de très compliqué ici, on renseigne la capacité (j’ai mis 40Gb~), et on renseigne le point de montage.

Ensuite, kubectl apply -f vous connaissez la chanson !

Aussi simple que ça… et pour finir, créons rapidement un petit serveur web Apache qui va store son folder web sur ce volume. On éditera la page index.html, puis on verra en temps réel si les changements sont bien apportés !

apiVersion: v1
kind: Namespace
metadata:
  name: apache-testing
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: glusterfs-volume-apache # On créer un PV nommé pour notre service
spec:
  capacity:
    storage: 40Gi
  volumeMode: Filesystem
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /mnt/glusterfs/apache/
    type: Directory
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: apache-pvc # On créer un PVC qui va s'y rattacher
  namespace: apache-testing
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  volumeName: glusterfs-volume-apache
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache-deployment
  namespace: apache-testing
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apache
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
        - name: apache
          image: httpd:latest
          ports:
            - containerPort: 80
          volumeMounts:
            - name: apache-storage
              mountPath: /usr/local/apache2/htdocs/ # On renseigne le dossier à monter
          resources:
            limits:
              memory: "512Mi"
              cpu: "0.5"
            requests:
              memory: "256Mi"
              cpu: "0.25"
      volumes:
        - name: apache-storage
          persistentVolumeClaim:
            claimName: apache-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: apache-service
  namespace: apache-testing
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: apache
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apache-ingress
  namespace: apache-testing
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: apache.tips4tech.local
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: apache-service
                port:
                  number: 80

Alors ici quelques petites précisions :

  • J’ai créé un sous-dossier dans /mnt/glusterfs, appelé /mnt/glusterfs/apache. Ce dossier est donc automatiquement créé sur tous mes nodes K8S car c’est un stockage distribué.
  • Le dossier web n’est pas, comme classiquement avec Apache, /var/www/html, mais bien /usr/local/apache2/htdocs/… ça m’aura fait perdre une petite heure car j’ai pas fait gaffe… 🙄 ;

Bref, on peut ensuite démarrer le tout via kubectl apply -f.

And it works !

On a donc réussi à mettre en place notre PersistentVolume via un dossier monté par glusterFS, et à créer un service apache utilisant un PersistentVolumeClaim pour monter son folder web ! 🥳

Petite note cependant, si jamais l’on supprime notre namespace, il faudra aussi penser à supprimer le PV… sinon, lors de la prochaine ré-application de notre manifeste, on obtiendra une erreur. Dans tout les cas, les données ne sont pas perdues car nous avons utilisé Retain comme persistentVolumeReclaimPolicy.

Visiblement, il y a moyen d’automatiser tout ça/faire plus propre… vais continuer de creuser de mon côté !

VI) Conclusion

La partie storage dans Kubernetes, surtout avec une infra OnPrem peut vite être laborieuse j’ai l’impression… je voulais rajouter la partie Harbor dans cet article mais d’une part léger manque de temps, et seconde chose j’ai découvert Longhorn, qui visiblement permet de faciliter la gestion des Volumes…

Bref, j’ai encore pas mal de choses à apprendre ! 😁

Je vais donc continuer tout ça et une fois que je maîtriserai le tout je continuerai cette série d’articles. Au passage, mon nouveau « labo » est en bonne voie ! On y parlera pfSense, NAS, et VLANs ! Mais il faudra patienter encore quelques semaines…

Sur ce, bonne journée/soirée à vous ! Tchô !

Laisser un commentaire