Kubernetes - Les volumes - RaspberryPI - PV/PVC

Je vais aborder ici la notion de volumes utilisés par les containers dans kubernetes. La séparation de privilèges passent par le “Persistent Volume (pv)” et le “Persistant Volume Claim (pvc)”. Le PV est la référence au stockage final, tandis que le PVC est l’objet permettant de consommer les ressources du PV.

Persistent Volume (PV)

Ce type d’objet peut être créé par un administrateur ou dynamiquement. Pour l’aspect dynamique, ceci va consister à créer un PV dynamiquement lorsque le pod va faire appel à un PVC. Ceci évite les tâche d’administration lié à la réservation d’espace sur les serveurs de stockage finaux. ====> Faire le test avec retain, recycle, delete avec le lab heketi… ====> Lorsque le pod est détruit, le PV peut être conservé mais ne pourra pas être réutilisé. La construction d’un nouveau container de même type entraîne la création d’un nouveau PV. Ce type de volume est donc fait pour stocker des données non réutilisables. Ceci ne veut pas dire qu’elles sont perdues, selon la politique adoptée à la destruction du PVC, les données sont retenues dans l’espace final de stockage (nfs, gluster,…) ou pas. Pour définir un volume réutilisable à souhait par un pod, vous devez le créé manuellement et ce PV aura toujours la même référence au volume de stockage final. Pour plus de précision, voir le fonctionnement de “HEKETI” pour les volumes glusterfs.

Le PV peut aussi être créé manuellement par l’administrateur, dans ce cas l’administrateur s’occupe du paramétrage de l’ensemble, manuellement ou par automate conçus pour ce cas précis.

Persistant Volume Claim (PVC)

Ce type d’objet est déclaré au niveau d’un namespace, accompagné de son “endpoint” et du service réseau (service ou svc) associé à ce endpoint. Il permet à l’application de consommer les ressources de stockage d’un PV. Un PVC est donc toujours associé à un PV

Sécurité

Un PV est indépendant des “namespaces”, par conséquent n’importe quel pod peut accèder à un PV au travers d’un PVC. Il faut donc limiter son usage au namespace autorisé.

Exemple de création manuelle

Persistent Volume (PV) par l’administrateur

L’utilisateur, pour les besoins de son application, souhaite disposer d’un volume Glusterfs pour y stocker les données relatives à cette application. Cette application, représentée par un pod, existe dans un namespace définit par l’adminitrateur. Le travail de l’administrateur va se présenter ainsi :

  • Connexion au serveur de stockage Glusterfs, pour créer le volume de stockage final
# Création du répertoire
# Mes volumes sont stockés sur un disque chiffré, monté sur /Disk1.
disk="/Disk1"
namespacekubernetes=monappli
volumetocreate=log
# Je préfixe le répertoire avec "K8s-" pour indiquer qu'il est utilisé par le cluster kubernetes - puis namespacekubernetes/volume
mkdir -p "/$disk/k8s-$namespacekubernetes/$volumetocreate"
if [ "$?" != "0" ];then
    exit 1
fi
# Création du volume
gluster v create "$namespacekubernetes-$volumetocreate" $(hostname):/Disk1/k8s-$namespacekubernetes/$volumetocreate
if [ "$?" != "0" ];then
    exit 1
fi
# Démarrage du volume
gluster v start "$namespacekubernetes-$volumetocreate"
if [ "$?" != "0" ];then
    exit 1
fi
# Quota activation
gluster v quota "$namespacekubernetes-$volumetocreate" enable
if [ "$?" != "0" ];then
    exit 1
fi
# Set quota - ici indiquer au moins la taille attribué dans votre manifest kubernetes !!! ici c'est 2GB max
# Il est possible de poser des quotas pour un répertoire distinct
gluster v quota "$namespacekubernetes-$volumetocreate" limit-usage / 2GB
if [ "$?" != "0" ];then
    exit 1
fi
# Permet d'afficher la limite dans le résultat df sur le client consommateur
gluster v set $namespacekubernetes-$volumetocreate" quota-deem-statfs on
if [ "$?" != "0" ];then
    exit 1
fi

# Chaque volume gluster est disponible sur un port TCP/IP, assurez-vous que le firewall du serveur Gluster
# autorise bien ce flux. Les ports Gluster commencent à 49152 et pour chaque nouveau volume, il y a une incrémentation de 1
# Pour lister les ports Gluster en écoute, utilisez cette commande :
#
# gluster volume status all detail | awk -F ":" '/TCP Port/ {print $2}'
#
  • Sur le cluster Kubernetes, création du PV

Le manifest (pv.yml) :

Sur le master, exécuter :

kubectl apply -f pv.yml
  • Création du namespace dans Kubernetes
  • Création du Service Gluster dans le namespace applicatif
  • Création du Endpoint dans le namespace applicatif
  • Création du PV dans le namespace applicatif

Persistent Volume Claim (PVC) par l’utilisateur

L’utilisateur pourra créer le PVC dans son namespace applicatif :

et directement utilisable par le container