Aller au contenu principal
Sommaire de la formation

Volumes hostPath et emptyDir

coolibra629 vues

Volumes hostPath et emptyDir

Dans kuernetes, les volumes sont utilisés pour stocker des données persistantes ou temporaires que des conteneurs peuvent partager ou utiliser. Deux types de volumes fréquemment utilisés sont hostPath et emptyDir. Chacun de ces volumes sert des objectifs différents en fonction de la durée de vie et de la nature des données.

1. hostPath Volume

Le volume hostPath permet à un pod d'accéder à un répertoire sur le système de fichiers du nœud hôte (machine physique ou virtuelle où tourne Kubernetes). Ce type de volume est utile lorsqu'il faut partager des données entre un conteneur et son hôte ou lorsqu'on souhaite accéder à un répertoire spécifique sur le nœud.

  • Caractéristiques :
    • Accès au système de fichiers de l'hôte : Un hostPath pointe vers un répertoire sur le nœud hôte. Le pod peut accéder à ce répertoire ou à des fichiers sur l'hôte.
    • Partage de données entre l'hôte et les pods : Ce volume permet de partager des fichiers ou des répertoires entre les conteneurs et le système d'exploitation hôte.
    • Utilisation limitée : C’est souvent utilisé dans des environnements où des données doivent être partagées entre les conteneurs et le nœud, mais il est limité dans un contexte de production Kubernetes car l'accès aux fichiers de l'hôte peut créer des problèmes de sécurité.

 

  • Exemple d’utilisation avec nginx:
apiVersion: v1
kind: Pod
metadata:
  name: hostpath-example
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: hostpath-volume
  volumes:
  - name: hostpath-volume
    hostPath:
      path: /var/www/data
      type: DirectoryOrCreate
  • Dans cet exemple :
    • path: /var/www/data : Il s'agit du répertoire sur l'hôte auquel le conteneur Nginx va accéder.
    • mountPath: /usr/share/nginx/html : Ce répertoire dans le conteneur sera mappé avec le répertoire /var/www/data sur l'hôte.
    • type: DirectoryOrCreate : Cela spécifie que le volume est un répertoire et sera créé automatiquement. Il existe d’autres options comme File, Socket, etc.

 

kubectl apply -f hostpath-volume.yaml

kubectl get po -o wide

 

 

  • Exepmple hostPath FileOrCreate configuration example

Le manifeste suivant définit un Pod qui monte /var/local/data à l'intérieur du conteneur du Pod. Si le nœud n'a pas déjà de chemin /var/local/data, kubelet le crée en tant que répertoire, puis le monte dans le Pod.

