Volumes - Au-delà des ConfigMaps et Secrets#

Lorsque vous avez monté des ConfigMaps et des Secrets dans vos Pods, vous avez utilisé le mécanisme de “volumes”. Ils peuvent aussi être utilisés pour gérer la persistance des données

Volumes : intérêt ?

Dans un conteneur, tout ce qui est écrit sur le système de fichiers est éphémère : si le conteneur redémarre, les données sont perdues. Les volumes résolvent ce problème en permettant de :

  • Persister des données au-delà du cycle de vie d’un conteneur

  • Injecter des fichiers de configuration (comme vous l’avez fait avec ConfigMap et Secret)

Les volumes que vous connaissez déjà#

Vous avez déjà utilisé deux types de volumes sans le savoir :

Volume de type configMap ou secret#

volumes:
- name: config-volume
  configMap:
    name: my-app-config

Ce type de volume monte les données d’un ConfigMap ou d’un Secret sous forme de fichiers dans le conteneur.

D’autres types de volumes#

Kubernetes propose de nombreux types de volumes. En voici quelques-uns pour comprendre la diversité des cas d’usage :

hostPath - Accéder au système de fichiers du nœud#

Un volume hostPath monte un fichier ou un répertoire depuis le nœud (la machine hôte) dans le conteneur.

Attention !

hostPath est dangereux en production car :

  • Il peut exposer des fichiers sensibles du système

  • Il pose des problèmes de sécurité et de portabilité

À utiliser uniquement pour des cas très spécifiques (monitoring système, accès à Docker socket, etc.)

Exemple d’utilisation :

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-hostpath
spec:
  containers:
  - name: my-container
    image: ubuntu:22.04
    command: ["/bin/sh", "-c", "ls -la /host-data && sleep 3600"]
    volumeMounts:
    - name: host-volume
      mountPath: /host-data
  volumes:
  - name: host-volume
    hostPath:
      path: /tmp
      type: Directory

Exercice : Tester un volume hostPath

Cet exercice vous permet de comprendre comment hostPath fonctionne et pourquoi il crée une dépendance avec le nœud.

  1. Créez un fichier sur le nœud minikube :

    minikube ssh
    echo "Fichier créé sur le nœud" > /tmp/test-hostpath.txt
    exit
    
  2. Créez un Pod qui monte /tmp du nœud dans le fichier pod-hostpath.yaml :

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-hostpath
    spec:
      containers:
      - name: reader
        image: ubuntu:22.04
        command: ["/bin/sh", "-c", "cat /host-tmp/test-hostpath.txt && sleep 3600"]
        volumeMounts:
        - name: host-tmp
          mountPath: /host-tmp
      volumes:
      - name: host-tmp
        hostPath:
          path: /tmp
          type: Directory
    
  3. Appliquez et vérifiez que le Pod peut lire le fichier du nœud :

    kubectl apply -f pod-hostpath.yaml
    kubectl logs test-hostpath
    # Devrait afficher : "Fichier créé sur le nœud"
    
  4. Modifiez le fichier depuis le Pod :

    kubectl exec test-hostpath -- sh -c "echo 'Modifié depuis le Pod' >> /host-tmp/test-hostpath.txt"
    
  5. Vérifiez sur le nœud que la modification est visible :

    minikube ssh
    cat /tmp/test-hostpath.txt
    exit
    # Devrait afficher les deux lignes
    
  6. Nettoyez :

    kubectl delete pod test-hostpath
    

nfs - Partage de fichiers réseau#

Un volume nfs (Network File System) permet de monter un partage NFS existant dans vos Pods. C’est une solution simple et éprouvée pour partager des données entre plusieurs Pods, même s’ils tournent sur des nœuds différents.

Avantages :

  • Les données persistent indépendamment du cycle de vie des Pods

  • Plusieurs Pods peuvent accéder simultanément aux mêmes données (lecture/écriture)

  • Technologie mature et largement supportée

Exemple :

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-nfs
spec:
  containers:
  - name: my-container
    image: ubuntu:22.04
    command: ["/bin/sh", "-c", "ls -la /mnt/nfs && sleep 3600"]
    volumeMounts:
    - name: nfs-volume
      mountPath: /mnt/nfs
  volumes:
  - name: nfs-volume
    nfs:
      server: nfs-server.example.com
      path: /exported/path

Prérequis

Pour utiliser un volume NFS, vous devez avoir :

  • Un serveur NFS accessible depuis votre cluster

  • Les permissions appropriées configurées sur le serveur NFS

Autres types de volumes disponibles#

Kubernetes supporte de nombreux autres types de volumes, notamment :

  • Volumes cloud : aws, azure, …

  • iscsi