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 | ||