Lab 6.3 - StorageClasses et Provisionnement Dynamique
Objectifs du Lab
À la fin de ce lab, vous serez capable de:
- Comprendre le concept de StorageClass.
- Créer une StorageClass personnalisée.
- Utiliser le provisionnement dynamique avec un PVC.
- Comprendre les différents types de provisionneurs.
- Vérifier le provisionnement automatique de PVs.
Durée Estimée
45-60 minutes
Prérequis
- kubectl installé et configuré.
- Cluster Kubernetes local fonctionnel (minikube ou kind).
- Connaissances sur les StorageClasses (Chapitre 6.3).
Partie 1: Comprendre les StorageClasses
Une StorageClass définit un "type" de stockage avec des caractéristiques (provisionneur, paramètres, réclamation). Elle permet le provisionnement dynamique de PersistentVolumes.
Étape 1.1: Lister les StorageClasses Existant
Vérifiez les StorageClasses disponibles dans votre cluster:
kubectl get storageclass
# ou
kubectl get sc
Sur minikube, vous devriez voir une StorageClass par défaut (ex: standard ou hostpath). Sur kind, il peut y avoir standard ou aucune.
Vérifiez les détails d'une StorageClass:
kubectl describe storageclass <nom-de-la-storageclass>
Partie 2: Création d'une StorageClass Personnalisée
Pour un cluster local, nous allons créer une StorageClass qui utilise hostPath comme provisionneur (via un provisionneur local ou manuel).
Étape 2.1: Créer une StorageClass
Créez un fichier storageclass-local.yaml:
# storageclass-local.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner # Pas de provisionnement automatique pour hostPath
volumeBindingMode: WaitForFirstConsumer # Attendre qu'un Pod utilise le PVC avant de créer le PV
allowVolumeExpansion: false # Ne permet pas l'expansion du volume
Explication:
provisioner: kubernetes.io/no-provisioner: Indique qu'il n'y a pas de provisionnement automatique. Pour un cluster local avec hostPath, nous devons créer les PVs manuellement, mais la StorageClass permet de les grouper.volumeBindingMode: WaitForFirstConsumer: Le PVC attend qu'un Pod soit créé avant de lier le PV. Cela permet au scheduler de choisir le bon nœud.allowVolumeExpansion: false: Les volumes ne peuvent pas être agrandis après création.
Appliquez la StorageClass:
kubectl apply -f storageclass-local.yaml
Vérifiez qu'elle est créée:
kubectl get storageclass local-storage
Partie 3: Provisionnement Dynamique (Simulation)
Pour un vrai provisionnement dynamique, vous auriez besoin d'un provisionneur comme:
kubernetes.io/aws-ebs(AWS)kubernetes.io/azure-disk(Azure)kubernetes.io/gce-pd(GCP)kubernetes.io/cinder(OpenStack)
Sur minikube, vous pouvez utiliser le provisionneur k8s.io/minikube-hostpath si disponible.
Étape 3.1: Créer une StorageClass avec Provisionnement Dynamique (minikube)
Si vous utilisez minikube, créez une StorageClass qui utilise le provisionneur minikube:
# storageclass-minikube.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: minikube-dynamic
provisioner: k8s.io/minikube-hostpath # Provisionneur minikube
volumeBindingMode: Immediate # Lier immédiatement
reclaimPolicy: Delete # Supprimer le PV quand le PVC est supprimé
allowVolumeExpansion: true # Permettre l'expansion
Appliquez-la:
kubectl apply -f storageclass-minikube.yaml
Étape 3.2: Créer un PVC avec la StorageClass
Créez un fichier pvc-dynamic.yaml:
# pvc-dynamic.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: minikube-dynamic # Utilise la StorageClass avec provisionnement dynamique
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
Appliquez le PVC:
kubectl apply -f pvc-dynamic.yaml
Vérifiez que le PVC est créé et qu'un PV a été provisionné automatiquement:
kubectl get pvc pvc-dynamic
kubectl get pv
Vous devriez voir un nouveau PV créé automatiquement avec le statut Bound et lié au PVC.
Partie 4: Utilisation du PVC Dynamique
Créez un Pod qui utilise le PVC dynamique:
# pod-dynamic-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-dynamic-pvc
spec:
containers:
- name: app-container
image: busybox
command: ["/bin/sh", "-c"]
args: ["echo 'Données dans un volume dynamique - $(date)' > /data/dynamic-data.txt && cat /data/dynamic-data.txt && sleep 3600"]
volumeMounts:
- name: dynamic-storage
mountPath: /data
volumes:
- name: dynamic-storage
persistentVolumeClaim:
claimName: pvc-dynamic
Appliquez le Pod:
kubectl apply -f pod-dynamic-pvc.yaml
Vérifiez les logs:
kubectl logs pod-dynamic-pvc
Partie 5: Expansion de Volume (Optionnel)
Si allowVolumeExpansion: true, vous pouvez agrandir un PVC après sa création.
Modifiez le PVC pour demander plus d'espace:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"200Mi"}}}}'
Vérifiez que la demande a été mise à jour:
kubectl get pvc pvc-dynamic
Note: L'expansion réelle du volume dépend du provisionneur et du type de stockage sous-jacent.
Partie 6: Nettoyage
Supprimez les ressources créées:
kubectl delete pod pod-dynamic-pvc
kubectl delete -f pvc-dynamic.yaml
# Le PV sera automatiquement supprimé si reclaimPolicy: Delete
kubectl delete -f storageclass-minikube.yaml
kubectl delete -f storageclass-local.yaml
Résumé du Lab
Dans ce lab, vous avez exploré les StorageClasses et le provisionnement dynamique. Vous avez appris à créer des StorageClasses personnalisées, à utiliser le provisionnement automatique de PVs via des PVCs, et à comprendre les différents modes de liaison et politiques de réclamation.
Prochaines Étapes
Le dernier lab de ce module vous montrera comment utiliser les PersistentVolumes avec des StatefulSets pour des applications avec état.
Lab 6.4: StatefulSet avec Stockage Persistant
Lab créé le: Décembre 2024