Stockage dans Kubernetes

Les données ne peuvent pas être stockées dans le pod, lorsque le pod est supprimé ou est terminé, les données qu’il contient ne restent pas sur le système. Pour fournir un stockage à long terme et temporaire aux Pods dans le cluster, Kubernetes fournit différents types de mécanismes de stockage.

Dans cet article, nous verrons des exemples de seulement 2 types de mécanismes de stockage.

  1. hostPath :
    Un volume hostPath monte un fichier ou un répertoire du système de fichiers du nœud hôte dans ton Pod. Ce type de volume peut être utilisé pour permettre à un Pod de spécifier si un hostPath donné doit exister avant le fonctionnement du Pod ou s’il doit être créé. Ce type de volume n’est pas quelque chose dont la plupart des Pods auront besoin. Le type DirectoryOrCreate créera un répertoire vide s’il n’existe pas avec la permission définie sur 0755 et le type Directory permet de s’assurer qu’un répertoire existe au chemin donné avant la création du Pod.
  2. emptyDir :
    Un volume emptyDir est créé pour la première fois lorsqu’un pod est attribué à un nœud et existe tant que ce pod fonctionne sur ce nœud. Par défaut, les volumes emptyDir sont stockés sur le type de stockage dont dispose notre environnement. Nous pouvons aussi définir le champ emptyDir.medium sur Memory pour indiquer à Kubernetes de monter un système de fichiers sauvegardé en RAM.

Pour connaître d’autres mécanismes de stockage dans Kubernetes, clique ici.

Pré-requis

  1. Cluster Kubernetes avec au moins 1 nœud de travail.
    Si tu veux apprendre à créer un cluster Kubernetes, cliqueici. Ce guide t’aidera à créer un cluster Kubernetes avec 1 Maître et 2 Nœuds sur des Instances EC2 AWS Ubuntu 18.04.

Que ferons-nous ?

  1. Créer un pod avec un volume de différents types monté dans celui-ci

Crée un pod avec un volume de différents types monté dans celui-ci

Volume du chemin d’accès de l’hôte avec le type : Répertoire

Crée un fichier de définition d’objet pour monter un répertoire existant dans le pod.

vim volume-hostpath-1.yml
apiVersion: v1
kind: Pod
metadata:
  name: volume-hostpath-example-1
spec:
  containers:
  - image: nginx
    name: my-container
    volumeMounts:
    - mountPath: /opt/mounted-here
      name: my-volume-1
  volumes:
  - name: my-volume-1
    hostPath:
      path: /dir
      type: Directory

volume-hostpath-1-definition

Obtiens une liste de pods et crée un pod qui montera « /opt/mounted-here » dans le pod sur « /dir » depuis l’hôte.

kubectl  get pods
kubectl  create -f volume-hostpath-1.yml
kubectl  get pods
kubectl  describe pod volume-hostpath-example-1

create-pod-and-get-its-details

Maintenant, si tu décris le pod, tu verras que la création du pod a échoué. Le montage a échoué car le répertoire « /dir » n’existe pas sur l’hôte. Pour monter un volume dans le pod avec « type : Répertoire », le répertoire de l’hôte doit exister.

Créons maintenant un répertoire « /dir » sur l’hôte, c’est-à-dire sur le nœud ouvrier.

sudo mkdir /dir

Une fois que nous avons créé un répertoire sur les nœuds ouvriers, nous pouvons supprimer le pod précédemment créé et essayer de recréer un nouveau pod.

kubectl  delete -f volume-hostpath-1.yml
kubectl  create -f volume-hostpath-1.yml
kubectl  get pods
kubectl  describe pod volume-hostpath-example-1

create-dir-on-host-and-then-create-a-pod

Cette fois, tu peux voir que le pod a été créé avec succès et que sous volumes, on peut voir le chemin monté « /dir ».

Maintenant, connectons-nous au pod et créons un fichier

kubectl  get pods
kubectl  exec -it volume-hostpath-example-1  /bin/bash
touch /opt/mounted-here/new-file

Le fichier que nous avons créé dans le pod est maintenant visible depuis le nœud ouvrier sous le répertoire monté « /dir ».

ll /dir/ #Execute this command on the worker node

se connecter à un pod et créer un fichier

Cette fois, supprimons le pod que nous avons créé et voyons si le fichier existe toujours dans le répertoire hôte « /dir » ou non.

exit
kubectl  get pods
kubectl delete pod volume-hostpath-example-1

Liste les fichiers sous « /dir » sur le nœud ouvrier.

ll /dir/ #Execute this command on the worker node

supprimer le fichier de vérification sur l'hôte

