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:49] 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 78: 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 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 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é.
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 794: 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'exception à cette règle est quand deux ou plus de pods ont besoin d'intéragir 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'intéraction 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