Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
elearning:workbooks:kubernetes:k8s03 [2022/09/11 13:46] adminelearning:workbooks:kubernetes:k8s03 [2024/12/15 06:51] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version - **2020.01**+Version - **2024.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
Ligne 12: Ligne 12:
     * Contenu du Module     * Contenu du Module
     * LAB #1 - Application Configuration     * LAB #1 - Application Configuration
-      * 1.1 - Création d'une ConfigMap +      * 1.1 - Présentation 
-      * 1.- Création d'un Secret +      * 1.2 - Création d'une ConfigMap 
-      * 1.- Utilisation de ConfigMaps et de Secrets+      * 1.- Création d'un Secret 
 +      * 1.- Utilisation de ConfigMaps et de Secrets
         * Utilisation de Variables d'environnement         * Utilisation de Variables d'environnement
         * Utilisation de Volumes de Configuration         * Utilisation de Volumes de Configuration
     * LAB #2 - Gestion des Ressources des Conteneurs     * LAB #2 - Gestion des Ressources des Conteneurs
-      * 2.1 - Resource Requests +      * 2.1 - Présentation 
-      * 2.- Resource Limits+      * 2.2 - Resource Requests 
 +      * 2.- Resource Limits
     * LAB #3 - Supervision des Conteneurs     * LAB #3 - Supervision des Conteneurs
-      * 3.1 - Liveness Probes+      * 3.1 - Présentation 
 +      * 3.2 - Liveness Probes
         * Le Probe exec         * Le Probe exec
         * Le Probe httpGet         * Le Probe httpGet
-      * 3.- Startup Probes +      * 3.- Startup Probes 
-      * 3.- Readiness Probes+      * 3.- Readiness Probes
     * LAB #4 - Gestion des Politiques de Redémarrage     * LAB #4 - Gestion des Politiques de Redémarrage
 +      * 4.1 - Présentation
 +      * 4.2 - Always
 +      * 4.3 - OnFailure
 +      * 4.4 - Never
 +    * LAB #5 - Création de Pods Multi-conteneurs
 +      * 5.1 - Présentation
 +      * 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://www.dropbox.com/scl/fi/7hkyea9v3lc949b9ar5hl/myconfigmap.yaml?rlkey=kv5x17lirugxppbyzgk0yhbhh&dl=0
 +  * https://www.dropbox.com/scl/fi/o752fqb1gc5shocih9zc7/mysecret.yaml?rlkey=mfof15llfnanksi0ztmzdy7tp&dl=0
 +  * https://www.dropbox.com/scl/fi/70g1jb7p4ighdbkk33mre/envpod.yaml?rlkey=31muxz3g7a7k91nd98bjxhkjz&dl=0
 +  * https://www.dropbox.com/scl/fi/td43bvv8aphqqbwc59j4l/volumepod.yaml?rlkey=sti941svagvli2qbi6jkljaoy&dl=0
 +
 +====Lab #2====
 +
 +  * https://www.dropbox.com/scl/fi/n1147jb572h0dnadwjamm/bigrequestpod.yaml?rlkey=08fpyndzpg720or0h6zkm9vxz&dl=0
 +  * https://www.dropbox.com/scl/fi/3lo335z508wo4sutr8zwk/resourcepod.yaml?rlkey=ezycaxxvyf74u7xdtawhnssje&dl=0
 +
 +====Lab #3====
 +
 +  * https://www.dropbox.com/scl/fi/9igcin5jo18z1bpjjx9vx/livenesspod.yaml?rlkey=23f17olf3jo8l12h972noijve&dl=0
 +  * https://www.dropbox.com/scl/fi/tqno3tjsif093kpxo0jrg/livenesspodhttp.yaml?rlkey=lsn5q2d9goe619jnkpz3p6ok2&dl=0
 +  * https://www.dropbox.com/scl/fi/s4pst2ezp0qpylu6m8frx/startuppod.yaml?rlkey=xbaenkztscopqzuq8u4dxxcx8&dl=0
 +  * https://www.dropbox.com/scl/fi/a0hdk8shspxsi23hkf7vi/readinesspod.yaml?rlkey=w230asyme4ywxitfzgzy4ehsw&dl=0
 +
 +====Lab #4====
 +
 +  * https://www.dropbox.com/scl/fi/y8bu7cryzv5wfkln2r6wc/alwayspod.yaml?rlkey=n5rmuhmy4o1gojvez1yz3w1ys&dl=0
 +  * https://www.dropbox.com/scl/fi/m6wy0x16vdsd87vuriyl9/onfailure.yaml?rlkey=ox8nfznllrjui1mal4idtzx3u&dl=0
 +  * https://www.dropbox.com/scl/fi/7oyo26ackzdxjm78ipjvg/never.yaml?rlkey=hqf5f07kvmiuhdehyjc9r6mni&dl=0
 +
 +====Lab #5====
 +
 +  * https://www.dropbox.com/scl/fi/4j0nnzgt8ammsfzpqm3ul/multicontainerpod.yaml?rlkey=n08saexw65stxvy4twd9x2npr&dl=0
 +  * https://www.dropbox.com/scl/fi/x8fy28yiiyq7rrb5x7gse/helper.yaml?rlkey=9hhvly431j39x2vmfeopk9tk1&dl=0
 +
 +====Lab #6====
 +
 +  * https://www.dropbox.com/scl/fi/llvkk1jija3pk227u6w8v/initpod.yaml?rlkey=krtkq8qhc8dalr84jw0p4jwdh&dl=0
 +
 +====Lab #7====
 +
 +  * https://www.dropbox.com/scl/fi/qdnl21iip9shwjqc93rpy/nodeselector.yaml?rlkey=x5eumxvmgkeh9vctrwd9rmuwi&dl=0
 +  * https://www.dropbox.com/scl/fi/46npmxik2heh8z3wiw6ah/nodename.yaml?rlkey=blck3kzwgqzm21ttsjxph965k&dl=0
 +
 +====Lab #8====
 +
 +  * https://www.dropbox.com/scl/fi/fqxcxm7ia69ne9keruqg2/daemonset.yaml?rlkey=r7hn65en4beq3zvza5jxfysd5&dl=0
 +
 +====Lab #9====
 +
 +  * https://www.dropbox.com/scl/fi/pwvwbsant7onw0hwikmp4/mystaticpod.yaml?rlkey=l6jzgtgcss3atx9emqk3h7qz6&dl=0
  
  
 =====LAB #1 - Application Configuration===== =====LAB #1 - Application Configuration=====
 +
 +====1.1 - Présentation====
  
 La gestion de la configuration d'application ou //Application Configuration// est le processus de passage de valeurs dynamiques aux applications au moment du runtime. La gestion de la configuration d'application ou //Application Configuration// est le processus de passage de valeurs dynamiques aux applications au moment du runtime.
