Guide simple d'implémentation du stockage persistant dans Kubernetes

Découvrez comment mettre en œuvre le stockage persistant pour les applications avec état dans Kubernetes. Ce guide démystifie les PersistentVolumes (PV) et les PersistentVolumeClaims (PVC), en expliquant les modes d'accès et les StorageClasses. Il comprend des exemples YAML pratiques pour définir des PVC et monter le stockage sur vos Pods, permettant une persistance des données fiable dans vos applications conteneurisées.

35 vues

Un guide simple pour implémenter le stockage persistant dans Kubernetes

Dans le monde de l'orchestration de conteneurs, Kubernetes excelle dans la gestion des applications sans état – celles qui n'ont pas besoin de conserver des données entre les redémarrages ou les événements de mise à l'échelle. Cependant, de nombreuses applications modernes, telles que les bases de données, les files d'attente de messages et les magasins clé-valeur, sont intrinsèquement avec état. Ces applications nécessitent un moyen fiable de stocker et d'accéder aux données de manière persistante, même si les Pods qui les exécutent sont replanifiés ou remplacés. C'est là qu'intervient le stockage persistant de Kubernetes.

Ce guide démystifiera les concepts de PersistentVolumes (PV) et PersistentVolumeClaims (PVC), qui sont les composants essentiels pour la gestion du stockage persistant dans Kubernetes. Nous expliquerons comment définir, demander et lier le stockage à vos Pods avec des exemples YAML pratiques, vous permettant de déployer en toute confiance des applications avec état sur votre cluster Kubernetes.

Comprendre les PersistentVolumes (PV) et PersistentVolumeClaims (PVC)

Avant de plonger dans l'implémentation, il est crucial de comprendre les rôles des PV et des PVC :

  • PersistentVolume (PV) : Un PV est un élément de stockage dans le cluster qui a été provisionné par un administrateur ou provisionné dynamiquement à l'aide de StorageClasses. Les PV sont des ressources du cluster, tout comme les Nœuds. Ils ont un cycle de vie indépendant de tout Pod individuel qui utilise le PV. Les PV abstraient les détails d'implémentation du stockage sous-jacent (par exemple, NFS, iSCSI, stockage de blocs du fournisseur cloud).
  • PersistentVolumeClaim (PVC) : Un PVC est une demande de stockage par un utilisateur. Il consomme des ressources de stockage disponibles dans le cluster sous forme de PV. Les PVC sont similaires aux Pods dans le sens où ils consomment des ressources de calcul, et ils sont limités à un namespace. Un PVC spécifie la capacité de stockage souhaitée, les modes d'accès et, facultativement, une StorageClass.

Cette séparation des responsabilités permet aux administrateurs de cluster de provisionner et de gérer les ressources de stockage indépendamment, tandis que les développeurs d'applications peuvent demander du stockage sans avoir besoin de connaître les détails d'implémentation sous-jacents.

Concepts clés : Modes d'accès et StorageClasses

Deux concepts importants à maîtriser lors de l'utilisation des PV et des PVC sont les Modes d'accès et les StorageClasses :

Modes d'accès

Les modes d'accès définissent comment un volume peut être monté sur un Pod. Les modes d'accès disponibles sont :

  • ReadWriteOnce (RWO) : Le volume peut être monté en lecture-écriture par un seul nœud.
  • ReadOnlyMany (ROX) : Le volume peut être monté en lecture seule par plusieurs nœuds.
  • ReadWriteMany (RWX) : Le volume peut être monté en lecture-écriture par plusieurs nœuds.

Il est important de noter que la prise en charge réelle de ces modes dépend du fournisseur de stockage sous-jacent.

StorageClasses

Une StorageClass offre un moyen aux administrateurs de décrire les "classes" de stockage qu'ils proposent. Différentes classes peuvent correspondre à des niveaux de qualité de service, des politiques de sauvegarde ou des politiques arbitraires déterminées par les administrateurs du cluster. Une StorageClass a un provisionneur qui provisionne le stockage et un ensemble de paramètres pour le provisionneur. Lorsqu'un PVC est créé sans PV spécifique et qu'il demande une StorageClass, Kubernetes provisionnera dynamiquement un PV en utilisant la StorageClass spécifiée.

Implémentation du stockage persistant : étape par étape

Passons en revue un scénario courant : demander et utiliser un stockage persistant pour un Pod.

Étape 1 : Définir un PersistentVolumeClaim (PVC)

Tout d'abord, vous devez créer un PVC qui spécifie vos besoins en stockage. Ce PVC servira de demande de stockage de la part de votre application.

Exemple pvc.yaml :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

Dans cet exemple :

  • name: my-pvc : C'est le nom de notre PVC.
  • accessModes: - ReadWriteOnce : Nous demandons un stockage qui peut être monté en lecture-écriture par un seul nœud.
  • resources.requests.storage: 1Gi : Nous demandons 1 Gigaoctet de stockage.

