Les Persistent volumes (PV) permettent de rendre disponible un espace de stockage pour l’application déployée.

Les pods peuvent monter du stockage avec un Persistent Volume Claim (PVC).

C’est Kubernetes qui s’occupe de trouver l’espace demandé parmi les PV disponibles et qui correpondent.

Il existe de nombreux types de volumes soit inclus directement dans Kubernetes, soit à ajouter en tant que plugin.

Le but du jeu dans un cluster étant que les données persistantes soient partagées sur un volume commun.

Types de volumes

Voici une liste non exhaustive

  • cephfs : Ceph est un système de fichiers distribué à haute disponibilité. Complexe à mettre en place.
  • configMap : Permet d’injecter des configurations dans les pods
  • emptyDir : Rend disponible un répertoire vide
  • fc (fiber channel) : Pour accéder à un SAN de type FC
  • hostPath : A éviter, préférer plutôt un volume local
  • iscsi : Pour accéder à un SAN de type iSCSI
  • local : Permet d’accéder à un volume monté en local comme une partition, un disque, un répertoire
  • nfs : Pour accéder à un montage Unix NFS
  • secret : Volume particulier utilisé pour stocker des secrets (mots de passe, API Keys, …)

Le plus simple pour un projet de test avec un stockage partagé est NFS à mon avis.

Je vous renvoie vers de nombreuses docs pour voir comment monter un serveur NFS.

Un “Hello world” avec Nginx

Création de répertoire local et du fichier

# Je choisis de mettre mes volumes dans /vagrant car c'est un répertoire partagé entre la VM et l'hôte dans ma config Vagrant.
mkdir -p /vagrant/VOLUMES/data
echo "Hello world" > /vagrant/VOLUMES/data/index.html

Créer un PV de type local

Exemple de PV local :

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-first-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/vagrant/VOLUMES/data"

Ajouter dans Kubernetes :

k apply -f pv.yaml

Créer un PVC

Exemple de PVC pour utiliser le PV

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

Ajouter dans Kubernetes :

k apply -f pvc.yaml

Créer un Pod Nginx qui utilise un PVC

# pvc-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
spec:
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
        claimName: pvc
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage

Ajouter dans Kubernetes :

k apply -f pvc-pod.yaml

Il ne reste qu’à vérifier :

k exec -it task-pv-pod -- /bin/bash
# cat /usr/share/nginx/html