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:k8s04 [2022/09/16 16:54] adminelearning:workbooks:kubernetes:k8s04 [2024/12/19 13:33] (Version actuelle) admin
Ligne 1: Ligne 1:
 ~~PDF:LANDSCAPE~~ ~~PDF:LANDSCAPE~~
  
-Version - **2022.03**+Version - **2024.01**
  
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
 +
  
 ======DOF305 - Gestion du Réseau, des Services et d'une Architecture de Microservices====== ======DOF305 - Gestion du Réseau, des Services et d'une Architecture de Microservices======
Ligne 12: Ligne 13:
     * Contenu du Module     * Contenu du Module
     * LAB #1 - Gestion du Réseau et des Services     * LAB #1 - Gestion du Réseau et des Services
-      * 1.1 - Présentation+      * 1.1 - Présentation des Extensions Réseau
       * 1.2 - DNS K8s       * 1.2 - DNS K8s
 +        * Présentation
 +        * Mise en Application
       * 1.3 - Network Policies       * 1.3 - Network Policies
 +        * Présentation
 +        * Mise en Application
       * 1.4 - Services       * 1.4 - Services
         * Le Service NodePort         * Le Service NodePort
 +          * Présentation
 +          * Mise en Application
         * Le Service ClusterIP         * Le Service ClusterIP
 +          * Présentation
 +          * Mise en Application
 +      * 1.5 - Services et le DNS k8s 
 +        * Présentation
 +        * Mise en Application
 +      * 1.6 - Gestion de K8s Ingress
 +        * Présentation
 +        * Mise en Application
     * LAB #2 - Gestion de l'Architecture des Microservices     * LAB #2 - Gestion de l'Architecture des Microservices
       * 2.1 - Présentation       * 2.1 - Présentation
Ligne 24: Ligne 39:
       * 2.4 - Déployer l'Application       * 2.4 - Déployer l'Application
       * 2.5 - Scaling Up       * 2.5 - Scaling Up
 +
 +=====Ressources=====
 +
 +====LAB #1====
 +
 +  * https://www.dropbox.com/scl/fi/rqxq22c6fxgr2zivf02au/clusterip-example.yaml?rlkey=q79w12mcfj5jaj48j7kl4gv3p&dl=0
 +  * https://www.dropbox.com/scl/fi/d105k0mjg4guwn1gg2sr6/clusterip-service.yaml?rlkey=bvvdhihx85p5n6bct0cdy5jlg&dl=0
 +  * https://www.dropbox.com/scl/fi/9zgm5sgh8l8f5jhde9e3z/clusterippod.yaml?rlkey=crh5jpt5om0ekcibjrd8ec64y&dl=0
 +  * https://www.dropbox.com/scl/fi/pt62nfxzi9tsa0fj8hfza/dnstest.yaml?rlkey=qob9301qplpplt6v2tm3x1l7j&dl=0
 +  * https://www.dropbox.com/scl/fi/wtx04mm4um741dlj9wmj7/myingress.yaml?rlkey=mqeggcq8ccms9nv1zunk43kuh&dl=0
 +  * https://www.dropbox.com/scl/fi/nvud4cx3jcya5e5ji188u/mynetworkpolicy.yaml?rlkey=osrpfjrxietbrrcoalflhmbl5&dl=0
 +  * https://www.dropbox.com/scl/fi/k84yyq96t7hnigo8q66qs/npbusybox.yaml?rlkey=ehq8qowb04r26s6jfk3qkl4cz&dl=0
 +  * https://www.dropbox.com/scl/fi/ivq5emll325nwj9yzjuam/npnginx.yaml?rlkey=sk1rso41e3wrou5y4iy024xdq&dl=0
 +  * https://www.dropbox.com/scl/fi/3cp23paw353zplllsily8/service-definition.yaml?rlkey=oe5sfo9soa6q25a8mjqw7ax59&dl=0
 +
 +
 +====LAB #2====
 +
 +  * https://www.dropbox.com/scl/fi/c87nyp8f2o9vh64pifcmy/postgres-deployment.yaml?rlkey=bu3n6i0372131q9qzonry6kal&dl=0
 +  * https://www.dropbox.com/scl/fi/qionkk9d5lj5cqbkqpg9x/postgres-service.yaml?rlkey=h4smnpd1afkyscx8eg9sanh7h&dl=0
 +  * https://www.dropbox.com/scl/fi/o00mmelwwhx0ytkjq7kvl/redis-deployment.yaml?rlkey=2ne90svzrmzne619mtxswwi3e&dl=0
 +  * https://www.dropbox.com/scl/fi/l0j16x1ais5686u8qaesf/redis-service.yaml?rlkey=t3sezo8is3pu34vmjoq1zw4ug&dl=0
 +  * https://www.dropbox.com/scl/fi/ap63boqbt0mot16sx3fva/result-app-deployment.yaml?rlkey=5epq45fioqdkecueo5fcwn2h8&dl=0
 +  * https://www.dropbox.com/scl/fi/qxo4g3bim0bc1v537tnse/result-app-service.yaml?rlkey=u7ryslr2lf25m9ibl4t7yujux&dl=0
 +  * https://www.dropbox.com/scl/fi/uinl9q5h1uqkkva9txad3/voting-app-deployment.yaml?rlkey=9os74agx9tljxcg44hwas917f&dl=0
 +  * https://www.dropbox.com/scl/fi/yo29xrt2h4414tl0z9pk9/voting-app-service.yaml?rlkey=h36b4xocyhjvkjosntmpu3bha&dl=0
 +  * https://www.dropbox.com/scl/fi/3cwnbhext63brqqit7pzx/worker-deployment.yaml?rlkey=6u8elahie7ah3hqgj2cksnx75&dl=0
  
 =====LAB #1 - Gestion du Réseau et des Services===== =====LAB #1 - Gestion du Réseau et des Services=====
  
-====1.1 - Présentation====+====1.1 - Présentation des Extensions Réseau====
  
 Kubernetes impose des conditions pour l’implémentation d'un réseau : Kubernetes impose des conditions pour l’implémentation d'un réseau :
