Guide et instructions

1. Objectifs

  • Utilisation des volumes
  • La persistance des données

2. Introduction

Créez un dossier « lab06 » et basculez dans ce dossier

mkdir lab06
cd lab06

Volumes

3.1 Volume « emptyDir »

Créer un pod pour le service nginx sans volume avec le manifeste nginx-sans-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-sans-volume
spec:
  containers:
  - name: nginx
    image: nginx

Appliquez le pod avec la commande

kubectl apply -f nginx-sans-volume.yaml

Listez les pods

kubectl get pods -o wide

Récupérez l’adresse ip de pod nginx-sans-volume

kubectl get pod nginx-sans-volume -o jsonpath={.status.podIP}

Créez un pod pour tester les connexions curl sur les pods.

kubectl run testpod --image=curlimages/curl -i --tty -- sh

Sortez de pod avec CTR+D.

Envoyez une requête curl à travers le pod de test « testpod » vers le pod « nginx-sans-volume ».

kubectl exec testpod -- curl [POD_NGINX_SANS_VOLUME_IP]

Créez un pod pour le service « nginx » nommé nginx-avec-volume. Créez un volume « www » sans spécifier le type donc par défaut c’est « emptyDir ». Montez ce volume sur « /usr/share/nginx/html/ ».

Le manifeste qui résume ces taches est nginx-avec-volume.yaml ci-dessous:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-avec-volume
spec:
  volumes:
  - name: www
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: www
      mountPath: /usr/share/nginx/html/

Appliquez le pod avec la commande

kubectl apply -f nginx-avec-volume.yaml

Envoyez une requête curl vers ce nouveau pod avec « testpod » On va obtenir « 403 » car le volume est vide.

kubectl delete -f nginx-avec-volume.yaml

Ajoutez un autre container au pod « ngix-avec-volume » avec le volume « www ». Le manifete nginx-avec-volume.yaml devient comme suit:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-avec-volume
spec:
  volumes:
    - name: www
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - name: www
        mountPath: /usr/share/nginx/html/
    - name: gdata
      image: debian
      command: ["/bin/sh", "-c"]
      args:
        - while true; do
            date >> /www/index.html;
            sleep 1;
          done
      volumeMounts:
        - name: www
          mountPath: /www/
  restartPolicy: OnFailure

Appliquez à nouveau ce pod

kubectl apply -f nginx-avec-volume.yaml

Envoyer une requete curl vers ce pod

kubectl exec testpod -- curl [POD_NGINX_AVEC_VOLUME_IP]

Les volumes de type « emptyDir » sont éphémères comme leur pod

Supprimez les pods

kubectl delete pods --all

4. Volume persistent

Dans ce qui a précédé, vous avez pu aborder le cycle de vie du container dans Kubernetes. Un point important à retenir est qu’un container a une durée de vie relativement courte et, qu’en l’état, il n’est pas possible de conserver de la donnée. Pour répondre à ce besoin, Kubernetes peut mettre à disposition des espaces de stockage externes au cluster. Ce mécanisme s’appuie sur la notion de volume de données persistant (Persistent Volume) Déclarez un volume persistant de type « persistentVolume » de 100M avec le manifeste pv.yaml

apiVersion: v1 
kind: PersistentVolume 
metadata:
  name: pv1
spec: 
  accessModes: 
    - ReadWriteOnce 
  storageClassName: manual 
  capacity: 
    storage: 100Mi 
  hostPath: 
    path: /tmp/pv1

L’application de cette déclaration se fera à l’aide de la commande suivante:

kubectl apply -f pv.yaml

Listez les volumes

kubectl get pv

L’état de volume est dsponible, il faut le lié à un volume de type « persistentVolumeClaim ». Déclarez un volume persistant de type « persistentVolumeClaim » de 100M avec le manifeste pvc.yaml

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
   name: pvc1
spec: 
   accessModes: 
     - ReadWriteOnce 
   storageClassName: manual 
   resources: 
     requests: 
       storage: 100Mi 
   volumeName: pv1
kubectl apply -f pvc.yaml

Listez les volumes avec la commande

kubectl get pv,pvc 

On voit bien que le « status » de volume pv1 est « Bound » Maintenant créez un pod pour le serveur « nginx » et montez le volume pvc1 dans « /usr/share/nginx/html/index.html » Voici le manifeste nginx-pvc.yaml à compléter.

kind: Pod
apiVersion: v1
metadata:
  name: nginx-pvc-pod
spec:
  volumes:
    - name: pvc1
      # Complétez la déclaration du volume
      ...
  containers:
    - name: nginx-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pvc1

Lancez ce pod avec la commande

kubectl apply -f nginx-pvc.yaml

Lister les pod et volume

kubectl get pv,pvc,pod -o wide

Accédez au pod « nginx-pv-pod »

kubectl exec -it nginx-pvc-pod -- bash

Lancez les commandes suivantes dans le container

echo 'K8s demo!' > /usr/share/nginx/html/index.html
curl http://localhost

On va obtenir le message ‘K8s demo!’ Supprimez le pod

kubectl delete -f nginx-pvc.yaml

Relancez la création de pod ensuite accédez ou pod et exécutez la commande

curl http://localhost

Est-ce que on a obtenu le même résultat qu’avant ?

Supprimez et nettoyer les ressources

kubectl delete -f nginx-pvc.yaml
kubectl delete -f pvc.yaml
kubectl delete -f pv.yaml