Application du PVC :

Enregistrez le contenu ci-dessus dans un fichier nommé pvc.yaml et appliquez-le à votre cluster :

kubectl apply -f pvc.yaml

Après l'application, vous pouvez vérifier l'état du PVC :

kubectl get pvc my-pvc

Vous devriez voir une sortie indiquant que le PVC est Bound si un PV approprié est disponible ou a été provisionné dynamiquement.

Étape 2 : Créer un Pod qui utilise le PVC

Maintenant, créons un Pod qui utilisera le stockage demandé par notre PVC. Nous monterons le volume fourni par le PVC dans un répertoire spécifique à l'intérieur de notre conteneur.

Exemple pod-with-pv.yaml :

apiVersion: v1
kind: Pod
metadata:
  name: my-stateful-pod
spec:
  containers:
    - name: my-container
      image: nginx
      ports:
        - containerPort: 80
      volumeMounts:
        - name: my-persistent-storage
          mountPath: /usr/share/nginx/html
  volumes:
    - name: my-persistent-storage
      persistentVolumeClaim:
        claimName: my-pvc

Dans cet exemple :

  • volumes : Nous définissons un volume nommé my-persistent-storage.
  • persistentVolumeClaim.claimName: my-pvc : Cela relie notre volume au PVC que nous avons créé précédemment.
  • volumeMounts : Dans la définition du conteneur, nous spécifions où ce volume doit être monté (mountPath: /usr/share/nginx/html).

Application du Pod :

Enregistrez le contenu ci-dessus dans un fichier nommé pod-with-pv.yaml et appliquez-le :

kubectl apply -f pod-with-pv.yaml

Maintenant, votre conteneur nginx aura accès au stockage persistant défini par my-pvc au chemin /usr/share/nginx/html. Toutes les données écrites dans ce chemin à l'intérieur du conteneur seront conservées même si le Pod est supprimé et recréé, tant que le PVC et son PV sous-jacent subsistent.

Provisionnement dynamique avec les StorageClasses

La création manuelle de PV peut être fastidieuse. Kubernetes offre le provisionnement dynamique, où les PV sont créés automatiquement lorsqu'un PVC demande un stockage qui ne peut pas être satisfait par les PV existants. Ceci est réalisé par le biais des StorageClasses.

La plupart des fournisseurs de cloud (AWS, GCP, Azure) proposent des StorageClasses préconfigurées. Vous pouvez les inspecter avec :

kubectl get storageclass

Pour utiliser le provisionnement dynamique, il suffit d'ajouter un champ storageClassName à votre définition de PVC :

Exemple pvc-dynamic.yaml :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-dynamic-pvc
spec:
  storageClassName: standard # Remplacez 'standard' par le nom d'une StorageClass réelle
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Lorsque vous appliquez ce PVC, Kubernetes recherchera une StorageClass nommée standard (ou tout autre nom que vous spécifiez) et demandera à son provisionneur de créer un nouveau PV de 5Gi et de le lier à ce PVC.

Conseils et meilleures pratiques

  • Choisir le bon mode d'accès : Réfléchissez attentivement au mode d'accès requis par votre application. ReadWriteOnce est courant pour les bases de données à réplique unique, tandis que ReadWriteMany est nécessaire pour les systèmes de fichiers partagés utilisés par plusieurs Pods.
  • Comprendre les performances de stockage : Différents fournisseurs de stockage et StorageClasses offrent des caractéristiques de performance variables (IOPS, débit). Choisissez une StorageClass qui répond aux besoins de performance de votre application.
  • Stratégie de sauvegarde : Le stockage persistant ne signifie pas automatiquement sauvegarde. Mettez en œuvre une stratégie de sauvegarde robuste pour vos volumes persistants, en particulier pour les données critiques.
  • Politique de récupération des PV : Les PV ont une reclaimPolicy qui peut être Delete (par défaut), Retain ou Recycle (obsolète). Retain est utile pour s'assurer que les données ne sont pas perdues si un PV est supprimé mais que le stockage sous-jacent existe toujours.
  • Considérations sur les namespaces : Les PVC sont liés aux namespaces. Assurez-vous que votre Pod et votre PVC sont dans le même namespace pour que la liaison se produise.

Conclusion

L'implémentation du stockage persistant est une exigence fondamentale pour exécuter des applications avec état dans Kubernetes. En comprenant et en utilisant les PersistentVolumes et les PersistentVolumeClaims, ainsi que la flexibilité des StorageClasses, vous pouvez gérer de manière fiable les données de votre application. Ce guide a fourni les connaissances fondamentales et des exemples pratiques pour vous lancer, vous permettant de déployer des charges de travail avec état plus sophistiquées et résilientes sur Kubernetes.