Ligne 43: Ligne 116:
   * Volumes de configuration.   * Volumes de configuration.
  
-====1.- Création d'une ConfigMap====+====1.- Création d'une ConfigMap====
  
 Pour commencer, créez le fichier **myconfigmap.yaml** : Pour commencer, créez le fichier **myconfigmap.yaml** :
Ligne 63: 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 lignes.+**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 lignes.
 </WRAP> </WRAP>
  
Ligne 100: Ligne 173:
 </code> </code>
  
-====1.- Création d'un Secret====+====1.- Création d'un Secret====
  
 Créez maintenant le fichier **mysecret.yaml** : Créez maintenant le fichier **mysecret.yaml** :
Ligne 131: Ligne 204:
 </code> </code>
  
-Copiez et collez les chaînes base64 dans le ficheir mysecret.yaml :+Copiez et collez les chaînes base64 dans le fichier mysecret.yaml :
  
 <code> <code>
Ligne 157: Ligne 230:
 </code> </code>
  
-====1.- Utilisation de ConfigMaps et de Secret====+====1.- Utilisation de ConfigMaps et de Secret====
  
 ===Utilisation des Variables d'environnement=== ===Utilisation des Variables d'environnement===
Ligne 284: Ligne 357:
  
 =====LAB #2 - Gestion des Ressources des Conteneurs===== =====LAB #2 - Gestion des Ressources des Conteneurs=====
 +
 +====2.1 - Présentation====
  
 Deux aspects importants de la gestion des ressources des conteneurs sont : Deux aspects importants de la gestion des ressources des conteneurs sont :
Ligne 294: Ligne 369:
 Pour les deux types, les demandes et les limites de la mémoire sont généralement exprimées en **Mi**, tandis que les les demandes et les limites du CPU sont exprimées en 1/1000 d'un processeur. Par exemple le chiffre 250m représente 250/1000 d'un CPU ou 1/4. Pour les deux types, les demandes et les limites de la mémoire sont généralement exprimées en **Mi**, tandis que les les demandes et les limites du CPU sont exprimées en 1/1000 d'un processeur. Par exemple le chiffre 250m représente 250/1000 d'un CPU ou 1/4.
  
