# 🇫🇷 Kit de survie K8S pour les dévs avec K3S - Partie 5: Les Volumes

Dans le précédent article (opens new window), je vous expliquais comment utiliser une Docker registry "unsecure" avec notre cluster K3S. Nous allons donc nous servir de cette registry pour cette nouvelle partie.

🤔 je suis en train de chercher un moyen plus simple pour la Docker registry - le seul que j'ai trouvé pour le moment est d'utiliser directement l'IP de la VM plutôt qu'un "nom de domaine". Une piste serait d'installer la registry directement dans le cluster, mais pour le moment je bataille encore sur certains points.

Mais revenons à nos 🐑🐑🐑. Comme vous le savez, les containers sont par nature éphémères/immutables, c'est donc une très mauvaise idée de vouloir persister des données dans ces containers. Nous allons donc utiliser la notion de Volume afin de pouvoir sauver nos données et les retrouver après un redémarrage de cluster, une suppression de pod, ...

# Préalable

# Une image "utilitaires"

Mais avant, nous allons nous créer une image "utilitaires" qui nous permettra de faire des tests facilement. Donc quelque part sur votre machine, dans un répertoire, créez un fichier Dockerfile avec ce contenu:

FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
    nano \
    curl \
    nodejs \
    redis

bien sûr vous pouvez ajouter tous les outils dont vous avez besoin

# Build et Push de l'image

version="0.0.0"
registry_domain="registry.dev.test"
docker build -t mytools .
docker tag mytools ${registry_domain}:5000/mytools:${version}
docker push ${registry_domain}:5000/mytools:${version}

Vous pouvez vérifier:

curl http://registry.dev.test:5000/v2/mytools/tags/list

Vous devriez obtenir: {"name":"mytools","tags":["0.0.0"]}

# Création d'un volume

Avec K3S vous avez par défaut ce que l'on appelle le "Local Path Provisioner" qui vous permet d'activer la possibilité de création de volume.

📘 Ref: https://rancher.com/docs/k3s/latest/en/storage/ (opens new window)

Pour créer notre premier volume, créez un fichier pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-path-pvc
  namespace: training
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 10Mi

Puis tapez la commande:

kubectl create -f pvc.yaml

✋ N'oubliez pas de préciser votre variable KUBECONFIG

# Création d'un pod pour utiliser le volume

Pour utiliser notre premier volume, créez un fichier pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: training
spec:
  containers:
  - name: volume-test
    image: registry.dev.test:5000/mytools:0.0.0
    imagePullPolicy: IfNotPresent
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: volv
      mountPath: /data
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: local-path-pvc

Puis tapez la commande:

kubectl create -f pod.yaml

Et enfin, la commande ci dessous pour accéder au shell de notre pod:

kubectl exec -n training -it volume-test -- /bin/bash

Une fois dans le pod:

echo "hello world" > /data/hello.txt

Pour "sortir", tapez exit.

Puis créez un 2ème pod grâce à un fichier pod.bis.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: volume-test-bis
  namespace: training
spec:
  containers:
  - name: volume-test-bis
    image: registry.dev.test:5000/mytools:0.0.0
    imagePullPolicy: IfNotPresent
    command:
      - sleep
      - "3600"
    volumeMounts:
    - name: volv
      mountPath: /data
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: local-path-pvc

Puis tapez les commandes:

kubectl create -f pod.bis.yaml
# une fois le pod créé
kubectl exec -n training -it volume-test-bis -- /bin/bash

Une fois dans le pod:

cat /data/hello.txt

Et vous obtiendrez un splendide hello world 🎉

Si vous redémarrez votre cluster, vous pourrez vérifiez que le fichier texte est encore présent. Il en sera de même si vous supprimez et recréez les 2 pods.

✋ ce volume n'est accessible qu'au sein du même namespace

Nous avons donc maintenant ce qu'il faut pour passer à la suite (une base Redis avec des sonnées persistantes)

Last Articles