Ligne 34: Ligne 76:
   * Les agents sur un nœud (par exemple kubelet) peuvent communiquer avec tous les PODs sur le nœud.   * Les agents sur un nœud (par exemple kubelet) peuvent communiquer avec tous les PODs sur le nœud.
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : La description technique et détaillée de l'approche réseau de Kubernetes peut être consultée à l'adresse : **[[https://kubernetes.io/docs/concepts/cluster-administration/networking/]]**. **Important** : La description technique et détaillée de l'approche réseau de Kubernetes peut être consultée à l'adresse : **[[https://kubernetes.io/docs/concepts/cluster-administration/networking/]]**.
 </WRAP> </WRAP>
Ligne 50: Ligne 92:
   * Canal (utilise Flannel pour le réseau et Calico pour le pare-feu).   * Canal (utilise Flannel pour le réseau et Calico pour le pare-feu).
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Une étude comparative des extensions réseau pour Kubernetes peut être trouvée à la page : **[[https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-august-2020-6e1b757b9e49]]**. **Important** : Une étude comparative des extensions réseau pour Kubernetes peut être trouvée à la page : **[[https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-august-2020-6e1b757b9e49]]**.
 </WRAP> </WRAP>
  
 ====1.2 - DNS K8s==== ====1.2 - DNS K8s====
 +
 +===Présentation===
  
 Les services DNS du cluster utilisant le plugin **Calico** sont fournis par **CoreDNS** : Les services DNS du cluster utilisant le plugin **Calico** sont fournis par **CoreDNS** :
Ligne 76: Ligne 120:
 adresse_ip_du_pod_sous_le_format_xxx-xxx-xxx-xxx.nom_namespace.pod.cluster.local adresse_ip_du_pod_sous_le_format_xxx-xxx-xxx-xxx.nom_namespace.pod.cluster.local
 </file> </file>
 +
 +===Mise en Application===
  
 Pour tester le DNS, créez le fichier **dnstest.yaml** : Pour tester le DNS, créez le fichier **dnstest.yaml** :
Ligne 104: Ligne 150:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que ce fichier va créer deux pods - **busybox-dnstest** et **nginx-dnstest**. **Important** : Notez que ce fichier va créer deux pods - **busybox-dnstest** et **nginx-dnstest**.
 </WRAP> </WRAP>
Ligne 127: Ligne 173:
  
 <code> <code>
-<nowiki> 
 root@kubemaster:~# kubectl exec busybox-dnstest -- curl 192.168.150.33 root@kubemaster:~# kubectl exec busybox-dnstest -- curl 192.168.150.33
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Ligne 151: Ligne 196:
 </html> </html>
 100   612  100   612    0       533k      0 --:--:-- --:--:-- --:--:--  597k 100   612  100   612    0       533k      0 --:--:-- --:--:-- --:--:--  597k
-</nowiki> 
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son adresse IP. **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son adresse IP.
 </WRAP> </WRAP>
Ligne 169: Ligne 213:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que le nom d'hôte a été résolu grâce au DNS K8s. **Important** : Notez que le nom d'hôte a été résolu grâce au DNS K8s.
 </WRAP> </WRAP>
Ligne 180: Ligne 224:
                                  Dload  Upload   Total   Spent    Left  Speed                                  Dload  Upload   Total   Spent    Left  Speed
   0        0        0          0      0 --:--:-- --:--:-- --:--:--     0   0        0        0          0      0 --:--:-- --:--:-- --:--:--     0
-<!DOCTYPE html> +...
-<html> +
-<head>+
 <title>Welcome to nginx!</title> <title>Welcome to nginx!</title>
 ... ...
-</head> 
-<body> 
-<h1>Welcome to nginx!</h1> 
-<p>If you see this page, the nginx web server is successfully installed and 
-working. Further configuration is required.</p> 
- 
-<p>For online documentation and support please refer to 
-<a href="http://nginx.org/">nginx.org</a>.<br/> 
-Commercial support is available at 
-<a href="http://nginx.com/">nginx.com</a>.</p> 
- 
-<p><em>Thank you for using nginx.</em></p> 
-</body> 
-</html> 
 100   612  100   612    0       355k      0 --:--:-- --:--:-- --:--:--  597k 100   612  100   612    0       355k      0 --:--:-- --:--:-- --:--:--  597k
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son nom d'hôte. **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son nom d'hôte.
 </WRAP> </WRAP>
  
 ====1.3 - Network Policies==== ====1.3 - Network Policies====
 +
 +===Présentation===
  
 Un **NetworkPolicy** est un objet K8s qui permet de contrôler la communication vers et à partir des pods. Un **NetworkPolicy** est un objet K8s qui permet de contrôler la communication vers et à partir des pods.
Ligne 226: Ligne 256:
     * un namespaceSelector peut sélectionner des nameSpaces en utilisant des Labels (//étiquettes en français//),     * un namespaceSelector peut sélectionner des nameSpaces en utilisant des Labels (//étiquettes en français//),
   * **ipBlock**,   * **ipBlock**,
-    * un IPBlock peut sélectionner des pods en utilisants une plage d'adrsses IP au format CIDR.+    * un IPBlock peut sélectionner des pods en utilisant une plage d’adresses IP au format CIDR.
  
-En complément des Types ci-dessus, il est uassi possible de spécifier :+En complément des Types ci-dessus, il est aussi possible de spécifier :
  
   * **Ports**,   * **Ports**,
-    * les ports specifient le numéro de port ainsi que le protocole,+    * les ports spécifient le numéro de port ainsi que le protocole,
     * le trafic réseau n'est accepté que dans le cas où les règles spécifiées par le Type **et** le port/protocole sont satisfaits.     * le trafic réseau n'est accepté que dans le cas où les règles spécifiées par le Type **et** le port/protocole sont satisfaits.
 +
 +===Mise en Application===
  
 Pour mieux comprendre, créez un NameSpace dénommé **nptest** : Pour mieux comprendre, créez un NameSpace dénommé **nptest** :
Ligne 248: Ligne 280:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'étiquette **lab=nptest**. **Important** : Notez l'étiquette **lab=nptest**.
 </WRAP> </WRAP>
Ligne 270: Ligne 302:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'étiquette **app: nginx**. **Important** : Notez l'étiquette **app: nginx**.
 </WRAP> </WRAP>
Ligne 300: Ligne 332:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'étiquette **app: client**. **Important** : Notez l'étiquette **app: client**.
 </WRAP> </WRAP>
Ligne 357: Ligne 389:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Rappelez-vous : par défaut, un pod n'est pas isolé dans le cluster. La communication a donc réussi. **Important** : Rappelez-vous : par défaut, un pod n'est pas isolé dans le cluster. La communication a donc réussi.
 </WRAP> </WRAP>
Ligne 380: Ligne 412:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'étiquette **app: nginx**. La policy s'applique donc au pod **npnginx**. **Important** : Notez l'étiquette **app: nginx**. La policy s'applique donc au pod **npnginx**.
 </WRAP> </WRAP>
Ligne 400: Ligne 432:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que la NetworkPolicy bloque la communication. Notez aussi l'utilisation de **^C** pour terminer le processus. **Important** : Notez que la NetworkPolicy bloque la communication. Notez aussi l'utilisation de **^C** pour terminer le processus.
 </WRAP> </WRAP>
Ligne 444: Ligne 476:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez la création de la règle **ingress**. Cette règle utilise un namespaceSelector pour permettre du trafic à partir de pods dans un NameSpace ayant une étiquette **lab: nptest**.  La règle ports permet le trafic sur le port 80/tcp.  **Important** : Notez la création de la règle **ingress**. Cette règle utilise un namespaceSelector pour permettre du trafic à partir de pods dans un NameSpace ayant une étiquette **lab: nptest**.  La règle ports permet le trafic sur le port 80/tcp. 
 </WRAP> </WRAP>
Ligne 476: Ligne 508:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que la communication a réussi.  **Important** : Notez que la communication a réussi. 
 </WRAP> </WRAP>
  
 ====1.4 - Services==== ====1.4 - Services====
 +
 +===Présentation===
  
 Les services de K8s sont : Les services de K8s sont :
Ligne 492: Ligne 526:
   * ExternalName   * ExternalName
     * Ne fait pas parti de la certification CKA.     * Ne fait pas parti de la certification CKA.
 +
 +===Mise en Application===
  
 Commencez par créer le deployment **myapp-deployment** : Commencez par créer le deployment **myapp-deployment** :
Ligne 511: Ligne 547:
 mydaemonset-hmdhp                      1/1     Running   1 (7h29m ago)   23h    192.168.239.32   kubenode1.ittraining.loc   <none>           <none> mydaemonset-hmdhp                      1/1     Running   1 (7h29m ago)   23h    192.168.239.32   kubenode1.ittraining.loc   <none>           <none>
 mydaemonset-kmf4z                      1/1     Running                 23h    192.168.150.31   kubenode2.ittraining.loc   <none>           <none> mydaemonset-kmf4z                      1/1     Running                 23h    192.168.150.31   kubenode2.ittraining.loc   <none>           <none>
-mystaticpod-kubenode1.ittraining.loc   1/    Running   1 (7h29m ago)   22h    192.168.239.30   kubenode1.ittraining.loc   <none>           <none> 
 nginx-dnstest                          1/1     Running                 4h9m   192.168.150.33   kubenode2.ittraining.loc   <none>           <none> nginx-dnstest                          1/1     Running                 4h9m   192.168.150.33   kubenode2.ittraining.loc   <none>           <none>
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que les adresses **192.168.239.x** sont associées aux PODs sur kubenode1 tandis que les adresses **192.168.150.x** sont associées aux PODs sur kubenode2. Ces adresses sont issues du réseau **192.168.0.0/16** stipulé par l'option **--pod-network-cidr** lors de l'initialisation du maître du cluster. **Important** : Notez que les adresses **192.168.239.x** sont associées aux PODs sur kubenode1 tandis que les adresses **192.168.150.x** sont associées aux PODs sur kubenode2. Ces adresses sont issues du réseau **192.168.0.0/16** stipulé par l'option **--pod-network-cidr** lors de l'initialisation du maître du cluster.
 </WRAP> </WRAP>
Ligne 531: Ligne 566:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'échec de la connexion. **Important** : Notez l'échec de la connexion.
 </WRAP> </WRAP>
Ligne 592: Ligne 627:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Retenez donc qu'à ce stade il n'est pas possible d'afficher la page d'accueil de Nginx en vous connectant de l'extérieur du cluster. **Important** : Retenez donc qu'à ce stade il n'est pas possible d'afficher la page d'accueil de Nginx en vous connectant de l'extérieur du cluster.
 </WRAP> </WRAP>
  
 ===Le Service NodePort=== ===Le Service NodePort===
 +
 +==Présentation==
  
 Le Service NodePort définit trois ports : Le Service NodePort définit trois ports :
Ligne 610: Ligne 647:
 {{ :elearning:workbooks:debian:6:avance:kubernetes13.png?direct&600 |}} {{ :elearning:workbooks:debian:6:avance:kubernetes13.png?direct&600 |}}
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que dans ce cas l'équilibrage de charge est automatique est utilise l’algorithme **Random** avec une affinité de session.. **Important** : Notez que dans ce cas l'équilibrage de charge est automatique est utilise l’algorithme **Random** avec une affinité de session..
 </WRAP> </WRAP>
Ligne 617: Ligne 654:
  
 {{ :elearning:workbooks:debian:6:avance:kubernetes14.png?direct&800 |}} {{ :elearning:workbooks:debian:6:avance:kubernetes14.png?direct&800 |}}
 +
 +==Mise en Application==
  
 Créez donc le fichier YAML **service-definition.yaml** : Créez donc le fichier YAML **service-definition.yaml** :
Ligne 639: Ligne 678:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que si le champ **type:** est manquant, sa valeur par défaut est **ClusterIP**. Notez aussi que dans **ports**, seul le champ **port** est obligatoire. Si le champ **targetPort** est manquant, sa valeur par défaut est celle du champ **port**. Si le champ **nodePort** est manquant, sa valeur par défaut est le premier port disponible dans la plage entre **30 000** et **32 767**. Dernièrement, il est possible de spécifier de multiples définitions de ports dans le service. **Important** : Notez que si le champ **type:** est manquant, sa valeur par défaut est **ClusterIP**. Notez aussi que dans **ports**, seul le champ **port** est obligatoire. Si le champ **targetPort** est manquant, sa valeur par défaut est celle du champ **port**. Si le champ **nodePort** est manquant, sa valeur par défaut est le premier port disponible dans la plage entre **30 000** et **32 767**. Dernièrement, il est possible de spécifier de multiples définitions de ports dans le service.
 </WRAP> </WRAP>
Ligne 676: Ligne 715:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que le Service a une adresse IP du cluster et qu'il a exposé le port **30 008**. **Important** : Notez que le Service a une adresse IP du cluster et qu'il a exposé le port **30 008**.
 </WRAP> </WRAP>
Ligne 746: Ligne 785:
  
 ===Le Service ClusterIP=== ===Le Service ClusterIP===
 +
 +==Présentation==
  
 Le Service **ClusterIP** permet de regrouper les PODs offrant le même service afin de faciliter la communication entre pods à l'intérieur du cluster. Le Service **ClusterIP** permet de regrouper les PODs offrant le même service afin de faciliter la communication entre pods à l'intérieur du cluster.
 +
 +==Mise en Application==
  
 Pour créer un Service ClusterIP, créez le fichier **clusterip-example.yaml** : Pour créer un Service ClusterIP, créez le fichier **clusterip-example.yaml** :
Ligne 809: Ligne 852:
 root@kubemaster:~# kubectl get services root@kubemaster:~# kubectl get services
 NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
-clusteripservice   ClusterIP   10.103.249.71   <none>        80/TCP    5s+clusteripservice   ClusterIP   10.109.80.217   <none>        80/TCP    5s
 kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP   12d kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP   12d
 </code> </code>
Ligne 818: Ligne 861:
 root@kubemaster:~# kubectl get endpoints clusteripservice root@kubemaster:~# kubectl get endpoints clusteripservice
 NAME               ENDPOINTS                                               AGE NAME               ENDPOINTS                                               AGE
-clusteripservice   192.168.150.37:80,192.168.150.38:80,192.168.239.36:80   114s+clusteripservice   192.168.150.39:80,192.168.150.40:80,192.168.239.38:80   114s
 </code> </code>
  
Ligne 880: Ligne 923:
 </code> </code>
  
-=====LAB #2 Gestion d'une Architecture de Microservices=====+====1.5 Services et le DNS k8s=====
  
-Supprimez maintenant les Services créés :+Avant de poursuivre, nettoyez le cluster :
  
 <code> <code>
Ligne 888: Ligne 931:
 service "myapp-service" deleted service "myapp-service" deleted
  
-root@kubemaster:~# kubectl delete service clusteripservice +root@kubemaster:~# kubectl delete deployment myapp-deployment 
-service "clusteripservice" deleted+deployment.extensions "myapp-deployment" deleted 
 + 
 +root@kubemaster:~# kubectl delete daemonset mydaemonset 
 +daemonset.apps "mydaemonset" deleted 
 + 
 +root@kubemaster:~# kubectl delete pods busybox-dnstest nginx-dnstest 
 +pod "busybox-dnstest" deleted 
 +pod "nginx-dnstest" deleted
 </code> </code>
  
-Supprimez le Deployment **myapp-deployment** et **deploymentclusterip** :+===Présentation=== 
 + 
 +Chaque service K8s est attribué un FQDN sous la forme : 
 + 
 +<file> 
 +nom-service.nom-namespace.svc.nom-cluster-domain.example 
 +</file> 
 + 
 +Notez que : 
 + 
 +  * Le **nom-cluster-domain.example** par défaut est **cluster.local**. 
 +  * Le FQDN peut être utilisé pour atteindre un service à partir de n'importe quel NameSpace.  
 +  * Les pods du même NameSpace que le service peuvent l'atteindre en utilisant son nom court, à savoir, **nom-service**
 + 
 +===Mise en Application=== 
 + 
 +Visualisez le service **clusteripservice** créé précédement :
  
 <code> <code>
-root@kubemaster:~# kubectl delete deployment myapp-deployment +root@kubemaster:~# kubectl get service clusteripservice 
-deployment.extensions "myapp-deployment" deleted+NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE 
 +clusteripservice   ClusterIP   10.109.80.217   <none>        80/TCP    12m
 </code> </code>
 +
 +ainsi que les pods présents dans le cluster :
  
 <code> <code>
-root@kubemaster:~# kubectl delete deployment deploymentclusterip +root@kubemaster:~# kubectl get pods 
-deployment.apps "deploymentclusterip" deleted+NAME                                   READY   STATUS    RESTARTS   AGE 
 +clusterippod                           1/    Running            11m 
 +deploymentclusterip-7776dc8d55-bmfjl   1/    Running            15m 
 +deploymentclusterip-7776dc8d55-pgmcg   1/    Running            15m 
 +deploymentclusterip-7776dc8d55-qvphh   1/    Running            15m
 </code> </code>
  
-Supprimez le DaemonSet **mydaemonset** :+Visualisez le FQDN du service **clusteripservice** en utilisant le pod **clusterippod** :
  
 <code> <code>
-root@kubemaster:~# kubectl delete daemonset mydaemonset +root@kubemaster:~# kubectl exec clusterippod -- nslookup 10.109.80.217 
-daemonset.apps "mydaemonset" deleted+Server:    10.96.0.10 
 +Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local 
 + 
 +Name:      10.109.80.217 
 +Address 1: 10.109.80.217 clusteripservice.default.svc.cluster.local
 </code> </code>
  
-Supprimez les pods restants :+<WRAP center round important 60%> 
 +**Important** : Notez que le FQDN du service est **clusteripservice.default.svc.cluster.local**. 
 +</WRAP> 
 + 
 +Vérifiez la communication avec le service en utilisant son adresse IP :
  
 <code> <code>
-root@kubemaster:~# kubectl delete pods busybox-dnstest clusterippod nginx-dnstest +root@kubemaster:~# kubectl exec clusterippod -- curl 10.109.80.217 
-pod "busybox-dnstestdeleted +  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
-pod "clusterippoddeleted +                                 Dload  Upload   Total   Spent    Left  Speed 
-pod "nginx-dnstest" deleted+100   612  100   612    0      35322      0 --:--:--<!DOCTYPE html>:--     0 
 +<html> 
 +<head> 
 +<title>Welcome to nginx!</title> 
 +<style> 
 +    body { 
 +        width: 35em; 
 +        margin: 0 auto; 
 +        font-family: Tahoma, Verdana, Arial, sans-serif; 
 +    } 
 +</style> 
 +</head> 
 +<body> 
 +<h1>Welcome to nginx!</h1> 
 +<p>If you see this page, the nginx web server is successfully installed and 
 +working. Further configuration is required.</p> 
 + 
 +<p>For online documentation and support please refer to 
 +<a href="http://nginx.org/">nginx.org</a>.<br/> 
 +Commercial support is available at 
 +<a href="http://nginx.com/">nginx.com</a>.</p> 
 + 
 +<p><em>Thank you for using nginx.</em></p> 
 +</body> 
 +</html> 
 + --:--:-- --:--:-- 36000
 </code> </code>
  
-Connectez-vous à **kubenode1** et supprimez le pod statique :+Vérifiez la communication avec le service en utilisant son nom court :
  
 <code> <code>
-root@kubemaster:~# ssh -l trainee kubenode1 +root@kubemaster:~# kubectl exec clusterippod -- curl clusteripservice 
-trainee@kubenode1's password: trainee +  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
-Linux kubenode1.ittraining.loc 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64+                                 Dload  Upload   Total   Spent    Left  Speed 
 +100   612  100   612    0      81404      0 --:--:-- --:--:-- --:--:--  597k 
 +<!DOCTYPE html> 
 +<html> 
 +<head> 
 +<title>Welcome to nginx!</title> 
 +<style> 
 +    body { 
 +        width: 35em; 
 +        margin: 0 auto; 
 +        font-family: Tahoma, Verdana, Arial, sans-serif; 
 +    } 
 +</style> 
 +</head> 
 +<body> 
 +<h1>Welcome to nginx!</h1> 
 +<p>If you see this page, the nginx web server is successfully installed and 
 +working. Further configuration is required.</p>
  
-The programs included with the Debian GNU/Linux system are free software; +<p>For online documentation and support please refer to 
-the exact distribution terms for each program are described in the +<a href="http://nginx.org/">nginx.org</a>.<br/> 
-individual files in /usr/share/doc/*/copyright.+Commercial support is available at 
 +<a href="http://nginx.com/">nginx.com</a>.</p>
  
-Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent +<p><em>Thank you for using nginx.</em></p> 
-permitted by applicable law. +</body> 
-Last login: Thu Sep 15 17:51:03 2022 from 192.168.56.2+</html> 
 +</code>
  
-trainee@kubenode1:~$ su - +<WRAP center round important 60%> 
-Mot de passe fenestros+**Important** Notez que la communication a réussi parce que le pod **clusterippod** et le service **clusteripservice** sont dans le même namespace. 
 +</WRAP>
  
-root@kubenode1:~# rm -f /etc/kubernetes/manifests/mystaticpod.yaml +Vérifiez la communication avec le service en utilisant son FQDN :
  
-root@kubenode1:~# systemctl restart kubelet+<code> 
 +root@kubemaster:~# kubectl exec clusterippod -- curl clusteripservice.default.svc.cluster.local 
 +  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
 +                                 Dload  Upload   Total   Spent    Left  Speed 
 +100   612  100   612    0       269k      0 --:--:-- --:--:-- --:--:--  597k 
 +<!DOCTYPE html> 
 +<html> 
 +<head> 
 +<title>Welcome to nginx!</title> 
 +<style> 
 +    body { 
 +        width: 35em; 
 +        margin: 0 auto; 
 +        font-family: Tahoma, Verdana, Arial, sans-serif; 
 +    } 
 +</style> 
 +</head> 
 +<body> 
 +<h1>Welcome to nginx!</h1> 
 +<p>If you see this page, the nginx web server is successfully installed and 
 +working. Further configuration is required.</p>
  
-root@kubenode1:~# exit +<p>For online documentation and support please refer to 
-déconnexion+<a href="http://nginx.org/">nginx.org</a>.<br/> 
 +Commercial support is available at 
 +<a href="http://nginx.com/">nginx.com</a>.</p>
  
-trainee@kubenode1:~$ exit +<p><em>Thank you for using nginx.</em></p> 
-déconnexion +</body> 
-Connection to kubenode1 closed.+</html> 
 +</code>
  
-root@kubemaster:~#+Vérifiez maintenant la communication avec le service en utilisant son nom court à partir du pod **npbusybox** dans le namespace **nptest** : 
 + 
 +<code> 
 +root@kubemaster:~# kubectl exec -n nptest npbusybox -- curl clusteripservice 
 +curl: (6) Couldn't resolve host 'clusteripservice' 
 +command terminated with exit code 6
 </code> </code>
  
-Vérifiez qu'il ne reste que le service par défaut **kubernetes** :+<WRAP center round important 60%> 
 +**Important** : Notez que la communication n'a pas réussi parce que le pod **npbusybox** et le service **clusteripservice** ne sont pas dans le même namespace. 
 +</WRAP> 
 + 
 +Vérifiez maintenant la communication avec le service en utilisant son FQDN à partir du pod **npbusybox** dans le namespace **nptest** :
  
 <code> <code>
-root@kubemaster:~# kubectl get all +root@kubemaster:~# kubectl exec -n nptest npbusybox -- curl clusteripservice.default.svc.cluster.local 
-NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE +  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
-service/kubernetes   ClusterIP   10.96.0.1    <none       443/TCP   12d+                                 Dload  Upload   Total   Spent    Left  Speed 
 +100   612  100   612    0       291k      0 --:--:-- --:--:-- --:--:--  597k 
 +<!DOCTYPE html> 
 +<html> 
 +<head> 
 +<title>Welcome to nginx!</title> 
 +<style> 
 +    body { 
 +        width: 35em; 
 +        margin: 0 auto; 
 +        font-family: Tahoma, Verdana, Arial, sans-serif; 
 +    } 
 +</style> 
 +</head> 
 +<body> 
 +<h1>Welcome to nginx!</h1> 
 +<p>If you see this page, the nginx web server is successfully installed and 
 +workingFurther configuration is required.</p> 
 + 
 +<p>For online documentation and support please refer to 
 +<a href="http://nginx.org/">nginx.org</a>.<br/
 +Commercial support is available at 
 +<a href="http://nginx.com/">nginx.com</a>.</p> 
 + 
 +<p><em>Thank you for using nginx.</em></p> 
 +</body> 
 +</html>
 </code> </code>
  
-====2.1 - Présentation====+<WRAP center round important 60%> 
 +**Important** : Notez que la communication a réussi grâce à l'utilisation du FQDN du service. 
 +</WRAP>
  
-Vous allez mettre en place une application simple, appelé **demo-voting-app** et développé par Docker, sous forme de microservices :+====1.6 Gestion de K8s Ingress====
  
-{{ :elearning:workbooks:debian:6:avance:app.png?direct&400 |}}+====Présentation====
  
-Dans cette application le conteneur **voting-app** permet de voter pour des **chats** ou des **chiens**Cette application tourne sous Python et fournit une interace HTML :+Un Ingress est un objet k8s qui gère l'accès aux services de l'extérieur du clusterUn Ingress est capable d'avantage de fonctionnalités qu'un simple service NodePort, par exemple :
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes15.png?direct&800 |}}+  * SSL, 
 +  * équilibrage de charge, 
 +  * hôtes virtuels par nom.
  
-Lors de la vote, le résultat de celle-ci est stocké dans **Redis** dans une base de données en mémoireLe résultat est ensuite passé au conteneur **Worker** qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur **db** qui tourne sous PostgreSQL.+L'Ingress ne fait rien tout seulIl a besoin d'un **Contrôleur Ingress** pour fonctionnerLa mise en place et la configuration d'un Contrôleur Ingress ne fait pas parti de la certification CKA.
  
-L'application **result-app** qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :+====Mise en Application ====
  
-{{ :elearning:workbooks:debian:6:avance:kubernetes16.png?direct&800 |}}+Commencez par créer le fichier **myingress.yaml** :
  
-Cette application peut être mise en place sous docker avec les commandes suivantes :+<code> 
 +root@kubemaster:~# vi myingress.yaml 
 +root@kubemaster:~# cat myingress.yaml 
 +apiVersion: networking.k8s.io/v1 
 +kind: Ingress 
 +metadata: 
 +  name: my-ingress 
 +spec: 
 +  rules: 
 +  - http: 
 +      paths: 
 +      - path: /somepath 
 +        pathType: Prefix 
 +        backend: 
 +          service: 
 +            name: clusteripservice 
 +            port: 
 +              number: 80 
 +</code> 
 + 
 +<WRAP center round important 60%> 
 +**Important** : Notez que dans ce fichier Ingress nous avons une règle qui définie un **path**. Des requêtes qui référence le path, par exemple %%http://<endpoint>/somepath%%, seront routées vers le **backend**. Dans cet exemple, le backend est un service, **clusteripservice** qui écoute sur le port **80**.  
 +</WRAP> 
 + 
 +Créez maintenant l'Ingress :
  
 <code> <code>
-docker run -d --name=redis redis +root@kubemaster:~# kubectl create -f myingress.yaml 
-docker run -d --name=db -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres postgres:9.4  +ingress.networking.k8s.io/my-ingress created
-docker run -d --name=vote -p 5000:80 --link redis:redis dockersamples/examplevotingapp_vote +
-docker run -d --name=result -p 5001:80 --link db:db dockersamples/examplevotingapp_result +
-docker run -d --name=worker --link db:db --link redis:redis dockersamples/examplevotingapp_worker+
 </code> </code>
  
-Par contre, Docker annonce le retrait éventuel de l'option **--lien** et indique qu'il vaudrait mieux utiliser des réseaux pour assurer la communication entre les conteneurs :+Consultez maintenant l'Ingress :
  
-"WarningThe --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environment variables between containersHoweveryou can use other mechanisms such as volumes to share environment variables between containers in a more controlled way."+<code> 
 +root@kubemaster:~# kubectl describe ingress my-ingress 
 +Name:             my-ingress 
 +Labels:           <none> 
 +Namespace:        default 
 +Address:           
 +Ingress Class:    <none> 
 +Default backend:  <default> 
 +Rules: 
 +  Host        Path  Backends 
 +  ----        ----  -------- 
 +  *            
 +              /somepath   clusteripservice:80 (192.168.150.39:80,192.168.150.40:80,192.168.239.38:80) 
 +Annotations:  <none> 
 +Events:       <none> 
 +</code>
  
-Cette application peut être mise en place sous docker swarm avec les commandes suivantes :+<WRAP center round important 60%> 
 +**Important** : Notez que les endpoints du service **clusteripservice** sont affichés dans la sortie de la commande. 
 +</WRAP> 
 + 
 +Editez maintenant le fichier **clusterip-service.yaml** et ajoutez une ligne **name** dans la section **ports** :
  
 <code> <code>
-docker@manager1:~$ docker node ls +root@kubemaster:~# vi clusterip-service.yaml  
-ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION +root@kubemaster:~# cat clusterip-service.yaml  
-vwshwppuaoze785gy12k0gh62 *   manager1            Ready               Active              Leader              18.09.3 +apiVersion: v1 
-t0rjtq76j35mbn44olp0t3yeq     worker1             Ready               Active                                  18.09.3 +kind: Service 
-udv7w988tepuba7pf6rb5k1o3     worker2             Ready               Active                                  18.09.3 +metadata: 
-uz2m26qe0hdf7lplb9a5m0ysv     worker3             Ready               Active                                  18.09.3 +  name: clusteripservice 
-sfig9atrbgzt41sjxhj95wfgu     worker4             Ready               Active                                  18.09.3 +spec: 
-56az1cupssf9uqx9h0yvbmydw     worker5             Ready               Active                                  18.09.3+  type: ClusterIP 
 +  selector: 
 +    app: clusteripexample 
 +  ports: 
 +    - name: myingress  
 +      protocol: TCP 
 +      port: 80 
 +      targetPort: 80
 </code> </code>
 +
 +<WRAP center round important 60%>
 +**Important** : Notez que le nom peut être n'importe quelle chaîne de caractères.
 +</WRAP>
 +
 +Appliquez la modification du clusteripservice :
  
 <code> <code>
-docker@manager1:~$ vi docker-stack.yml +root@kubemaster:~# kubectl apply -f clusterip-service.yaml  
-docker@manager1:~$ cat docker-stack.yml +Warningresource services/clusteripservice is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically
-version: "3" +service/clusteripservice configured 
-services:+</code>
  
-  redis: +<WRAP center round important 60%> 
-    imageredis:alpine +**Important** Notez que l'erreur est sans importance
-    ports: +</WRAP>
-      - "6379" +
-    networks: +
-      - frontend +
-    deploy: +
-      replicas: 1 +
-      update_config: +
-        parallelism:+
-        delay: 10s +
-      restart_policy: +
-        condition: on-failure +
-  db: +
-    image: postgres:9.4 +
-    volumes: +
-      - db-data:/var/lib/postgresql/data +
-    networks: +
-      - backend +
-    deploy: +
-      placement: +
-        constraints: [node.role == manager] +
-  vote: +
-    image: dockersamples/examplevotingapp_vote:before +
-    ports: +
-      - 5000:80 +
-    networks: +
-      - frontend +
-    depends_on: +
-      - redis +
-    deploy: +
-      replicas: 2 +
-      update_config: +
-        parallelism:+
-      restart_policy: +
-        condition: on-failure +
-  result: +
-    image: dockersamples/examplevotingapp_result:before +
-    ports: +
-      - 5001:80 +
-    networks: +
-      - backend +
-    depends_on: +
-      - db +
-    deploy: +
-      replicas: 1 +
-      update_config: +
-        parallelism:+
-        delay: 10s +
-      restart_policy: +
-        condition: on-failure+
  
-  worker: +Editez maintenant le fichier **myingress.yaml** et ajoutez une ligne **name** dans la section **ports** et en supprimant la ligne **number80** :
-    imagedockersamples/examplevotingapp_worker +
-    networks: +
-      - frontend +
-      - backend +
-    deploy: +
-      mode: replicated +
-      replicas: 1 +
-      labels: [APP=VOTING] +
-      restart_policy: +
-        condition: on-failure +
-        delay: 10s +
-        max_attempts:+
-        window: 120s +
-      placement: +
-        constraints: [node.role == manager]+
  
-  visualizer+<code> 
-    imagedockersamples/visualizer:stable +root@kubemaster:~# cat myingress.yaml  
-    ports+apiVersionnetworking.k8s.io/v1 
-      "8080:8080" +kindIngress 
-    stop_grace_period1m30s +metadata
-    volumes+  name: my-ingress 
-      - "/var/run/docker.sock:/var/run/docker.sock" +spec
-    deploy+  rules
-      placement+  - http: 
-        constraints[node.role == manager]+      paths
 +      - path: /somepath 
 +        pathTypePrefix 
 +        backend
 +          service: 
 +            name: clusteripservice 
 +            port: 
 +              name: myingress 
 +</code>
  
-networks: +Appliquez la modification de l'Ingress :
-  frontend: +
-  backend:+
  
-volumes: +<code> 
-  db-data:+root@kubemaster:~# kubectl apply -f myingress.yaml 
 +Warningresource ingresses/my-ingress is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically. 
 +ingress.networking.k8s.io/my-ingress configured
 </code> </code>
 +
 +<WRAP center round important 60%>
 +**Important** : Notez que l'erreur est sans importance.
 +</WRAP>
 +
 +Consultez maintenant l'Ingress :
  
 <code> <code>
-docker@manager1:~$ docker stack deploy -c docker-stack.yml app +root@kubemaster:~# kubectl describe ingress my-ingress 
-Creating network app_backend +Name:             my-ingress 
-Creating network app_frontend +Labels:           <none> 
-Creating network app_default +Namespace:        default 
-Creating service app_worker +Address:           
-Creating service app_visualizer +Ingress Class:    <none> 
-Creating service app_redis +Default backend:  <default> 
-Creating service app_db +Rules: 
-Creating service app_vote +  Host        Path  Backends 
-Creating service app_result+  ----        ----  -------- 
 +             
 +              /somepath   clusteripservice:myingress (192.168.150.39:80,192.168.150.40:80,192.168.239.38:80) 
 +Annotations:  <none> 
 +Events:       <none>
 </code> </code>
 +
 +<WRAP center round important 60%>
 +**Important** : Notez que l'Ingress peut toujours trouver le backend grâce à l'utilisation du nom **myingress**.
 +</WRAP>
 +
 +=====LAB #2 - Gestion d'une Architecture de Microservices=====
 +
 +Avant de continer, nettoyez le cluster :
 +
 +<code>
 +root@kubemaster:~# kubectl delete service clusteripservice
 +service "clusteripservice" deleted
 +
 +root@kubemaster:~# kubectl delete deployment deploymentclusterip
 +deployment.apps "deploymentclusterip" deleted
 +
 +root@kubemaster:~# kubectl delete ingress my-ingress
 +ingress.networking.k8s.io "my-ingress" deleted
 +
 +root@kubemaster:~# kubectl delete pod clusterippod
 +pod "clusterippod" deleted
 +</code>
 +
 +Vérifiez qu'il ne reste que le service par défaut **kubernetes** :
 +
 +<code>
 +root@kubemaster:~# kubectl get all
 +NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
 +service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   13d
 +</code>
 +
 +====2.1 - Présentation====
 +
 +Vous allez mettre en place une application simple, appelé **demo-voting-app** et développé par Docker, sous forme de microservices :
 +
 +{{ :elearning:workbooks:debian:6:avance:app.png?direct&400 |}}
 +
 +Dans cette application le conteneur **voting-app** permet de voter pour des **chats** ou des **chiens**. Cette application tourne sous Python et fournit une interace HTML :
 +
 +{{ :elearning:workbooks:debian:6:avance:kubernetes15.png?direct&800 |}}
 +
 +Lors de la vote, le résultat de celle-ci est stocké dans **Redis** dans une base de données en mémoire. Le résultat est ensuite passé au conteneur **Worker** qui tourne sous .NET et qui met à jour la base de données persistante dans le conteneur **db** qui tourne sous PostgreSQL.
 +
 +L'application **result-app** qui tourne sous NodeJS lit ensuite la table dans la base de données PostgreSQL et affiche le résultat sous forme HTML :
 +
 +{{ :elearning:workbooks:debian:6:avance:kubernetes16.png?direct&800 |}}
  
 ====2.2 - Création des Deployments==== ====2.2 - Création des Deployments====
Ligne 1147: Ligne 1389:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **voting-app** qui utilise le port 80 et qui est créé à partir de l'image **dockersamples/examplevotingapp_vote**. **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **voting-app** qui utilise le port 80 et qui est créé à partir de l'image **dockersamples/examplevotingapp_vote**.
 </WRAP> </WRAP>
Ligne 1184: Ligne 1426:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **redis** qui utilise le port 6379 et qui est créé à partir de l'image **redis**. **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **redis** qui utilise le port 6379 et qui est créé à partir de l'image **redis**.
 </WRAP> </WRAP>
Ligne 1219: Ligne 1461:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **worker-app** qui est créé à partir de l'image **dockersamples/examplevotingapp_worker**. **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **worker-app** qui est créé à partir de l'image **dockersamples/examplevotingapp_worker**.
 </WRAP> </WRAP>
Ligne 1261: Ligne 1503:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **postgres** qui utilise le port 5432 et qui est créé à partir de l'image **postgres:9.4**. **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **postgres** qui utilise le port 5432 et qui est créé à partir de l'image **postgres:9.4**.
 </WRAP> </WRAP>
Ligne 1298: Ligne 1540:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **result-app** qui utilise le port 80 et qui est créé à partir de l'image **dockersamples/examplevotingapp_result**. **Important** : Ce fichier décrit un Deployment. Notez que le Deployment crée **un** replica du POD spécifié par **template** contenant un conteneur dénommé **result-app** qui utilise le port 80 et qui est créé à partir de l'image **dockersamples/examplevotingapp_result**.
 </WRAP> </WRAP>
Ligne 1327: Ligne 1569:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Service **ClusterIP**. Notez que le Service expose le port **6379** sur tout POD ayant le nom **redis-pod**. **Important** : Ce fichier décrit un Service **ClusterIP**. Notez que le Service expose le port **6379** sur tout POD ayant le nom **redis-pod**.
 </WRAP> </WRAP>
Ligne 1354: Ligne 1596:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Service **ClusterIP**. Notez que le Service expose le port **5432** sur tout POD ayant le nom **postgres-pod**. **Important** : Ce fichier décrit un Service **ClusterIP**. Notez que le Service expose le port **5432** sur tout POD ayant le nom **postgres-pod**.
 </WRAP> </WRAP>
Ligne 1382: Ligne 1624:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Service **NodePort**. Notez que le Service expose le port **80** sur tout POD ayant le nom **voting-app-pod**. **Important** : Ce fichier décrit un Service **NodePort**. Notez que le Service expose le port **80** sur tout POD ayant le nom **voting-app-pod**.
 </WRAP> </WRAP>
Ligne 1410: Ligne 1652:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Service **NodePort**. Notez que le Service expose le port **80** sur tout POD ayant le nom **result-app-pod**. **Important** : Ce fichier décrit un Service **NodePort**. Notez que le Service expose le port **80** sur tout POD ayant le nom **result-app-pod**.
 </WRAP> </WRAP>
Ligne 1439: Ligne 1681:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez l'utilisation du caractère **.** qui indique tout fichier dans le répertoire courant. **Important** : Notez l'utilisation du caractère **.** qui indique tout fichier dans le répertoire courant.
 </WRAP> </WRAP>
Ligne 1599: Ligne 1841:
 {{ :elearning:workbooks:debian:6:avance:kubernetes19.png?direct&800 |}} {{ :elearning:workbooks:debian:6:avance:kubernetes19.png?direct&800 |}}
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez le POD qui a servi la page. **Important** : Notez le POD qui a servi la page.
 </WRAP> </WRAP>
Ligne 1607: Ligne 1849:
 {{ :elearning:workbooks:debian:6:avance:kubernetes20.png?direct&800 |}} {{ :elearning:workbooks:debian:6:avance:kubernetes20.png?direct&800 |}}
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Notez que le POD qui a servi la page a changé. **Important** : Notez que le POD qui a servi la page a changé.
 </WRAP> </WRAP>
Ligne 1637: Ligne 1879:
 </code> </code>
  
-<WRAP center round important>+<WRAP center round important 60%>
 **Important** : Ce fichier décrit un Service **LoadBalancer**. Notez que le Service expose le port **80** sur tout POD ayant le nom **voting-app-pod**. **Important** : Ce fichier décrit un Service **LoadBalancer**. Notez que le Service expose le port **80** sur tout POD ayant le nom **voting-app-pod**.
 </WRAP> </WRAP>
Ligne 1666: Ligne 1908:
  
 ---- ----
-Copyright © 2022 Hugh Norris+Copyright © 2024 Hugh Norris
  
Menu