2 minutes
K8S Chap. 5 - Persistance avec les volumes
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 podsemptyDir
: Rend disponible un répertoire videfc (fiber channel)
: Pour accéder à un SAN de type FChostPath
: A éviter, préférer plutôt un volume localiscsi
: Pour accéder à un SAN de type iSCSIlocal
: Permet d’accéder à un volume monté en local comme une partition, un disque, un répertoirenfs
: Pour accéder à un montage Unix NFSsecret
: 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