Lab 6.2 - PersistentVolumes et PersistentVolumeClaims
Objectifs du Lab
À la fin de ce lab, vous serez capable de:
- Créer un PersistentVolume (PV) manuellement.
- Créer un PersistentVolumeClaim (PVC).
- Lier un PVC à un Pod.
- Comprendre le cycle de vie d'un PV et d'un PVC.
- Vérifier la persistance des données.
Durée Estimée
45-60 minutes
Prérequis
- kubectl installé et configuré.
- Cluster Kubernetes local fonctionnel (minikube ou kind).
- Connaissances sur les PersistentVolumes et PVCs (Chapitre 6.2).
Partie 1: Création d'un PersistentVolume
Nous allons créer un PersistentVolume manuellement. Pour un cluster local (minikube/kind), nous utiliserons un volume de type hostPath qui monte un répertoire du nœud.
Étape 1.1: Créer le PersistentVolume
Créez un fichier pv-example.yaml:
# pv-example.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
labels:
type: local
spec:
storageClassName: manual # Nom de la StorageClass (ou "" pour pas de classe)
capacity:
storage: 1Gi # Taille du volume
accessModes:
- ReadWriteOnce # RWO: un seul nœud peut monter en lecture-écriture
persistentVolumeReclaimPolicy: Retain # Que faire quand le PVC est supprimé: Retain, Delete, Recycle
hostPath:
path: /tmp/k8s-pv-example # Chemin sur le nœud (pour minikube/kind)
type: DirectoryOrCreate # Créer le répertoire s'il n'existe pas
Explication:
storageClassName: manual: Indique que ce PV est provisionné manuellement (pas par une StorageClass).accessModes: ReadWriteOnce: Le volume peut être monté en lecture-écriture par un seul nœud à la fois.persistentVolumeReclaimPolicy: Retain: Lorsque le PVC est supprimé, le PV est conservé (les données ne sont pas supprimées).hostPath: Pour un cluster local, nous utilisons un répertoire du nœud. En production, vous utiliseriez des volumes cloud (EBS, Azure Disk, GCE Persistent Disk) ou NFS.
Appliquez le PersistentVolume:
kubectl apply -f pv-example.yaml
Vérifiez que le PV est créé:
kubectl get pv pv-example
Vous devriez voir le PV avec le statut Available (disponible, pas encore lié à un PVC).
Vérifiez les détails:
kubectl describe pv pv-example
Partie 2: Création d'un PersistentVolumeClaim
Un PVC demande un volume avec des caractéristiques spécifiques (taille, mode d'accès, StorageClass).
Étape 2.1: Créer le PersistentVolumeClaim
Créez un fichier pvc-example.yaml:
# pvc-example.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
storageClassName: manual # Doit correspondre au storageClassName du PV
accessModes:
- ReadWriteOnce # Doit correspondre ou être un sous-ensemble des accessModes du PV
resources:
requests:
storage: 500Mi # Demande 500 MiB (le PV a 1 GiB, donc ça fonctionne)
Explication:
storageClassName: manual: Le PVC cherche un PV avec cette StorageClass.accessModes: ReadWriteOnce: Le PVC demande un volume avec ce mode d'accès.resources.requests.storage: 500Mi: Le PVC demande au moins 500 MiB.
Appliquez le PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
Vérifiez que le PVC est créé et lié au PV:
kubectl get pvc pvc-example
Vous devriez voir le PVC avec le statut Bound (lié au PV).
Vérifiez que le PV est maintenant lié:
kubectl get pv pv-example
Le statut devrait être Bound et la colonne CLAIM devrait indiquer default/pvc-example.
Partie 3: Utilisation du PVC dans un Pod
Maintenant, nous allons créer un Pod qui utilise le PVC pour stocker des données persistantes.
Étape 3.1: Créer un Pod avec le PVC
Créez un fichier pod-with-pvc.yaml:
# pod-with-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'Données persistantes - $(date)' >> /data/persistent-data.txt && cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data # Chemin où le volume sera monté dans le conteneur
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example # Nom du PVC à utiliser
Appliquez le Pod:
kubectl apply -f pod-with-pvc.yaml
Attendez que le Pod soit Running:
kubectl get pods pod-with-pvc
Vérifiez les logs pour voir les données écrites:
kubectl logs pod-with-pvc
Vous devriez voir le message avec la date.
Étape 3.2: Vérifier la Persistance
Supprimez le Pod:
kubectl delete pod pod-with-pvc
Créez un nouveau Pod qui lit les données:
# pod-read-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-read-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["cat /data/persistent-data.txt && sleep 3600"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: pvc-example
Appliquez le nouveau Pod:
kubectl apply -f pod-read-pvc.yaml
Vérifiez les logs:
kubectl logs pod-read-pvc
Vous devriez voir les données écrites par le premier Pod, ce qui prouve la persistance!
Partie 4: Nettoyage
Supprimez les ressources créées:
kubectl delete pod pod-read-pvc
kubectl delete -f pvc-example.yaml
kubectl delete -f pv-example.yaml
Note: Avec persistentVolumeReclaimPolicy: Retain, même après la suppression du PVC, le PV reste avec le statut Released. Les données sont conservées. Pour supprimer complètement le PV, vous devez le supprimer manuellement:
kubectl delete pv pv-example
Résumé du Lab
Dans ce lab, vous avez exploré les PersistentVolumes et PersistentVolumeClaims. Vous avez appris à créer un PV manuellement, à créer un PVC qui se lie automatiquement au PV, et à utiliser le PVC dans un Pod pour stocker des données persistantes. Vous avez également vérifié que les données survivent à la suppression et à la recréation des Pods.
Prochaines Étapes
Le prochain lab vous introduira aux StorageClasses et au provisionnement dynamique, qui simplifient grandement la gestion du stockage.
Lab 6.3: StorageClasses et Provisionnement Dynamique
Lab créé le: Décembre 2024