Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
elearning:workbooks:kubernetes:k8s05 [2022/09/20 03:03] – admin | elearning:workbooks:kubernetes:k8s05 [2024/12/15 06:53] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ~~PDF: | ||
+ | |||
+ | Version - **2024.01** | ||
+ | |||
+ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
+ | |||
+ | |||
======DOF306 - Gestion des Volumes sous K8s====== | ======DOF306 - Gestion des Volumes sous K8s====== | ||
* **DOF306 - Gestion des Volumes sous K8s** | * **DOF306 - Gestion des Volumes sous K8s** | ||
+ | * Contenu | ||
+ | * Présentation | ||
+ | * Volumes | ||
+ | * Persistent Volumes | ||
+ | * Types de Volumes | ||
* LAB #1 - Utiliser des Volumes K8s | * LAB #1 - Utiliser des Volumes K8s | ||
- | * 1.1 - Présentation | + | * 1.1 - Volumes et volumeMounts |
- | * 1.2 - Volumes et volumeMounts | + | * 1.2 - Partager des volumes entre conteneurs |
- | * 1.3 - Partager des volumes entre conteneurs | + | |
- | * 1.4 - Types de Volumes | + | |
* LAB #2 - Volumes Persistants | * LAB #2 - Volumes Persistants | ||
- | * 2.1 - Présentation | + | * 2.1 - Storage Classes |
- | * 2.2 - Volumes | + | * 2.2 - Persistent |
- | * 2.3 - Classes | + | * 2.3 - Persistent Volume Claims |
- | * 2.4 - PersistantVolumeClaims | + | * 2.4 - Utiliser un PersistentVolumeClaim dans un pod |
- | * 2.5 - Utiliser | + | * 2.5 - Redimensionnement d'un PersistentVolumeClaim |
- | * 2.6 - Redimensionnement | + | |
+ | =====Ressources===== | ||
+ | |||
+ | ====Lab #1===== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #2==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | =====Présentation===== | ||
+ | |||
+ | ====Volumes==== | ||
+ | |||
+ | Le système de fichiers d'un conteneur | ||
+ | |||
+ | Les **volumes** permettent le stockage de données en dehors du système de fichiers du conteneur tout en permettant le conteneur d'y accéder. | ||
+ | |||
+ | ====Persistent Volumes==== | ||
+ | |||
+ | Un **Persistent Volume** (//Volume Persistant// | ||
+ | |||
+ | ====Types de Volumes==== | ||
+ | |||
+ | Les Volumes et les Persistent Volumes ont un **Volume Type** (//Type de Volume//). Le Volume Type détermine le **Storage Method** (//Méthode de Stockage//) des données. Parmi les Storage Methods on trouve : | ||
+ | |||
+ | * NFS, | ||
+ | * AWS, | ||
+ | * Azure, | ||
+ | * GCP, | ||
+ | * ConfigMaps, | ||
+ | * Secrets, | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Pour plus d' | ||
+ | </ | ||
=====LAB #1 - Utiliser des Volumes K8s===== | =====LAB #1 - Utiliser des Volumes K8s===== | ||
- | < | + | ====1.1 - Volumes et volumeMounts==== |
- | </ | + | Les Volumes sont configurés dans la spécification du **pod** et non le conteneur. Les deux Volume Types les plus important sont **hostPath** et **emptyDir** : |
- | < | + | * **hostPath**, |
+ | * Les données sont stockés localement dans un répertoire statique du noeud K8s, | ||
+ | * **emptyDir**, | ||
+ | * Les données sont stockés localement dans un répertoire dynamique, | ||
+ | * Le répertoire n' | ||
+ | * K8s supprime le répertoire et les données lors de la suppression ou le déplacement du pod, | ||
+ | * Ce Volume Type est principalement utilisé pour partager des données entre deux conteneurs dans un pod. | ||
- | </ | + | Un **volumeMount** est configuré dans la spécification du **conteneur** et non le pod |
+ | |||
+ | Commencez par créer le fichier **volume.yaml** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: volumepod | ||
+ | spec: | ||
+ | restartPolicy: | ||
+ | containers: | ||
+ | - name: busybox | ||
+ | image: busybox | ||
+ | command: [' | ||
+ | volumeMounts: | ||
+ | - name: myvolume | ||
+ | mountPath: /output | ||
+ | volumes: | ||
+ | - name: myvolume | ||
+ | hostPath: | ||
+ | path: /var/data | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Ce pod va écrire la chaîne **Success!** dans le fichier **/ | ||
+ | </WRAP> | ||
- | </ | + | Créez le pod **volumepod** : |
< | < | ||
+ | root@kubemaster: | ||
+ | pod/ | ||
</ | </ | ||
- | < | + | Identifiez le noeud sur lequel s' |
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME READY | ||
+ | volumepod | ||
</ | </ | ||
+ | |||
+ | Connectez-vous au nœud identifié : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | trainee@kubenode2' | ||
+ | Linux kubenode2.ittraining.loc 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64 | ||
+ | The programs included with the Debian GNU/Linux system are free software; | ||
+ | the exact distribution terms for each program are described in the | ||
+ | individual files in / | ||
+ | |||
+ | Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent | ||
+ | permitted by applicable law. | ||
+ | Last login: Sun Sep 4 13:24:39 2022 from 192.168.56.2 | ||
</ | </ | ||
- | < | + | Vérifiez la présence et le contenu du fichier **/ |
+ | < | ||
+ | trainee@kubenode2: | ||
+ | Success! | ||
</ | </ | ||
- | < | + | ====1.2 - Partager des volumes entre conteneurs==== |
- | </ | + | Retournez au **kubemaster** : |
< | < | ||
+ | trainee@kubenode2: | ||
+ | déconnexion | ||
+ | Connection to kubenode2 closed. | ||
+ | root@kubemaster: | ||
</ | </ | ||
+ | |||
+ | Créez maintenant le fichier **shared.yaml** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: sharedvolume | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: busybox1 | ||
+ | image: busybox | ||
+ | command: [' | ||
+ | volumeMounts: | ||
+ | - name: myvolume | ||
+ | mountPath: /output | ||
+ | - name: busybox2 | ||
+ | image: busybox | ||
+ | command: [' | ||
+ | volumeMounts: | ||
+ | - name: myvolume | ||
+ | mountPath: /input | ||
+ | volumes: | ||
+ | - name: myvolume | ||
+ | emptyDir: {} | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Ce fichier va créer deux pods. Le premier, **busybox1**, | ||
+ | </WRAP> | ||
- | </ | + | Créez les deux pods : |
< | < | ||
+ | root@kubemaster: | ||
+ | pod/ | ||
</ | </ | ||
+ | |||
+ | Vérifiez que les deux pods sont en cours d' | ||
< | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | sharedvolume | ||
</ | </ | ||
- | < | + | Consultez maintenant les logs du deuxième conteneur : |
+ | < | ||
+ | root@kubemaster: | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
+ | Success! | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Notez que busybox2 a imprimé le contenu du fichier **/ | ||
+ | </WRAP> | ||
+ | =====LAB #2 - Persistent Volumes===== | ||
+ | |||
+ | ====2.1 - Storage Classes==== | ||
+ | |||
+ | * **StorageClassName**, | ||
+ | * Un StorageClassName est utilisé pour spécifier le **StorageClass**. | ||
+ | * **StorageClass**, | ||
+ | * Un StorageClass est utilisé pour spécifier le type de service de stockage utilisé, par exemple, un disque local, le cloud etc, | ||
+ | * Si la valeur du **allowVolumeExpansion** est true et le type de service de stockage le permet, un **PersistentVolumeClaim** peut être redimensionner à chaud. | ||
+ | |||
+ | Créez le fichier **localdisk.yaml** pour définir le **StorageClass** appelé **localdisk** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: storage.k8s.io/ | ||
+ | kind: StorageClass | ||
+ | metadata: | ||
+ | name: localdisk | ||
+ | provisioner: | ||
+ | allowVolumeExpansion: | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du allowVolumeExpansion est true. | ||
+ | </ | ||
+ | |||
+ | Créez le StorageClass **localdisk** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | </ | ||
+ | ====2.2 - Persistent Volumes==== | ||
+ | |||
+ | Créez le fichier **mypv.yaml** pour définir le **PersistentVolume** appelé **mypv** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | kind: PersistentVolume | ||
+ | apiVersion: v1 | ||
+ | metadata: | ||
+ | name: mypv | ||
+ | spec: | ||
+ | storageClassName: | ||
+ | persistentVolumeReclaimPolicy: | ||
+ | capacity: | ||
+ | storage: 1Gi | ||
+ | accessModes: | ||
+ | - ReadWriteOnce | ||
+ | hostPath: | ||
+ | path: /var/output | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur de l' | ||
+ | </ | ||
+ | |||
+ | Il existe quatre types d' | ||
+ | |||
+ | * **ReadWriteOnce** ou **RWO**, | ||
+ | * le volume ne peut être monté que par un seul noeud, | ||
+ | * **ReadOnlyMany** ou **ROX**, | ||
+ | * le volume peut être monté en lecture seule par plusieurs noeuds, | ||
+ | * **ReadWriteMany** ou **RWX**, | ||
+ | * le volume peut être monté en lecture-écriture par plusieurs noeuds, | ||
+ | * **ReadWriteOncePod** ou **RWOP**, | ||
+ | * le volume ne peut être monté que par un seul pod. | ||
+ | |||
+ | La disponibilité de l' | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du persistentVolumeReclaimPolicy est Recycle. | ||
+ | </ | ||
+ | |||
+ | Il existe trois types de PersistentVolumeReclaimPolicy : | ||
+ | |||
+ | * **Retain**, | ||
+ | * Les données ne sont pas supprimées lors de la suppression d'un PersistentVolumeClaim, | ||
+ | * **Delete**, | ||
+ | * Supprime automatiquement la **ressource de stockage** lors de la suppression d'un PersistentVolumeClaim, | ||
+ | * A noter que **Delete** ne fonctionne qu' | ||
+ | * **Recycle**, | ||
+ | * Supprime automatiquement les données, | ||
+ | * A noter que **Recycle** permet la réutilisation immédiate des ressources de stockage libérées lors de la suppression d'un PersistentVolumeClaim. | ||
+ | |||
+ | Créez le PersistentVolume **mypv** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | persistentvolume/ | ||
+ | </ | ||
+ | Vérifiez le statut du PersistentVolume : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | mypv | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du STATUS est Available. | ||
+ | </ | ||
+ | |||
+ | ====2.3 - Persistent Volume Claims==== | ||
+ | |||
+ | * Un PersistentVolumeClaim représente la demande d'un utilisateur d'une ressource de stockage, | ||
+ | * Le PersistentVolumeClaim spécifie un **StorageClassName**, | ||
+ | * Lors sa création, le PersistentVolumeClaim recherche un **PersistentVolume** capable de satisfaire la demande formulée, | ||
+ | * Si le résultat de la recherche est positive, le PersistentVolumeClaim est automatiquement lié au PersistentVolume, | ||
+ | * Dans le cas contraire, le PersistentVolumeClaim **reste en attente** jusqu' | ||
+ | * Pour redimensionner, | ||
+ | |||
+ | Créez le fichier **mypvc.yaml** pour définir le **PersistentVolumeClaim** appelé **my-pvc** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: PersistentVolumeClaim | ||
+ | metadata: | ||
+ | name: my-pvc | ||
+ | spec: | ||
+ | storageClassName: | ||
+ | accessModes: | ||
+ | - ReadWriteOnce | ||
+ | resources: | ||
+ | requests: | ||
+ | storage: 100Mi | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du storageClassName est localdisk. | ||
+ | </ | ||
+ | |||
+ | Créez le PersistentVolumeClaim **my-pvc** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | persistentvolumeclaim/ | ||
</ | </ | ||
+ | |||
+ | Vérifiez le statut du PersistentVolume : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | mypv | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du STATUS est Bound. Notez aussi qu'un PersistentVolume ne peut être associé qu'à un seul PersistentVolumeClaim à la fois. | ||
+ | </ | ||
+ | |||
+ | Vérifiez le statut du PersistentVolumeClaim : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | my-pvc | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du STATUS est Bound. | ||
+ | </ | ||
+ | |||
+ | ====2.4 - Utiliser un PersistentVolumeClaim dans un pod==== | ||
+ | |||
+ | Créez le fichier **mypvcpod.yaml** pour définir le **pod** appelé **pv-pod** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: pv-pod | ||
+ | spec: | ||
+ | restartPolicy: | ||
+ | containers: | ||
+ | - name: busybox | ||
+ | image: busybox | ||
+ | command: [' | ||
+ | volumeMounts: | ||
+ | - name: pv-storage | ||
+ | mountPath: /output | ||
+ | volumes: | ||
+ | - name: pv-storage | ||
+ | persistentVolumeClaim: | ||
+ | claimName: my-pvc | ||
+ | </ | ||
+ | Créez le pod **pv-pod** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | pod/pv-pod created | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le pod utilise le persistentVolumeClaim my-pvc qui est monté sur /output dans le conteneur busybox. | ||
+ | </ | ||
+ | |||
+ | ====2.5 - Redimensionnement d'un PersistentVolumeClaim==== | ||
+ | |||
+ | Modifiez la valeur du **storage: | ||
< | < | ||
+ | root@kubemaster: | ||
+ | ... | ||
+ | spec: | ||
+ | accessModes: | ||
+ | - ReadWriteOnce | ||
+ | resources: | ||
+ | requests: | ||
+ | storage: 200Mi | ||
+ | storageClassName: | ||
+ | volumeMode: Filesystem | ||
+ | volumeName: mypv | ||
+ | ... | ||
+ | </ | ||
+ | Sauvegardez la modification : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | Flag --record has been deprecated, --record will be removed in the future | ||
+ | persistentvolumeclaim/ | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le message de confirmation de l' | ||
+ | </ | ||
+ | |||
+ | Supprimez le pod **pv-pod** ainsi que le PersistentVolumeClaim **my-pvc** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | pod " | ||
+ | root@kubemaster: | ||
+ | persistentvolumeclaim " | ||
</ | </ | ||
- | < | + | Vérifiez le statut du PersistentVolume : |
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | mypv | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la valeur du STATUS est de nouveau Available. | ||
+ | </ | ||
+ | |||
+ | ---- | ||
+ | Copyright © 2024 Hugh Norris |