Aller au contenu principal

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

  1. Modifier le PVC pour demander plus de stockage:
kubectl patch pvc pvc-dynamic -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
  1. Vérifier l'expansion:
kubectl get pvc pvc-dynamic

Note: L'expansion est supportée seulement si:

  • allowVolumeExpansion: true dans 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