-====2.- Resource Requests====+====2.- Resource Requests====
  
 Créez le fichier **bigrequestpod.yaml** : Créez le fichier **bigrequestpod.yaml** :
Ligne 335: Ligne 410:
 </WRAP> </WRAP>
  
-====2.- Resource Limits====+====2.- Resource Limits====
  
 Créez le fichier **resourcepod.yaml** : Créez le fichier **resourcepod.yaml** :
Ligne 385: Ligne 460:
  
 =====LAB #3 - Supervision des Conteneurs===== =====LAB #3 - Supervision des Conteneurs=====
 +
 +====3.1 - Présentation===
  
 La supervision des conteneurs concerne la surveillance de la santé des conteneurs afin d'assurer des applications et des solutions robustes en redémarrant des conteneurs cassés. Pour accomplir cette tâche, K8s utilise des sondes ou //probes// en anglais.  La supervision des conteneurs concerne la surveillance de la santé des conteneurs afin d'assurer des applications et des solutions robustes en redémarrant des conteneurs cassés. Pour accomplir cette tâche, K8s utilise des sondes ou //probes// en anglais. 
Ligne 392: Ligne 469:
   * **Liveness Probes**,   * **Liveness Probes**,
     * Par défaut K8s considère un conteneur HS uniquement quand le conteneur en question s'arrête,     * Par défaut K8s considère un conteneur HS uniquement quand le conteneur en question s'arrête,
-    * 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'interviennent uniquement au démarrage du conteneur et s'arrêtent quand l'application a démarré.     * Similaires aux Liveness Probes, les Startup Probes n'interviennent uniquement au démarrage du conteneur et s'arrêtent quand l'application a démarré.
Ligne 398: Ligne 475:
     * Similaires aux Startup Probes car ils n'interviennet qu'au démarrage du pod, les Readiness Probes sont responsables du blocage du trafic vers les pods tant que tous les conteneurs du pod n'ont pas réussi les Readiness Probes.     * Similaires aux Startup Probes car ils n'interviennet qu'au démarrage du pod, les Readiness Probes sont responsables du blocage du trafic vers les pods tant que tous les conteneurs du pod n'ont pas réussi les Readiness Probes.
  
-====3.- Liveness Probes====+====3.- Liveness Probes====
  
 ===Le Probe exec=== ===Le Probe exec===
Ligne 492: Ligne 569:
 </WRAP> </WRAP>
  
-====3.- Startup Probes====+====3.- Startup Probes====
  
 Créez le fichier **startuppod.yaml** :  Créez le fichier **startuppod.yaml** : 
Ligne 538: Ligne 615:
 </WRAP> </WRAP>
  
-====3.- Readiness Probes====+====3.- Readiness Probes====
  
 Créez le fichier **readinesspod.yaml** :  Créez le fichier **readinesspod.yaml** : 
