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:k8s03 [2022/09/15 07:57] – admin | elearning:workbooks:kubernetes:k8s03 [2024/12/15 06:51] (Version actuelle) – admin | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
~~PDF: | ~~PDF: | ||
- | Version - **2020.02** | + | Version - **2024.01** |
Dernière mise-à-jour : ~~LASTMOD~~ | Dernière mise-à-jour : ~~LASTMOD~~ | ||
Ligne 37: | Ligne 37: | ||
* 5.1 - Présentation | * 5.1 - Présentation | ||
* 5.2 - Mise en Place | * 5.2 - Mise en Place | ||
+ | * LAB #6 - Conteneurs Init | ||
+ | * 6.1 - Présentation | ||
+ | * 6.2 - Mise en Place | ||
+ | * LAB #7 - Scheduling | ||
+ | * 7.1 - Présentation | ||
+ | * 7.2 - Mise en Place | ||
+ | * LAB #8 - DaemonSets | ||
+ | * 8.1 - Présentation | ||
+ | * 8.2 - Mise en Place | ||
+ | * LAB #9 - Pods Statiques | ||
+ | * 9.1 - Présentation | ||
+ | * 9.2 - Mise en Place | ||
+ | |||
+ | =====Ressources===== | ||
+ | |||
+ | ====Lab #1==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #2==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #3==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #4==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #5==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #6==== | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | ====Lab #7==== | ||
+ | |||
+ | * https:// | ||
+ | * https:// | ||
+ | |||
+ | ====Lab #8==== | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | ====Lab #9==== | ||
+ | |||
+ | * https:// | ||
Ligne 75: | Ligne 136: | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Notez que les données sont stockées dans des **Key-values**. La première donnée dans la section **data** est **key1: Hello, world!** tandis que la deuxième, **key2**, est en plusieures | + | **Important** : Notez que les données sont stockées dans des **Key-values**. La première donnée dans la section **data** est **key1: Hello, world!** tandis que la deuxième, **key2**, est en plusieurs |
</ | </ | ||
Ligne 143: | Ligne 204: | ||
</ | </ | ||
- | Copiez et collez les chaînes base64 dans le ficheir | + | Copiez et collez les chaînes base64 dans le fichier |
< | < | ||
Ligne 408: | Ligne 469: | ||
* **Liveness Probes**, | * **Liveness Probes**, | ||
* Par défaut K8s considère un conteneur HS uniquement quand le conteneur en question s' | * Par défaut K8s considère un conteneur HS uniquement quand le conteneur en question s' | ||
- | * Liveness probes permettent une configuration plus sophistiquée de mécanisme. | + | * Liveness probes permettent une configuration plus sophistiquée de ce mécanisme. |
* **Startup Probes**, | * **Startup Probes**, | ||
* Similaires aux Liveness Probes, les Startup Probes n' | * Similaires aux Liveness Probes, les Startup Probes n' | ||
Ligne 601: | Ligne 662: | ||
<WRAP center round important 60%> | <WRAP center round important 60%> | ||
- | **Important** : Notez que le pod est a un statut de running | + | **Important** : Notez que le pod est a un statut de Running |
</ | </ | ||
Ligne 791: | Ligne 852: | ||
====5.1 - Présentation==== | ====5.1 - Présentation==== | ||
- | Il est toujours préférable de ne mettre qu'un seul conteneur dans un pod. L' | + | Il est toujours préférable de ne mettre qu'un seul conteneur dans un pod. L' |
- | Cette intéraction | + | Cette interaction |
* le même espace réseau, | * le même espace réseau, | ||
Ligne 908: | Ligne 969: | ||
=====LAB #6 - Conteneurs Init==== | =====LAB #6 - Conteneurs Init==== | ||
- | < | + | ====6.1 - Présentation==== |
- | </code> | + | Un Conteneur Init est un conteneur qui ne s' |
- | < | + | * isoler, d'une manière sécurisée, |
+ | * injecter des données dans un volume partagé, | ||
+ | * faire patienter un pod en attendant que d' | ||
- | </ | + | ====6.2 - Mise en Place==== |
- | < | + | Commencez par créer le fichier **initpod.yaml** : |
+ | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: initpod | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: nginx | ||
+ | image: nginx: | ||
+ | initContainers: | ||
+ | - name: delay | ||
+ | image: busybox | ||
+ | command: [' | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Notez que le conteneur **delay** va faire patienter la création du conteneur **nginx** pendant 30 secondes. | ||
+ | </WRAP> | ||
- | </ | + | Créez le pod **initpod** : |
< | < | ||
+ | root@kubemaster: | ||
+ | pod/initpod created | ||
</ | </ | ||
- | < | + | Consultez l' |
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME READY | ||
+ | initpod | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Notez que le **STATUS** du pod est **Init: | ||
+ | </WRAP> | ||
- | </ | + | Patientez au moins 30 secondes puis exécutez la dernière commande de nouveau : |
< | < | ||
+ | root@kubemaster: | ||
+ | NAME READY | ||
+ | initpod | ||
</ | </ | ||
- | <code> | + | <WRAP center round important 60%> |
+ | **Important** : Notez que le **STATUS** du pod est **Running**. | ||
+ | </WRAP> | ||
- | </ | + | =====LAB #7 - Scheduling===== |
- | < | + | ====7.1 - Présentation==== |
- | </ | + | **Scheduling** est le processus d' |
- | < | + | Le Scheduler prend sa décision en fonction d'un un contrôle : |
- | </ | + | * des ressources disponibles sur les neouds en fonction des **Resource Resquests**, |
+ | * des configurations des **nodeSelectors** qui utilisent des **Node Labels**, | ||
+ | * des instructions de type **nodeName** qui forcent le choix d'un noeud par rapport à un autre. | ||
- | < | + | ====7.2 - Mise en Place==== |
- | </ | + | Commencez par visualiser les noeuds du cluster : |
< | < | ||
+ | root@kubemaster: | ||
+ | NAME STATUS | ||
+ | kubemaster.ittraining.loc | ||
+ | kubenode1.ittraining.loc | ||
+ | kubenode2.ittraining.loc | ||
</ | </ | ||
- | < | + | ===nodeSelector==== |
+ | Attribuez l' | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | node/ | ||
</ | </ | ||
+ | |||
+ | Créez maintenant le fichier **nodeselector.yaml** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: nodeselector | ||
+ | spec: | ||
+ | nodeSelector: | ||
+ | mylabel: " | ||
+ | containers: | ||
+ | - name: nginx | ||
+ | image: nginx: | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez l' | ||
+ | </ | ||
+ | |||
+ | Créez le pod **nodeselector** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | pod/ | ||
</ | </ | ||
+ | |||
+ | Constatez l' | ||
< | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | nodeselector | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le pod nodeselector a été schedulé sur le noeud **kubenode1**. | ||
+ | </ | ||
+ | |||
+ | ===nodeName=== | ||
+ | |||
+ | Créez maintenant le fichier **nodename.yaml** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: nodename | ||
+ | spec: | ||
+ | nodeName: kubenode2.ittraining.loc | ||
+ | containers: | ||
+ | - name: nginx | ||
+ | image: nginx: | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le pod va être schedulé sur **kubenode2.ittraining.loc** grâce à l' | ||
+ | </ | ||
+ | |||
+ | Créez le pod **nodename** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | pod/ | ||
+ | </ | ||
+ | Constatez l' | ||
+ | |||
+ | < | ||
+ | pod/ | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | nodename | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le pod a été schedulé sur **kubenode2.ittraining.loc** grâce à l' | ||
+ | </ | ||
+ | |||
+ | =====LAB #8 - DaemonSets===== | ||
+ | |||
+ | ====8.1 - Présentation==== | ||
+ | |||
+ | Un DaemonSet : | ||
+ | |||
+ | * crée une copie d'un pod sur tous les noeuds disponibles, | ||
+ | * crée une copie d'un pod sur tout nouveau noeud ajouté au cluster, | ||
+ | * respecte les contraintes de Node Labels. | ||
+ | |||
+ | ====8.2 - Mise en Place==== | ||
+ | |||
+ | Commencez par nettoyer le cluster : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | pod " | ||
+ | root@kubemaster: | ||
+ | deployment.apps " | ||
+ | deployment.apps " | ||
</ | </ | ||
+ | |||
+ | Créez ensuite le fichier **daemonset.yaml** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | root@kubemaster: | ||
+ | apiVersion: apps/v1 | ||
+ | kind: DaemonSet | ||
+ | metadata: | ||
+ | name: mydaemonset | ||
+ | spec: | ||
+ | selector: | ||
+ | matchLabels: | ||
+ | app: mydaemonset | ||
+ | template: | ||
+ | metadata: | ||
+ | labels: | ||
+ | app: mydaemonset | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: nginx | ||
+ | image: nginx: | ||
+ | </ | ||
+ | Créez le DaemonSet **mydaemonset** : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | daemonset.apps/ | ||
</ | </ | ||
+ | |||
+ | Constatez le statut du **DaemonSet** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | NAME DESIRED | ||
+ | mydaemonset | ||
+ | </ | ||
+ | Constatez maintenant qu'il a un pod sur chaque noeud : | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME READY | ||
+ | mydaemonset-hmdhp | ||
+ | mydaemonset-kmf4z | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez qu'il n'y ait pas de pod sur **kubemaster**. En effet, le kubemaster a le drapeau **no taint** fixé qui empêche la création de pods sur lui. | ||
+ | </ | ||
+ | |||
+ | =====LAB #9 - Pods Statiques===== | ||
+ | |||
+ | ====9.1 - Présentation==== | ||
+ | |||
+ | Un Static Pod (//Pod Statique//) est : | ||
+ | |||
+ | * un pod qui est contrôlé par le **kubelet** sur le noeud concerné au lieu d' | ||
+ | * ce type de pod peut être créé même s'il n y'ait pas de Control Plane, | ||
+ | * si le Control Plane existe, un **Mirror Pod** (//Pod Miroir//) est créé dans le Control Plane pour représenter le pod statique afin de faciliter la consultation son statut. Par contre, le pod ne peut ni être changé, ni être géré à partir du Control Plane, | ||
+ | * un pod créé en utilisant un fichier yaml situé dans un chemin **spécifique** sur le noeud concerné, | ||
+ | * pour un cluster installé avec **kubeadm**, | ||
+ | |||
+ | ====9.2 - Mise en Place==== | ||
+ | |||
+ | Connectez-vous à kubenode1 et devenez l' | ||
< | < | ||
+ | root@kubemaster: | ||
+ | trainee@192.168.56.3' | ||
+ | Linux kubenode1.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:01:18 2022 from 192.168.56.2 | ||
+ | trainee@kubenode1: | ||
+ | Mot de passe : fenestros | ||
+ | root@kubenode1: | ||
</ | </ | ||
- | < | + | Créez le fichier **/ |
+ | < | ||
+ | / | ||
</ | </ | ||
+ | |||
+ | Créez le pod **mystaticpod** : | ||
< | < | ||
+ | root@kubenode1: | ||
+ | root@kubenode1: | ||
+ | apiVersion: v1 | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: mystaticpod | ||
+ | spec: | ||
+ | containers: | ||
+ | - name: nginx | ||
+ | image: nginx: | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que kubelet va voir que le fichier a été créé et ensuite pouruivra avec la création du pod. | ||
+ | </ | ||
+ | |||
+ | Re-démarrez le service **kubelet** pour démarrer le pod statique **immédiatement** sans attendre : | ||
+ | |||
+ | < | ||
+ | root@kubenode1: | ||
</ | </ | ||
+ | |||
+ | Retournez au **kubemaster** et constatez la présence d'un pod miroir : | ||
< | < | ||
+ | root@kubenode1: | ||
+ | déconnexion | ||
+ | trainee@kubenode1: | ||
+ | déconnexion | ||
+ | Connection to 192.168.56.3 closed. | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | mydaemonset-hmdhp | ||
+ | mydaemonset-kmf4z | ||
+ | mystaticpod-kubenode1.ittraining.loc | ||
</ | </ | ||
+ | |||
+ | Supprimez maintenant le pod statique : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | pod " | ||
+ | </ | ||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que la suppression semble avoir réussi. | ||
+ | </ | ||
+ | |||
+ | Constatez les pods en cours d' | ||
+ | |||
+ | < | ||
+ | root@kubemaster: | ||
+ | NAME | ||
+ | mydaemonset-hmdhp | ||
+ | mydaemonset-kmf4z | ||
+ | mystaticpod-kubenode1.ittraining.loc | ||
</ | </ | ||
+ | |||
+ | <WRAP center round important 60%> | ||
+ | **Important** : Notez que le pod **mystaticpod-kubenode1.ittraining.loc** est revenu. En effet, la suppression précédente n'a supprimé que le miroir qui a ensuite ête regénéré. | ||
+ | </ | ||
+ | |||
+ | Pour supprimer le pod statique, connectez-vous à **kubenode1** : | ||
< | < | ||
+ | root@kubemaster: | ||
+ | trainee@kubenode1' | ||
+ | Linux kubenode1.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: Thu Sep 15 17:51:03 2022 from 192.168.56.2 | ||
+ | |||
+ | trainee@kubenode1: | ||
+ | Mot de passe : fenestros | ||
+ | |||
+ | root@kubenode1: | ||
+ | |||
+ | root@kubenode1: | ||
+ | |||
+ | root@kubenode1: | ||
+ | déconnexion | ||
+ | |||
+ | trainee@kubenode1: | ||
+ | déconnexion | ||
+ | Connection to kubenode1 closed. | ||
+ | root@kubemaster: | ||
</ | </ | ||
+ | ----- | ||
- | Copyright © 2022 Hugh Norris | + | Copyright © 2024 Hugh Norris |