Si un /var/local/data élément existe déjà mais n'est pas un répertoire, le Pod échoue. De plus, kubelet tente de créer un fichier nommé /var/local/data/data.txt à l'intérieur de ce répertoire (vu depuis l'hôte) ; si quelque chose existe déjà à ce chemin et n'est pas un fichier normal, le Pod échoue.

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  os: { name: linux }
  nodeSelector:
    kubernetes.io/os: linux
  containers:
  - name: test-webserver
    image: registry.k8s.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/www/data
      name: data-dir
    - mountPath: /var/www/data/data.txt
      name: data-file
  volumes:
  - name: data-dir
    hostPath:
      # Ensure the file directory is created.
      path: /var/www/data
      type: DirectoryOrCreate
  - name: data-file
    hostPath:
      path: /var/www/data/data.txt
      type: FileOrCreate
  • Cas d’utilisation :
    • Accès aux fichiers de configuration sur le nœud hôte.
    • Accès aux journaux ou fichiers de données partagés entre l’hôte et les pods.
  • Inconvénients :
    • Il peut y avoir des risques de sécurité, car les pods ont accès à un répertoire sur le nœud hôte.
    • Ce type de volume n’est pas portable entre les nœuds, car il est directement lié à l’infrastructure physique ou virtuelle sous-jacente.
kubectl apply -f hostpath-volume.yaml

kubectl get po -o wide

 

2. EmptyDir Volume:

Le volume emptyDir est utilisé pour stocker des données temporaires qui sont créées et supprimées avec le pod. Ce volume est vidé lorsque le pod est supprimé. Il est utile pour les données temporaires telles que les fichiers de cache, les fichiers temporaires ou pour les cas où les conteneurs d’un pod doivent partager des données en interne.

  • Caractéristiques :
    • Données temporaires : Les données stockées dans un emptyDir ne sont pas persistantes et sont effacées dès que le pod est supprimé.
    • Partage de données entre conteneurs : Si plusieurs conteneurs dans un pod ont besoin de partager des données, ils peuvent le faire facilement via un emptyDir.
    • Pas de persistance au-delà du pod : Ce volume est utile pour des données qui ne nécessitent pas de persistance entre les redémarrages du pod.

 

  • Exemple1 données de cache:
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: registry.k8s.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 500Mi
  • Exemple2:
apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir
spec:
  containers:
  - name: container-1
    image: busybox:latest
    command: ["sh", "-c", "echo 'Hello from Container 1' > /data/file.txt"]
    volumeMounts:
    - name: emptydir-volume
      mountPath: /data
  - name: container-2
    image: busybox:latest
    command: ["cat", "/data/file.txt"]
    volumeMounts:
    - name: emptydir-volume
      mountPath: /data
  volumes:
  - name: emptydir-volume
    emptyDir: {}

 

  • Exemple3:
apiVersion: v1
kind: Pod
metadata:
  name: emptydir-example
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: emptydir-volume
  volumes:
  - name: emptydir-volume
    emptyDir: {}

 

  • Dans cet exemple :
    • emptyDir: {} : Le volume emptyDir est configuré sans paramètres supplémentaires, ce qui signifie qu'il sera simplement un répertoire temporaire monté dans le conteneur.
    • mountPath: /usr/share/nginx/html : Ce répertoire est monté dans le conteneur Nginx pour stocker des fichiers temporaires.
  • Cas d’utilisation :
    • Fichiers temporaires : Stockage de fichiers temporaires générés par un processus dans un pod, comme des logs ou des fichiers de traitement.
    • Cache partagé entre conteneurs : Lorsque plusieurs conteneurs d’un pod doivent partager des données temporaires (par exemple, des données de cache).
  • Inconvénients :
    • Les données sont perdues lorsque le pod est supprimé. Cela rend emptyDir inapproprié pour le stockage de données persistantes ou critiques.

 

kubectl apply -f  empty-dir.yaml

kubectl get po -o wide

 

 

3. Comparaison : hostPath vs emptyDir

Caractéristique hostPath emptyDir
Type de stockage Répertoire ou fichier sur l'hôte Répertoire temporaire dans le pod
Durée de vie des données Les données persistent au-delà de la vie du pod Les données sont perdues lorsque le pod est supprimé
Partage de données Partage entre l'hôte et les pods Partage entre les conteneurs d’un même pod
Cas d'utilisation Accès aux fichiers ou répertoires sur l’hôte Fichiers temporaires, cache, partage interne entre conteneurs
Portabilité Lié à l’hôte et non portable Portable (uniquement dans le pod)
Sécurité Risque de sécurité si mal configuré Pas de risque de sécurité spécifique

 

Conclusion

  • hostPath est utilisé lorsque vous avez besoin d’accéder à des répertoires ou fichiers spécifiques sur l’hôte, mais il doit être utilisé avec précaution, surtout en production, en raison des risques de sécurité.
  • emptyDir est adapté pour stocker des données temporaires ou partagées entre les conteneurs d’un même pod, mais les données ne sont pas persistantes une fois que le pod est supprimé.

Chaque type de volume a des cas d'utilisation spécifiques en fonction de la persistance, de la sécurité et de la portée des données.

Commentaires

Connectez-vous pour rejoindre la discussion.

Aucun commentaire pour le moment.