Éditer sur GitHub

Kubernetes - les volumes et le stockage

Cette annexe s'efforce de donner une vue d'ensemble du stockage avec Kubernetes. Elle a pour objectif premier d'illustrer la complexité du sujet et de montrer qu'héberger les données non jetables d'applications dans Kubernetes ne sera pas une mince affaire.

Les volumes

Kubernetes distingue plusieurs types de volumes répondant à différents cas d'utilisation :

Les pilotes pour le stockage

Kubernetes dispose d'un mécanisme de plugin permettant d'intégrer différentes solutions de stockage (c.f. kubernetes-csi.github.io - CSI Drivers) dont :

Dans les cas où nous utilisons Kubernetes en mode SaaS, nous soulignerons que les possibilités offertes par défaut seront fonctions de l'infrastructure :

Provisionnement statique et dynamique

Le concept de PersistentVolumeClaim permettra de faire abstraction sur la commande d'un volume persistant :

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nginx
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast
  resources:
    requests:
      storage: 30Gi

Le concept de StorageClass permettra de répondre à cette demande avec deux cas de figure :

La commande kubectl get storageclass renverra la liste des classes de stockage mise à disposition pour le provisionnement dynamique.

Les modes d'accès

Nous soulignerons que tous les types de stockage n'offrent pas les mêmes possibilités. En particulier, Kubernetes distinguera plusieurs modes d'accès dont :

Ainsi :

En règle générale, il sera préférable de ne pas avoir recours à un stockage ReadWriteMany pour des raisons de performance et éventuellement de coût (mais se libérer de cette contrainte pourra demander des efforts de refonte importants).

Cas des StatefulSet

La propriété volumeClaimTemplates sur les StatefulSet permettra de laisser Kubernetes se charger de la création d'un PVC par Pod (postgres-0, postgres-1,...) :

Il convient de noter qu'il n'y aura pas de suppression automatique sur les PVC créés automatiquement pour les Pod d'un StatefulSet (ils survivront à la suppression des Pods et du StatefulSet).

Mise en garde

Par exemple, la suppression brutale d'un Pod récalcitrant à la suppression (status=Terminating) se traduira par le démontage incomplet de ces volumes et le blocage du redémarrage du Pod sur un autre noeud.