Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| elearning:workbooks:kubernetes:k8s04 [2022/09/16 16:54] – admin | elearning:workbooks:kubernetes:k8s04 [2024/12/19 13:33] (Version actuelle) – admin | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| ~~PDF: | ~~PDF: | ||
| - | 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 |
| * 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' | * LAB #2 - Gestion de l' | ||
| * 2.1 - Présentation | * 2.1 - Présentation | ||
| Ligne 24: | Ligne 39: | ||
| * 2.4 - Déployer l' | * 2.4 - Déployer l' | ||
| * 2.5 - Scaling Up | * 2.5 - Scaling Up | ||
| + | |||
| + | =====Ressources===== | ||
| + | |||
| + | ====LAB #1==== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | ====LAB #2==== | ||
| + | |||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| =====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 |
| 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 |
| **Important** : La description technique et détaillée de l' | **Important** : La description technique et détaillée de l' | ||
| </ | </ | ||
| 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 |
| **Important** : Une étude comparative des extensions réseau pour Kubernetes peut être trouvée à la page : **[[https:// | **Important** : Une étude comparative des extensions réseau pour Kubernetes peut être trouvée à la page : **[[https:// | ||
| </ | </ | ||
| ====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 | ||
| </ | </ | ||
| + | |||
| + | ===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: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 127: | Ligne 173: | ||
| < | < | ||
| - | < | ||
| root@kubemaster: | root@kubemaster: | ||
| % Total % Received % Xferd Average Speed | % Total % Received % Xferd Average Speed | ||
| Ligne 151: | Ligne 196: | ||
| </ | </ | ||
| 100 | 100 | ||
| - | </ | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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. | ||
| </ | </ | ||
| Ligne 169: | Ligne 213: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que le nom d' | **Important** : Notez que le nom d' | ||
| </ | </ | ||
| Ligne 180: | Ligne 224: | ||
| | | ||
| 0 | 0 | ||
| - | < | + | ... |
| - | < | + | |
| - | < | + | |
| < | < | ||
| ... | ... | ||
| - | </ | ||
| - | < | ||
| - | < | ||
| - | <p>If you see this page, the nginx web server is successfully installed and | ||
| - | working. Further configuration is required.</ | ||
| - | |||
| - | < | ||
| - | <a href=" | ||
| - | Commercial support is available at | ||
| - | <a href=" | ||
| - | |||
| - | < | ||
| - | </ | ||
| - | </ | ||
| 100 | 100 | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son nom d' | **Important** : Notez que **busybox-dnstest** a pu contacter **nginx-dnstest** en utilisant son nom d' | ||
| </ | </ | ||
| ====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 (// | * un namespaceSelector peut sélectionner des nameSpaces en utilisant des Labels (// | ||
| * **ipBlock**, | * **ipBlock**, | ||
| - | * un IPBlock peut sélectionner des pods en utilisants | + | * un IPBlock peut sélectionner des pods en utilisant |
| - | 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 | + | * les ports spécifient |
| * le trafic réseau n'est accepté que dans le cas où les règles spécifiées par le Type **et** le port/ | * le trafic réseau n'est accepté que dans le cas où les règles spécifiées par le Type **et** le port/ | ||
| + | |||
| + | ===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: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 270: | Ligne 302: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 300: | Ligne 332: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 357: | Ligne 389: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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. | ||
| </ | </ | ||
| Ligne 380: | Ligne 412: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 400: | Ligne 432: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que la NetworkPolicy bloque la communication. Notez aussi l' | **Important** : Notez que la NetworkPolicy bloque la communication. Notez aussi l' | ||
| </ | </ | ||
| Ligne 444: | Ligne 476: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | **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**. | ||
| </ | </ | ||
| Ligne 476: | Ligne 508: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que la communication a réussi. | **Important** : Notez que la communication a réussi. | ||
| </ | </ | ||
| ====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 | mydaemonset-hmdhp | ||
| mydaemonset-kmf4z | mydaemonset-kmf4z | ||
| - | mystaticpod-kubenode1.ittraining.loc | ||
| nginx-dnstest | nginx-dnstest | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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/ | **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/ | ||
| </ | </ | ||
| Ligne 531: | Ligne 566: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 592: | Ligne 627: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Retenez donc qu'à ce stade il n'est pas possible d' | **Important** : Retenez donc qu'à ce stade il n'est pas possible d' | ||
| </ | </ | ||
| ===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: | ||
| {{ : | {{ : | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que dans ce cas l' | **Important** : Notez que dans ce cas l' | ||
| </ | </ | ||
| Ligne 617: | Ligne 654: | ||
| {{ : | {{ : | ||
| + | |||
| + | ==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: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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, | **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, | ||
| </ | </ | ||
| Ligne 676: | Ligne 715: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| 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' | Le Service **ClusterIP** permet de regrouper les PODs offrant le même service afin de faciliter la communication entre pods à l' | ||
| + | |||
| + | ==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: | root@kubemaster: | ||
| NAME | NAME | ||
| - | clusteripservice | + | clusteripservice |
| kubernetes | kubernetes | ||
| </ | </ | ||
| Ligne 818: | Ligne 861: | ||
| root@kubemaster: | root@kubemaster: | ||
| NAME | NAME | ||
| - | clusteripservice | + | clusteripservice |
| </ | </ | ||
| Ligne 880: | Ligne 923: | ||
| </ | </ | ||
| - | =====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 |
| < | < | ||
| Ligne 888: | Ligne 931: | ||
| service " | service " | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | service | + | deployment.extensions |
| + | |||
| + | root@kubemaster: | ||
| + | daemonset.apps " | ||
| + | |||
| + | root@kubemaster: | ||
| + | pod " | ||
| + | pod " | ||
| </ | </ | ||
| - | Supprimez | + | ===Présentation=== |
| + | |||
| + | Chaque service K8s est attribué un FQDN sous la forme : | ||
| + | |||
| + | < | ||
| + | nom-service.nom-namespace.svc.nom-cluster-domain.example | ||
| + | </ | ||
| + | |||
| + | 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' | ||
| + | * Les pods du même NameSpace que le service peuvent l' | ||
| + | |||
| + | ===Mise en Application=== | ||
| + | |||
| + | Visualisez le service | ||
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | deployment.extensions " | + | NAME |
| + | clusteripservice | ||
| </ | </ | ||
| + | |||
| + | ainsi que les pods présents dans le cluster : | ||
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | deployment.apps "deploymentclusterip" deleted | + | NAME |
| + | clusterippod | ||
| + | deploymentclusterip-7776dc8d55-bmfjl | ||
| + | deploymentclusterip-7776dc8d55-pgmcg | ||
| + | deploymentclusterip-7776dc8d55-qvphh | ||
| </ | </ | ||
| - | Supprimez | + | Visualisez |
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | daemonset.apps " | + | Server: |
| + | 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 | ||
| </ | </ | ||
| - | Supprimez les pods restants | + | <WRAP center round important 60%> |
| + | **Important** : Notez que le FQDN du service est **clusteripservice.default.svc.cluster.local**. | ||
| + | </ | ||
| + | |||
| + | Vérifiez la communication avec le service en utilisant son adresse IP : | ||
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | pod "busybox-dnstest" | + | % Total % Received % Xferd Average Speed |
| - | pod "clusterippod" | + | |
| - | pod "nginx-dnstest" | + | 100 |
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | body { | ||
| + | width: 35em; | ||
| + | margin: 0 auto; | ||
| + | font-family: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>If you see this page, the nginx web server is successfully installed and | ||
| + | working. Further configuration is required.</ | ||
| + | |||
| + | < | ||
| + | <a href="http:// | ||
| + | Commercial support is available at | ||
| + | <a href="http:// | ||
| + | |||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | --:--:-- --:--:-- 36000 | ||
| </ | </ | ||
| - | Connectez-vous à **kubenode1** et supprimez | + | Vérifiez la communication avec le service en utilisant son nom court : |
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | trainee@kubenode1' | + | % Total % Received % Xferd Average Speed |
| - | Linux kubenode1.ittraining.loc 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64 | + | Dload Upload |
| + | 100 | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | body { | ||
| + | width: 35em; | ||
| + | margin: 0 auto; | ||
| + | font-family: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>If you see this page, the nginx web server is successfully installed and | ||
| + | working. Further configuration is required.</ | ||
| - | The programs included with the Debian GNU/Linux system are free software; | + | < |
| - | the exact distribution terms for each program are described in the | + | <a href=" |
| - | individual files in /usr/share/doc/*/copyright. | + | Commercial support is available at |
| + | <a href=" | ||
| - | 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: | + | <WRAP center round important 60%> |
| - | Mot de passe : fenestros | + | **Important** |
| + | </ | ||
| - | root@kubenode1:~# rm -f / | + | Vérifiez la communication avec le service en utilisant son FQDN : |
| - | root@kubenode1:~# systemctl restart kubelet | + | < |
| + | root@kubemaster:~# kubectl exec clusterippod -- curl clusteripservice.default.svc.cluster.local | ||
| + | % Total % Received % Xferd Average Speed | ||
| + | | ||
| + | 100 | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | body { | ||
| + | width: 35em; | ||
| + | margin: 0 auto; | ||
| + | font-family: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>If you see this page, the nginx web server is successfully installed and | ||
| + | working. Further configuration is required.</ | ||
| - | root@kubenode1:~# exit | + | < |
| - | déconnexion | + | <a href=" |
| + | Commercial support is available at | ||
| + | <a href=" | ||
| - | trainee@kubenode1: | + | < |
| - | déconnexion | + | </ |
| - | Connection to kubenode1 closed. | + | </ |
| + | </ | ||
| - | root@kubemaster: | + | Vérifiez maintenant la communication avec le service en utilisant son nom court à partir du pod **npbusybox** dans le namespace **nptest** : |
| + | |||
| + | < | ||
| + | root@kubemaster: | ||
| + | curl: (6) Couldn' | ||
| + | command terminated with exit code 6 | ||
| </ | </ | ||
| - | Vérifiez qu'il ne reste que le service | + | <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. | ||
| + | </ | ||
| + | |||
| + | Vérifiez maintenant la communication avec le service en utilisant son FQDN à partir du pod **npbusybox** dans le namespace **nptest** : | ||
| < | < | ||
| - | root@kubemaster: | + | root@kubemaster: |
| - | NAME | + | % Total % Received % Xferd Average Speed |
| - | service/ | + | |
| + | 100 | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | body { | ||
| + | width: 35em; | ||
| + | margin: 0 auto; | ||
| + | font-family: | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | <p>If you see this page, the nginx web server is successfully installed and | ||
| + | working. Further configuration is required.</ | ||
| + | |||
| + | < | ||
| + | <a href=" | ||
| + | Commercial support is available at | ||
| + | <a href=" | ||
| + | |||
| + | < | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| - | ====2.1 - Présentation==== | + | <WRAP center round important 60%> |
| + | **Important** : Notez que la communication a réussi grâce à l' | ||
| + | </ | ||
| - | Vous allez mettre en place une application simple, appelé **demo-voting-app** et développé par Docker, sous forme de microservices : | + | ====1.6 |
| - | {{ : | + | ====Présentation==== |
| - | Dans cette application le conteneur **voting-app** permet | + | Un Ingress est un objet k8s qui gère l' |
| - | {{ : | + | * 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émoire. Le résultat est ensuite passé au conteneur | + | L' |
| - | L' | + | ====Mise en Application ==== |
| - | {{ :elearning: | + | Commencez par créer le fichier **myingress.yaml** |
| - | Cette application peut être mise en place sous docker avec les commandes suivantes | + | < |
| + | root@kubemaster: | ||
| + | root@kubemaster: | ||
| + | apiVersion: networking.k8s.io/ | ||
| + | kind: Ingress | ||
| + | metadata: | ||
| + | name: my-ingress | ||
| + | spec: | ||
| + | rules: | ||
| + | - http: | ||
| + | paths: | ||
| + | - path: /somepath | ||
| + | pathType: Prefix | ||
| + | backend: | ||
| + | service: | ||
| + | name: clusteripservice | ||
| + | port: | ||
| + | number: 80 | ||
| + | </ | ||
| + | |||
| + | <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://< | ||
| + | </ | ||
| + | |||
| + | Créez maintenant l' | ||
| < | < | ||
| - | docker run -d --name=redis redis | + | root@kubemaster: |
| - | 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/ | + | |
| - | docker run -d --name=worker --link db:db --link redis:redis dockersamples/ | + | |
| </ | </ | ||
| - | 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 |
| - | " | + | < |
| + | root@kubemaster:~# kubectl describe ingress my-ingress | ||
| + | Name: my-ingress | ||
| + | Labels: | ||
| + | Namespace: | ||
| + | Address: | ||
| + | Ingress Class: | ||
| + | Default backend: | ||
| + | Rules: | ||
| + | Host Path Backends | ||
| + | | ||
| + | * | ||
| + | / | ||
| + | Annotations: | ||
| + | Events: | ||
| + | </ | ||
| - | 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. | ||
| + | </ | ||
| + | |||
| + | Editez maintenant le fichier **clusterip-service.yaml** et ajoutez une ligne **name** dans la section **ports** | ||
| < | < | ||
| - | docker@manager1:~$ docker node ls | + | root@kubemaster:~# vi clusterip-service.yaml |
| - | ID HOSTNAME | + | root@kubemaster: |
| - | vwshwppuaoze785gy12k0gh62 * | + | apiVersion: v1 |
| - | t0rjtq76j35mbn44olp0t3yeq | + | kind: Service |
| - | udv7w988tepuba7pf6rb5k1o3 | + | metadata: |
| - | uz2m26qe0hdf7lplb9a5m0ysv | + | name: clusteripservice |
| - | sfig9atrbgzt41sjxhj95wfgu | + | spec: |
| - | 56az1cupssf9uqx9h0yvbmydw | + | type: ClusterIP |
| + | selector: | ||
| + | app: clusteripexample | ||
| + | ports: | ||
| + | - name: myingress | ||
| + | protocol: TCP | ||
| + | port: 80 | ||
| + | targetPort: 80 | ||
| </ | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | **Important** : Notez que le nom peut être n' | ||
| + | </ | ||
| + | |||
| + | Appliquez la modification du clusteripservice : | ||
| < | < | ||
| - | docker@manager1:~$ vi docker-stack.yml | + | root@kubemaster:~# kubectl apply -f clusterip-service.yaml |
| - | docker@manager1:~$ cat docker-stack.yml | + | Warning: resource services/ |
| - | version: " | + | service/ |
| - | services: | + | </ |
| - | redis: | + | <WRAP center round important 60%> |
| - | image: redis: | + | **Important** |
| - | ports: | + | </WRAP> |
| - | - " | + | |
| - | networks: | + | |
| - | - frontend | + | |
| - | deploy: | + | |
| - | replicas: 1 | + | |
| - | update_config: | + | |
| - | parallelism: | + | |
| - | delay: 10s | + | |
| - | restart_policy: | + | |
| - | condition: on-failure | + | |
| - | db: | + | |
| - | image: postgres:9.4 | + | |
| - | | + | |
| - | - db-data:/var/ | + | |
| - | networks: | + | |
| - | - backend | + | |
| - | deploy: | + | |
| - | placement: | + | |
| - | constraints: | + | |
| - | vote: | + | |
| - | image: dockersamples/ | + | |
| - | ports: | + | |
| - | - 5000:80 | + | |
| - | networks: | + | |
| - | - frontend | + | |
| - | depends_on: | + | |
| - | - redis | + | |
| - | deploy: | + | |
| - | replicas: 2 | + | |
| - | update_config: | + | |
| - | parallelism: | + | |
| - | restart_policy: | + | |
| - | condition: on-failure | + | |
| - | result: | + | |
| - | image: dockersamples/ | + | |
| - | 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 **number: 80** : |
| - | image: dockersamples/ | + | |
| - | networks: | + | |
| - | - frontend | + | |
| - | - backend | + | |
| - | deploy: | + | |
| - | mode: replicated | + | |
| - | replicas: 1 | + | |
| - | labels: [APP=VOTING] | + | |
| - | restart_policy: | + | |
| - | condition: on-failure | + | |
| - | delay: 10s | + | |
| - | max_attempts: | + | |
| - | window: 120s | + | |
| - | placement: | + | |
| - | constraints: | + | |
| - | visualizer: | + | < |
| - | image: dockersamples/visualizer:stable | + | root@kubemaster:~# cat myingress.yaml |
| - | ports: | + | apiVersion: networking.k8s.io/v1 |
| - | - "8080:8080" | + | kind: Ingress |
| - | | + | metadata: |
| - | | + | name: my-ingress |
| - | - "/ | + | spec: |
| - | | + | rules: |
| - | | + | - http: |
| - | | + | paths: |
| + | - path: /somepath | ||
| + | | ||
| + | | ||
| + | | ||
| + | name: clusteripservice | ||
| + | port: | ||
| + | name: myingress | ||
| + | </ | ||
| - | networks: | + | Appliquez la modification de l' |
| - | frontend: | + | |
| - | backend: | + | |
| - | volumes: | + | < |
| - | db-data: | + | root@kubemaster: |
| + | Warning: resource ingresses/ | ||
| + | ingress.networking.k8s.io/ | ||
| </ | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | **Important** : Notez que l' | ||
| + | </ | ||
| + | |||
| + | Consultez maintenant l' | ||
| < | < | ||
| - | docker@manager1:~$ docker stack deploy | + | root@kubemaster:~# kubectl describe ingress my-ingress |
| - | Creating network app_backend | + | Name: my-ingress |
| - | Creating network app_frontend | + | Labels: |
| - | Creating network app_default | + | Namespace: |
| - | Creating service app_worker | + | Address: |
| - | Creating service app_visualizer | + | Ingress Class: |
| - | Creating service app_redis | + | Default backend: |
| - | Creating service app_db | + | Rules: |
| - | Creating service app_vote | + | |
| - | Creating service app_result | + | |
| + | | ||
| + | / | ||
| + | Annotations: | ||
| + | Events: | ||
| </ | </ | ||
| + | |||
| + | <WRAP center round important 60%> | ||
| + | **Important** : Notez que l' | ||
| + | </ | ||
| + | |||
| + | =====LAB #2 - Gestion d'une Architecture de Microservices===== | ||
| + | |||
| + | Avant de continer, nettoyez le cluster : | ||
| + | |||
| + | < | ||
| + | root@kubemaster: | ||
| + | service " | ||
| + | |||
| + | root@kubemaster: | ||
| + | deployment.apps " | ||
| + | |||
| + | root@kubemaster: | ||
| + | ingress.networking.k8s.io " | ||
| + | |||
| + | root@kubemaster: | ||
| + | pod " | ||
| + | </ | ||
| + | |||
| + | Vérifiez qu'il ne reste que le service par défaut **kubernetes** : | ||
| + | |||
| + | < | ||
| + | root@kubemaster: | ||
| + | NAME | ||
| + | service/ | ||
| + | </ | ||
| + | |||
| + | ====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 : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 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 : | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | 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' | ||
| + | |||
| + | {{ : | ||
| ====2.2 - Création des Deployments==== | ====2.2 - Création des Deployments==== | ||
| Ligne 1147: | Ligne 1389: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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' | **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' | ||
| </ | </ | ||
| Ligne 1184: | Ligne 1426: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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' | **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' | ||
| </ | </ | ||
| Ligne 1219: | Ligne 1461: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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' | **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' | ||
| </ | </ | ||
| Ligne 1261: | Ligne 1503: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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' | **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' | ||
| </ | </ | ||
| Ligne 1298: | Ligne 1540: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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' | **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' | ||
| </ | </ | ||
| Ligne 1327: | Ligne 1569: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 1354: | Ligne 1596: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 1382: | Ligne 1624: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 1410: | Ligne 1652: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 1439: | Ligne 1681: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez l' | **Important** : Notez l' | ||
| </ | </ | ||
| Ligne 1599: | Ligne 1841: | ||
| {{ : | {{ : | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez le POD qui a servi la page. | **Important** : Notez le POD qui a servi la page. | ||
| </ | </ | ||
| Ligne 1607: | Ligne 1849: | ||
| {{ : | {{ : | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **Important** : Notez que le POD qui a servi la page a changé. | **Important** : Notez que le POD qui a servi la page a changé. | ||
| </ | </ | ||
| Ligne 1637: | Ligne 1879: | ||
| </ | </ | ||
| - | <WRAP center round important> | + | <WRAP center round important |
| **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**. | ||
| </ | </ | ||
| Ligne 1666: | Ligne 1908: | ||
| ---- | ---- | ||
| - | Copyright © 2022 Hugh Norris | + | Copyright © 2024 Hugh Norris |