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 17:01] – 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 152: | Ligne 198: | ||
</ | </ | ||
- | <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 167: | Ligne 213: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez que le nom d' | **Important** : Notez que le nom d' | ||
</ | </ | ||
Ligne 184: | Ligne 230: | ||
</ | </ | ||
- | <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 208: | 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 230: | Ligne 280: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 252: | Ligne 302: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 282: | Ligne 332: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 339: | 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 362: | Ligne 412: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 382: | 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 426: | 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 458: | 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 474: | 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 493: | 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 513: | Ligne 566: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 574: | 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 592: | 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 599: | Ligne 654: | ||
{{ : | {{ : | ||
+ | |||
+ | ==Mise en Application== | ||
Créez donc le fichier YAML **service-definition.yaml** : | Créez donc le fichier YAML **service-definition.yaml** : | ||
Ligne 621: | 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 658: | 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 728: | 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 791: | Ligne 852: | ||
root@kubemaster: | root@kubemaster: | ||
NAME | NAME | ||
- | clusteripservice | + | clusteripservice |
kubernetes | kubernetes | ||
</ | </ | ||
Ligne 800: | Ligne 861: | ||
root@kubemaster: | root@kubemaster: | ||
NAME | NAME | ||
- | clusteripservice | + | clusteripservice |
</ | </ | ||
Ligne 862: | 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 870: | 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 1129: | 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 1166: | 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 1201: | 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 1243: | 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 1280: | 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 1309: | 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 1336: | 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 1364: | 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 1392: | 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 1421: | Ligne 1681: | ||
</ | </ | ||
- | <WRAP center round important> | + | <WRAP center round important |
**Important** : Notez l' | **Important** : Notez l' | ||
</ | </ | ||
Ligne 1581: | 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 1589: | 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 1619: | 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 1648: | Ligne 1908: | ||
---- | ---- | ||
- | Copyright © 2022 Hugh Norris | + | Copyright © 2024 Hugh Norris |