Créez un dossier « lab06 » et basculez dans ce dossier
mkdir lab06
cd lab06
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
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