Chapitre 6.3 - StorageClasses et Provisionnement Dynamique
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce qu'est une StorageClass
- Configurer le provisionnement dynamique
- Créer et utiliser des StorageClasses
- Comprendre les différents provisioners
- Choisir la bonne StorageClass selon le cas d'usage
- Configurer l'expansion de volumes
Introduction
Créer manuellement des PersistentVolumes pour chaque demande de stockage est fastidieux. Les StorageClasses permettent le provisionnement dynamique : Kubernetes crée automatiquement un PV quand un PVC est créé.
Qu'est-ce qu'une StorageClass?
Une StorageClass décrit les classes de stockage disponibles et permet le provisionnement dynamique de PersistentVolumes. Elle définit:
- Le provisioner (comment créer le volume)
- Les paramètres (type de stockage, IOPS, etc.)
- La reclaim policy par défaut
- Si l'expansion de volume est autorisée
Création d'une StorageClass
Exemple: StorageClass AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Composants:
- name: Nom de la StorageClass
- provisioner: Plugin qui crée le volume
- parameters: Paramètres spécifiques au provisioner
- reclaimPolicy: Retain ou Delete (par défaut)
- allowVolumeExpansion: Permet l'agrandissement du volume
- volumeBindingMode: Immediate ou WaitForFirstConsumer
Provisioners
Provisioners Cloud
AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: aws-ebs-gp3
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
kmsKeyId: "arn:aws:kms:..."
Azure Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: azure-disk-ssd
provisioner: kubernetes.io/azure-disk
parameters:
storageaccounttype: Premium_LRS
kind: managed
GCE Persistent Disk
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gce-pd-ssd
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
replication-type: regional-pd
Provisioners Locaux
Local Storage
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
NFS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: example.com/nfs
parameters:
server: nfs-server.example.com
path: /exports
Provisionnement Dynamique
Créer un PVC avec StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-dynamic
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Processus:
Résultat: Kubernetes crée automatiquement un PV correspondant au PVC.
Volume Binding Modes
Immediate
Le PV est créé et lié immédiatement quand le PVC est créé.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: immediate-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: Immediate
Avantages:
- PVC disponible immédiatement
- Pas d'attente
Inconvénients:
- Volume créé même si non utilisé
- Peut créer des volumes sur le mauvais node
WaitForFirstConsumer
Le PV est créé seulement quand un Pod utilise le PVC.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: wait-sc
provisioner: kubernetes.io/aws-ebs
volumeBindingMode: WaitForFirstConsumer
Avantages:
- Volume créé sur le bon node
- Évite les volumes inutilisés
Inconvénients:
- Délai au premier montage
Expansion de Volumes
Activer l'Expansion
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: expandable-sc
provisioner: kubernetes.io/aws-ebs
allowVolumeExpansion: true
Agrandir un Volume
- Modifier le PVC pour demander plus de stockage:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
- Vérifier l'expansion:
kubectl get pvc pvc-dynamic
Note: L'expansion est supportée seulement si:
allowVolumeExpansion: truedans la StorageClass- Le provisioner supporte l'expansion
- Le système de fichiers supporte l'expansion (ext4, xfs)
Exemple Complet
Étape 1: Créer la StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: production-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Étape 2: Créer le PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data-pvc
spec:
storageClassName: production-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
Étape 3: Utiliser dans un Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: app
image: my-app:1.0
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data-pvc
StorageClass par Défaut
Définir une StorageClass par Défaut
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: default-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
Résultat: Les PVCs sans storageClassName utilisent cette StorageClass.
PVC Sans StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
# Pas de storageClassName = utilise la StorageClass par défaut
Commandes Utiles
Voir les StorageClasses
# Lister les StorageClasses
kubectl get storageclass
kubectl get sc
# Détails d'une StorageClass
kubectl describe storageclass fast-ssd
Voir les PVCs et PVs
# Lister les PVCs
kubectl get pvc
# Voir les PVs créés dynamiquement
kubectl get pv
# Détails d'un PVC
kubectl describe pvc pvc-dynamic
Expansion de Volume
# Agrandir un PVC
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
# Vérifier l'état
kubectl get pvc pvc-dynamic
Bonnes Pratiques
1. Utiliser le Provisionnement Dynamique
Préférer les StorageClasses au provisionnement manuel pour la flexibilité.
2. Choisir le Bon Volume Binding Mode
- Immediate: Pour volumes partagés (NFS)
- WaitForFirstConsumer: Pour volumes locaux (EBS, Azure Disk)
3. Activer l'Expansion
Activer allowVolumeExpansion: true pour permettre l'agrandissement sans recréer.
4. Reclaim Policy Appropriée
- Retain: Pour données importantes
- Delete: Pour données temporaires
5. Monitoring
Surveiller l'utilisation et les coûts du stockage.
Résumé
Dans ce chapitre, vous avez appris:
StorageClass: Décrit les classes de stockage et permet le provisionnement dynamique
Provisionnement dynamique: Création automatique de PVs quand un PVC est créé
Provisioners: Plugins qui créent les volumes (EBS, Azure Disk, GCE PD, NFS, etc.)
Volume Binding Modes: Immediate (immédiat) ou WaitForFirstConsumer (attendre le Pod)
Expansion: Permet d'agrandir un volume existant
StorageClass par défaut: Utilisée quand aucun storageClassName n'est spécifié
Avantages: Flexibilité, automatisation, réduction de la gestion manuelle
Prochaines Étapes
Chapitre 6.4: StatefulSets avec Stockage Persistant
Lab 6.3: StorageClasses et Provisionnement Dynamique
Chapitre créé le: Décembre 2024