Nous pouvons voir que même après avoir supprimé le pod, le fichier existe toujours sous « /dir » sur le nœud ouvrier. Cela signifie que les données persistent même après la suppression ou la fin du pod.

Dans cet exemple, nous avons observé que le répertoire de l’hôte qui doit être monté dans le port doit exister.

Le volume du chemin de l’hôte avec le type : DirectoryOrCreate

Pour être sûr qu’un répertoire hôte est disponible avant le montage, nous pouvons utiliser « type : DirectoryOrCreate » au lieu de « type : Directory » dans le volume hostpath.

Crée un nouveau fichier avec le type « type : DirectoryOrCreate ».

vim volume-hostpath-2.yml
apiVersion: v1
kind: Pod
metadata:
  name: volume-hostpath-example-2
spec:
  containers:
  - image: nginx
    name: my-container
    volumeMounts:
    - mountPath: /opt/mounted-here
      name: my-volume-2
  volumes:
  - name: my-volume-2
    hostPath:
      # directory location on host
      path: /mount-this
      type: DirectoryOrCreate

volume-hostpath-2-definition

Obtiens une liste des pods existants et crée un nouveau pod avec le fichier créé dans l’état ci-dessus.

kubectl  get pods
kubectl create -f volume-hostpath-2.yml
kubectl  get pods
kubectl  describe pod volume-hostpath-example-2

créer-un-pod-et-obtenir-ses-détails

Lorsque nous décrivons le pod, on peut voir que le pod a été créé avec succès. Et le répertoire « /mount-this » qui n’existe pas sur le nœud hôte/travailleur a été créé sur l’hôte lors du montage dans le volume.

Va sur les nœuds ouvriers et vérifie si le répertoire a été créé ou non.

ll /mount-this/ #Execute this command on the worker node

Crée maintenant un nouveau fichier sur les nœuds ouvriers dans le répertoire « /mount-this » qui est monté dans le pod.

sudo touch /mount-this/created-on-host #Execute this command on the worker node

Connectez-vous au pod et vérifiez le répertoire « /opt/mounted-here/ » pour voir si le fichier « /mount-this/created-on-host » que nous avons créé sur le nœud de travail existe dans le pod.

kubectl  get pods
kubectl  exec -it volume-hostpath-example-2 /bin/bash
ls -l /opt/mounted-here/

créer un fichier sur l'hôte et vérifier dans le pod

Maintenant, supprime le pod et regarde si le fichier existe toujours sur le nœud de travail dans le répertoire « /mount-this/ ».

exit
kubectl  get pods
kubectl delete pod volume-hostpath-example-2

Exécute la commande suivante pour répertorier le fichier sur le nœud de travail à « /mount-this/ ».

sudo ls -lt /mount-this/ #Execute this command on the worker node
supprimer le fichier de vérification sur l'hôte

Dans cet exemple, nous avons vu que même si le répertoire hôte n’existe pas, il est créé sur la machine hôte avant d’être monté dans le pod.

Volume emptyDir

Crée un fichier de définition d’objet en utilisant ce qui suit.

vim volume-emptydir.yml
apiVersion: v1
kind: Pod
metadata:
  name: volume-emptydir-example
spec:
  containers:
  - image: nginx
    name: my-container
    volumeMounts:
    - mountPath: /opt/this
      name: my-volume-3
  volumes:
  - name: my-volume-3
    emptyDir: {}

volume-emptydir-definition

Obtiens une liste de pods et crée un nouveau pod pour monter un volume de type « emptyDir ».

kubectl  get pods
kubectl  create -f volume-emptydir.yml #Create an object using the file
kubectl  get pods
kubectl  describe pod volume-emptydir-example #Get details  of the specified pod

créer-un-pod-et-décrire-ses-détails

Dans la capture d’écran ci-dessus, on peut voir que le pod a été créé et que le volume est disponible.

Maintenant, connecte-toi au pod et crée un répertoire sous le chemin de montage « /opt/this ». Cette fois, nous n’avons pas de volume de l’hôte.

kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod

se connecter au pod et ne pas voir de dossier sur l'hôte

Nous pouvons maintenant supprimer le pod s’il n’est plus nécessaire.

kubectl get pods #Get a list of Pods
kubectl  delete pod volume-emptydir-example #Delete the specified pod

Conclusion

Dans cet article, nous avons vu les étapes et les fichiers d’exemple pour créer des pods avec un volume de type hostPath et emptyDir. Nous avons vu comment « type:DirectoryOrCreate » sous le type de volume hostPath peut nous aider à monter un répertoire qui n’existe pas sur le nœud de travail/hôte.

Vous aimerez aussi...