Ligne 585: Ligne 662:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** : Notez que le pod est a un statut de running 4 secondes après son démarrage. Par contre, le pod ne passe qu'en READY au bout de 13 secondes quand le Readiness Probe a réussi.+**Important** : Notez que le pod est a un statut de Running 4 secondes après son démarrage. Par contre, le pod ne passe qu'en READY au bout de 13 secondes quand le Readiness Probe a réussi.
 </WRAP> </WRAP>
  
 =====LAB #4 - Gestion des Politiques de Redémarrage===== =====LAB #4 - Gestion des Politiques de Redémarrage=====
  
 +====4.1 - Présentation====
  
 +K8s peut redémarrer des conteneurs en cas de problèmes. Il y a trois politiques de redémarrage :
  
 +  * **Always**,
 +    * Always est la politique par défaut,
 +    * Always redémarre **toujours** un conteneur quelque soit le code retour quand le conteneur est arrêté.
 +  * **OnFailure**,
 +    * OnFailure ne redémarre un conteneur que dans ls cas où celui-ci sort avec un code retour autre que 0 ou dans le cas où un Liveness Probe a rapporté la mauvaise santé du conteneur. Dans le cas contraire, où le conteneur a terminé sa tâche et sort avec un code retour de 0, la politique ne le redémarre pas.
 +  * **Never**,
 +    * Never est l'opposé de Always. Le conteneur n'est jamais redémarré en cas d'arrêt, quelque soit la cause de cette dernière.
  
 +====4.2 - Always====
  
 +Créez le fichier **alwayspod.yaml** :
  
 +<code>
 +root@kubemaster:~# vi alwayspod.yaml
 +root@kubemaster:~# cat alwayspod.yaml
 +apiVersion: v1
 +kind: Pod
 +metadata:
 +  name: alwayspod
 +spec:
 +  restartPolicy: Always
 +  containers:
 +  - name: busybox
 +    image: busybox
 +    command: ['sh', '-c', 'sleep 10']
 +</code>
  
 +Créez le pod et consultez son statut :
  
 +<code>
 +root@kubemaster:~# kubectl create -f alwayspod.yaml;kubectl get pod alwayspod;sleep 9;kubectl get pod alwayspod;sleep 9;kubectl get pod alwayspod;sleep 9;kubectl get pod alwayspod
 +pod/alwayspod created
 +NAME        READY   STATUS              RESTARTS   AGE
 +alwayspod   0/    ContainerCreating            0s
 +NAME        READY   STATUS    RESTARTS   AGE
 +alwayspod   1/    Running            9s
 +NAME        READY   STATUS    RESTARTS     AGE
 +alwayspod   1/    Running   1 (6s ago)   19s
 +NAME        READY   STATUS      RESTARTS      AGE
 +alwayspod   0/    Completed   1 (15s ago)   28s
 +</code>
  
 +<WRAP center round important 60%>
 +**Important** : Notez que le pod a été redémarré.
 +</WRAP>
  
 +====4.3 - OnFailure====
  
 +Créez le fichier **onfailure.yaml** :
  
 +<code>
 +root@kubemaster:~# vi onfailure.yaml
 +root@kubemaster:~# cat onfailure.yaml
 +apiVersion: v1
 +kind: Pod
 +metadata:
 +  name: onfailure
 +spec:
 +  restartPolicy: OnFailure
 +  containers:
 +  - name: busybox
 +    image: busybox
 +    command: ['sh', '-c', 'sleep 10']
 +</code>
  
 +Créez le pod et consultez son statut :
  
 +<code>
 +root@kubemaster:~# kubectl create -f onfailure.yaml;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure
 +pod/onfailure created
 +NAME        READY   STATUS    RESTARTS   AGE
 +onfailure   0/    Pending            0s
 +NAME        READY   STATUS    RESTARTS   AGE
 +onfailure   1/    Running            9s
 +NAME        READY   STATUS      RESTARTS   AGE
 +onfailure   0/    Completed            19s
 +NAME        READY   STATUS      RESTARTS   AGE
 +onfailure   0/    Completed            28s
 +NAME        READY   STATUS      RESTARTS   AGE
 +onfailure   0/    Completed            37s
 +NAME        READY   STATUS      RESTARTS   AGE
 +onfailure   0/    Completed            46s
 +</code>
  
 +<WRAP center round important 60%>
 +**Important** : Notez que le pod n'a pas été redémarré.
 +</WRAP>
  
 +Supprimez maintenant le pod onfailure :
  
 +<code>
 +root@kubemaster:~# kubectl delete pod onfailure
 +pod "onfailure" deleted
 +</code>
  
 +Modifiez ensuite le fichier **onfailure.yaml** en ajoutant la chaîne **this is a bad command** :
  
 +<code>
 +root@kubemaster:~# vi onfailure.yaml
 +root@kubemaster:~# cat onfailure.yaml
 +apiVersion: v1
 +kind: Pod
 +metadata:
 +  name: onfailure
 +spec:
 +  restartPolicy: OnFailure
 +  containers:
 +  - name: busybox
 +    image: busybox
 +    command: ['sh', '-c', 'sleep 10;this is a bad command']
 +</code>
  
 +Créez le pod et consultez son statut :
  
 +<code>
 +root@kubemaster:~# kubectl create -f onfailure.yaml;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure;sleep 9;kubectl get pod onfailure
 +pod/onfailure created
 +NAME        READY   STATUS    RESTARTS   AGE
 +onfailure   0/    Pending            0s
 +NAME        READY   STATUS    RESTARTS   AGE
 +onfailure   1/    Running            9s
 +NAME        READY   STATUS    RESTARTS     AGE
 +onfailure   1/    Running   1 (5s ago)   18s
 +NAME        READY   STATUS   RESTARTS      AGE
 +onfailure   0/    Error    1 (14s ago)   27s
 +NAME        READY   STATUS   RESTARTS      AGE
 +onfailure   0/    Error    1 (23s ago)   36s
 +NAME        READY   STATUS    RESTARTS      AGE
 +onfailure   1/    Running   2 (21s ago)   46s
 +</code>
  
 +<WRAP center round important 60%>
 +**Important** : Notez que le pod a été redémarré à cause de l'erreur.
 +</WRAP>
  
 +====4.4 - Never====
  
 +Créez le fichier **never.yaml** :
  
 +<code>
 +root@kubemaster:~# vi never.yaml
 +root@kubemaster:~# cat never.yaml
 +apiVersion: v1
 +kind: Pod
 +metadata:
 +  name: never
 +spec:
 +  restartPolicy: Never
 +  containers:
 +  - name: busybox
 +    image: busybox
 +    command: ['sh', '-c', 'sleep 10;this is a bad command']
 +</code>
  
 +Créez le pod et consultez son statut :
  
 +<code>
 +root@kubemaster:~# kubectl create -f never.yaml;kubectl get pod never;sleep 9;kubectl get pod never;sleep 9;kubectl get pod never;sleep 9;kubectl get pod never;sleep 9;kubectl get pod never;sleep 9;kubectl get pod never
 +pod/never created
 +NAME    READY   STATUS              RESTARTS   AGE
 +never   0/    ContainerCreating            0s
 +NAME    READY   STATUS    RESTARTS   AGE
 +never   1/    Running            9s
 +NAME    READY   STATUS   RESTARTS   AGE
 +never   0/    Error    0          18s
 +NAME    READY   STATUS   RESTARTS   AGE
 +never   0/    Error    0          27s
 +NAME    READY   STATUS   RESTARTS   AGE
 +never   0/    Error    0          36s
 +NAME    READY   STATUS   RESTARTS   AGE
 +never   0/    Error    0          45s
 +</code>
  
 +<WRAP center round important 60%>
 +**Important** : Notez que le pod n'a pas été redémarré.
 +</WRAP>
  
 +=====LAB #5 - Création de Pods Multi-conteneurs=====
  
 +====5.1 - Présentation====
  
 +Il est toujours préférable de ne mettre qu'un seul conteneur dans un pod. L'exception à cette règle est quand deux ou plus de pods ont besoin d’interagir afin de remplir leur rôles respectifs. Le autres conteneur s'appellent des **sidecars** (//side-cars// en français) ou des **helpers** (//assistants// en français). L’interaction s'appelle **Cross-Container Interaction**.
  
 +Cette interaction prend la forme de partager :
  
 +  * le même espace réseau,
 +    * les conteneurs peuvent se communiquer sur tous les ports, même si les ports ne sont pas exposés au cluster,
 +  * le même espace de stockage,
 +    * les conteneurs peuvent partager les mêmes volumes.
 +  
 +====5.2 - Mise en Place====
  
 +Commencez par créer le fichier **multicontainerpod.yaml** :
  
 +<code>
 +root@kubemaster:~# vi multicontainerpod.yaml
 +root@kubemaster:~# cat multicontainerpod.yaml
 +apiVersion: v1
 +kind: Pod
 +metadata:
 +  name: multicontainerpod
 +spec:
 +  containers:
 +  - name: nginx
 +    image: nginx
 +  - name: redis
 +    image: redis
 +  - name: couchbase
 +    image: couchbase
 +</code>
  
