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/15 08:53] adminelearning:workbooks:kubernetes:k8s03 [2024/12/15 06:51] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version - **2020.02**+Version - **2024.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
Ligne 40: Ligne 40:
       * 6.1 - Présentation       * 6.1 - Présentation
       * 6.2 - Mise en Place       * 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
  
  
Ligne 146: 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 204: Ligne 262:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** : Notez que la variable **$CONFIGMAPVAR** contiendra la valeur de **key1** de la **ConfigMap** et que la variable **$SECRETVAR** contiendra la valeur de **secretkey1** du **Secret**.+**Important** : Notez que la variable **$CONFIGMAPVAR** contiendra la valeur de **key1** de la **ConfigMap** et que la variable **$SECRETVAR** contindra la valeur de **secretkey1** du **Secret**.
 </WRAP> </WRAP>
  
Ligne 411: 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é.
   * **Readiness Probes**,   * **Readiness Probes**,
-    * Similaires aux Startup Probes car ils n’interviennent 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.2 - Liveness Probes==== ====3.2 - Liveness Probes====
Ligne 581: Ligne 639:
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** : Dans le fichier ci-dessus, si la commande **GET /** s'exécute sans erreur, le conteneur sera considéré dans un état de READY. Le Readiness Probe démarrera 5 secondes après le démarrage du conteneur grâce à la directive **initialDelaySeconds**. Ensuite le probe s'exécutera tous les 5 secondes grâce à la directive **periodSeconds**.+**Important** : Dans le fichier ci-dessus, si la commande **GET /** s'exécute sans erreur, le conteneur sera considéré dasn un état de READY. Le Readiness Probe démarrera 5 secondes après le démarrage du conteneur grâce à la directive **initialDelaySeconds**. Ensuite le probe s'exécutera tous les 5 secondes grâce à la directive **periodSeconds**.
 </WRAP> </WRAP>
  
Ligne 604: 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>
  
Ligne 796: Ligne 854:
 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**. 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 intéraction prend la forme de partager :+Cette interaction prend la forme de partager :
  
   * le même espace réseau,   * le même espace réseau,
Ligne 975: Ligne 1033:
 </WRAP> </WRAP>
  
---- +=====LAB #7 Scheduling===== 
-Copyright © 2022 Hugh Norris+ 
 +====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