----- +<WRAP center round important 60%> 
-Copyright © 2022 Hugh Norris+**Important** : Notez que le fichier créera trois conteneurs **nginx**, **redis** et **couchbase**. 
 +</WRAP> 
 + 
 +Créez ensuite le pod : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f multicontainerpod.yaml 
 +pod/multicontainerpod created 
 +</code> 
 + 
 +Consultez l'état du pod : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pod multicontainerpod 
 +NAME                READY   STATUS              RESTARTS   AGE 
 +multicontainerpod   0/    ContainerCreating            65s 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez qu'il y a actuellement 0 de 3 pods dans un état de READY. 
 +</WRAP> 
 + 
 +Attendez quelques minutes et constatez de nouveau l'état du pod : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pod multicontainerpod  
 +NAME                READY   STATUS    RESTARTS   AGE 
 +multicontainerpod   3/    Running            16m 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez qu'il y a actuellement 3 de 3 pods dans un état de READY. 
 +</WRAP> 
 + 
 +Créez maintenant le fichier **helper.yaml** : 
 + 
 +<code> 
 +root@kubemaster:~# vi helper.yaml 
 +root@kubemaster:~# cat helper.yaml 
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  name: helperpod 
 +spec: 
 +  containers: 
 +  name: busybox1 
 +    image: busybox 
 +    command: ['sh', '-c', 'while true; do echo logs data > /output/output.log; sleep 5; done'
 +    volumeMounts: 
 +      - name: sharedvol 
 +        mountPath: /output 
 +  - name: helper 
 +    image: busybox 
 +    command: ['sh', '-c', 'tail -f /input/output.log'
 +    volumeMounts: 
 +      - name: sharedvol 
 +        mountPath: /input 
 +  volumes: 
 +  - name: sharedvol 
 +    emptyDir: {} 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que ce fichier créera un pod contenant deux conteneurs - **busybox1** et **helper**. Chaque conteneur partage un volume identique qui s'appelle **sharedvol**. Dans le conteneur ***busybox1** ce volume est monté sur **/output** tandis que dans le conteneur **helper**, le même volume est monté sur **/input**.  
 +</WRAP> 
 + 
 +Créez le pod **helper** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f helper.yaml  
 +pod/helperpod created 
 +</code> 
 + 
 +Consultez les logs du conteneur **helper** dans le pod **helperpod** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl logs helperpod -c helper 
 +logs data 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que le conteneur **busybox1** a écrit la chaîne **logs data** dans le fichier **/output/output.log** tous les 5 secondes grâce à l'exécution de la commande **while true; do echo logs data > /output/output.log; sleep 5; done**. Le conteneur **helper** exécute la commande **tail -f /input/output.log**. Le log du conteneur **helper** contient donc la chaîne **logs data** issu du fichier **output.log** car ce fichier est partagé entre les deux conteneurs.  
 +</WRAP> 
 + 
 +=====LAB #6 - Conteneurs Init==== 
 + 
 +====6.1 - Présentation==== 
 + 
 +Un Conteneur Init est un conteneur qui ne s'exécute qu'une seule fois au démarrage du pod. S'il existe plusieurs conteneurs Init, ceux-ci s'exécutent dans l'ordre. Un conteneur Init doit terminer son exécution avant que le conteneur Init suivant, ou l'application si le conteneur Init concerné est le dernier, peut s'exécuter. Le but d'un conteneur Init est d'exécuter du code qui n'a pas besoin de se trouver dans les conteneurs de l'application afin rendre plus légers ces derniers, par exemple : 
 + 
 +  * isoler, d'une manière sécurisée, des données sensibles tels des mots de passe afin d'éviter à ce que celles-ci soient compromises si un conteneur de l'application est compromis, 
 +  * injecter des données dans un volume partagé, 
 +  * faire patienter un pod en attendant que d'autres ressources de K8s soient créées. 
 + 
 +====6.2 - Mise en Place==== 
 + 
 +Commencez par créer le fichier **initpod.yaml** : 
 + 
 +<code> 
 +root@kubemaster:~# vi initpod.yaml 
 +root@kubemaster:~# cat initpod.yaml 
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  name: initpod 
 +spec: 
 +  containers: 
 +  - name: nginx 
 +    image: nginx:1.19.1 
 +  initContainers: 
 +  - name: delay 
 +    image: busybox 
 +    command: ['sleep', '30'
 +</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** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f initpod.yaml  
 +pod/initpod created 
 +</code> 
 + 
 +Consultez l'état du pod : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pod initpod 
 +NAME      READY   STATUS     RESTARTS   AGE 
 +initpod   0/    Init:0/           6s 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que le **STATUS** du pod est **Init:0/1**. 
 +</WRAP> 
 + 
 +Patientez au moins 30 secondes puis exécutez la dernière commande de nouveau : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pod initpod 
 +NAME      READY   STATUS    RESTARTS   AGE 
 +initpod   1/    Running            79s 
 +</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'attribution de pods aux noeuds. Ce processus est accompli par le **Scheduler**, un composant du **Control Plane**. 
 + 
 +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 : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get nodes 
 +NAME                        STATUS   ROLES           AGE   VERSION 
 +kubemaster.ittraining.loc   Ready    control-plane   11d   v1.25.0 
 +kubenode1.ittraining.loc    Ready    <none>          11d   v1.25.0 
 +kubenode2.ittraining.loc    Ready    <none>          11d   v1.25.0 
 +</code> 
 + 
 +===nodeSelector==== 
 + 
 +Attribuez l'étiquette **mylabel=thisone** au noeud **kubenode1.ittraining.loc** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl label nodes kubenode1.ittraining.loc mylabel=thisone 
 +node/kubenode1.ittraining.loc labeled 
 +</code> 
 + 
 +Créez maintenant le fichier **nodeselector.yaml** : 
 + 
 +<code> 
 +root@kubemaster:~# vi nodeselector.yaml 
 +root@kubemaster:~# cat nodeselector.yaml 
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  name: nodeselector 
 +spec: 
 +  nodeSelector: 
 +    mylabel: "thisone" 
 +  containers: 
 +  - name: nginx 
 +    image: nginx:1.19.1 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez l'entrée **nodeSelector**. 
 +</WRAP> 
 + 
 +Créez le pod **nodeselector** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f nodeselector.yaml 
 +pod/nodeselector created 
 +</code> 
 + 
 +Constatez l'emplacement du pod **nodeselector** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pod nodeselector -o wide 
 +NAME           READY   STATUS    RESTARTS   AGE   IP               NODE                       NOMINATED NODE   READINESS GATES 
 +nodeselector   1/    Running            66s   192.168.239.21   kubenode1.ittraining.loc   <none>           <none> 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que le pod nodeselector a été schedulé sur le noeud **kubenode1**. 
 +</WRAP> 
 + 
 +===nodeName=== 
 + 
 +Créez maintenant le fichier **nodename.yaml** : 
 + 
 +<code> 
 +root@kubemaster:~# vi nodename.yaml 
 +root@kubemaster:~# cat nodename.yaml 
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  name: nodename 
 +spec: 
 +  nodeName: kubenode2.ittraining.loc 
 +  containers: 
 +    - name: nginx 
 +      image: nginx:1.19.1 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que le pod va être schedulé sur **kubenode2.ittraining.loc** grâce à l'utilisation de **nodeName**. 
 +</WRAP> 
 + 
 +Créez le pod **nodename** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f nodename.yaml 
 +pod/nodename created 
 +</code> 
 + 
 +Constatez l'emplacement du pod **nodename** : 
 + 
 +<code> 
 +pod/nodename created 
 +root@kubemaster:~# kubectl get pod nodename -o wide 
 +NAME       READY   STATUS    RESTARTS   AGE   IP               NODE                       NOMINATED NODE   READINESS GATES 
 +nodename   1/    Running            67s   192.168.150.25   kubenode2.ittraining.loc   <none>           <none> 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que le pod a été schedulé sur **kubenode2.ittraining.loc** grâce à l'utilisation de **nodeName**. 
 +</WRAP> 
 + 
 +=====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 : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl delete --all pods --namespace=default 
 +pod "alwayspod" deleted 
 +pod "bigrequestpod" deleted 
 +pod "helperpod" deleted 
 +pod "initpod" deleted 
 +pod "liveness-pod" deleted 
 +pod "livenesspodhttp" deleted 
 +pod "multicontainerpod" deleted 
 +pod "my-deployment-67b5d4bf57-6wcrq" deleted 
 +pod "myapp-deployment-689f9d59-c25f9" deleted 
 +pod "myapp-deployment-689f9d59-nn9sw" deleted 
 +pod "myapp-deployment-689f9d59-rnc4r" deleted 
 +pod "never" deleted 
 +pod "nodename" deleted 
 +pod "nodeselector" deleted 
 +pod "onfailure" deleted 
 +pod "readinesspod" deleted 
 +pod "resourcepod" deleted 
 +pod "startuppod" deleted 
 + 
 +root@kubemaster:~# kubectl delete --all deployments --namespace=default 
 +deployment.apps "my-deployment" deleted 
 +deployment.apps "myapp-deployment" deleted 
 +</code> 
 + 
 +Créez ensuite le fichier **daemonset.yaml** : 
 + 
 +<code> 
 +root@kubemaster:~# vi daemonset.yaml 
 +root@kubemaster:~# cat daemonset.yaml 
 +apiVersion: apps/v1 
 +kind: DaemonSet 
 +metadata: 
 +  name: mydaemonset 
 +spec: 
 +  selector: 
 +    matchLabels: 
 +      app: mydaemonset 
 +  template: 
 +    metadata: 
 +      labels: 
 +        app: mydaemonset 
 +    spec: 
 +      containers: 
 +      - name: nginx 
 +        image: nginx:1.19.1 
 +</code> 
 + 
 +Créez le DaemonSet **mydaemonset** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl create -f daemonset.yaml 
 +daemonset.apps/mydaemonset created 
 +</code> 
 + 
 +Constatez le statut du **DaemonSet** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get daemonset 
 +NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE 
 +mydaemonset                                    2           <none>          37s 
 +</code> 
 + 
 +Constatez maintenant qu'il a un pod sur chaque noeud : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pods -o wide 
 +NAME                READY   STATUS    RESTARTS   AGE   IP               NODE                       NOMINATED NODE   READINESS GATES 
 +mydaemonset-hmdhp   1/    Running            38s   192.168.239.26   kubenode1.ittraining.loc   <none>           <none> 
 +mydaemonset-kmf4z   1/    Running            38s   192.168.150.30   kubenode2.ittraining.loc   <none>           <none> 
 +</code> 
 + 
 +<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. 
 +</WRAP> 
 + 
 +=====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'être contrôler par l'API de K8s, 
 +    * 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**, le chemin "spécifique" par défaut dans chaque **worker** est **/etc/kubernetes/manifests**. Notez qu'il est possible de modifier ce chemin. 
 + 
 +====9.2 - Mise en Place==== 
 + 
 +Connectez-vous à kubenode1 et devenez l'utilisateur **root** : 
 + 
 +<code> 
 +root@kubemaster:~# ssh -l trainee 192.168.56.3 
 +trainee@192.168.56.3's password: trainee 
 +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 /usr/share/doc/*/copyright. 
 + 
 +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:~$ su - 
 +Mot de passe : fenestros 
 +root@kubenode1:~#  
 +</code> 
 + 
 +Créez le fichier **/etc/kubernetes/manifests/mystaticpod.yaml** : 
 + 
 +<code> 
 +/etc/kubernetes/manifests 
 +</code> 
 + 
 +Créez le pod **mystaticpod** : 
 + 
 +<code> 
 +root@kubenode1:~# vi /etc/kubernetes/manifests/mystaticpod.yaml 
 +root@kubenode1:~# cat /etc/kubernetes/manifests/mystaticpod.yaml 
 +apiVersion: v1 
 +kind: Pod 
 +metadata: 
 +  name: mystaticpod 
 +spec: 
 +  containers: 
 +  - name: nginx 
 +    image: nginx:1.19.1 
 +</code> 
 + 
 +<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. 
 +</WRAP> 
 + 
 +Re-démarrez le service **kubelet** pour démarrer le pod statique **immédiatement** sans attendre : 
 + 
 +<code> 
 +root@kubenode1:~# systemctl restart kubelet 
 +</code> 
 + 
 +Retournez au **kubemaster** et constatez la présence d'un pod miroir : 
 + 
 +<code> 
 +root@kubenode1:~# exit 
 +déconnexion 
 +trainee@kubenode1:~$ exit 
 +déconnexion 
 +Connection to 192.168.56.3 closed. 
 + 
 +root@kubemaster:~# kubectl get pods 
 +NAME                                   READY   STATUS    RESTARTS   AGE 
 +mydaemonset-hmdhp                      1/1     Running            32m 
 +mydaemonset-kmf4z                      1/1     Running            32m 
 +mystaticpod-kubenode1.ittraining.loc   1/    Running            3m40s 
 +</code> 
 + 
 +Supprimez maintenant le pod statique : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl delete pod mystaticpod-kubenode1.ittraining.loc 
 +pod "mystaticpod-kubenode1.ittraining.loc" deleted 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que la suppression semble avoir réussi. 
 +</WRAP> 
 + 
 +Constatez les pods en cours d'exécution : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl get pods 
 +NAME                                   READY   STATUS    RESTARTS   AGE 
 +mydaemonset-hmdhp                      1/1     Running            45m 
 +mydaemonset-kmf4z                      1/1     Running            45m 
 +mystaticpod-kubenode1.ittraining.loc   1/    Running            19s 
 +</code> 
 + 
 +<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é. 
 +</WRAP> 
 + 
 +Pour supprimer le pod statique, connectez-vous à **kubenode1** : 
 + 
 +<code> 
 +root@kubemaster:~# ssh -l trainee kubenode1 
 +trainee@kubenode1's password: trainee 
 +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 /usr/share/doc/*/copyright. 
 + 
 +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:~$ su - 
 +Mot de passe : fenestros 
 + 
 +root@kubenode1:~# rm -f /etc/kubernetes/manifests/mystaticpod.yaml  
 + 
 +root@kubenode1:~# systemctl restart kubelet 
 + 
 +root@kubenode1:~# exit 
 +déconnexion 
 + 
 +trainee@kubenode1:~$ exit 
 +déconnexion 
 +Connection to kubenode1 closed. 
 + 
 +root@kubemaster:~# 
 +</code> 
 + 
 +----- 
 + 
 +Copyright © 2024 Hugh Norris
  
Menu