{"id":7001,"date":"2024-07-09T10:10:43","date_gmt":"2024-07-09T10:10:43","guid":{"rendered":"https:\/\/hengowebsite.luong.fr\/?page_id=7001"},"modified":"2024-10-16T05:41:09","modified_gmt":"2024-10-16T05:41:09","slug":"expert-kubernetes-de-yanning-ferre","status":"publish","type":"page","link":"https:\/\/hengowebsite.luong.fr\/?page_id=7001","title":{"rendered":"Expert Kubernetes de Yanning FERRE"},"content":{"rendered":"<h1 style=\"text-align: right;\">Avant-propos<\/h1>\n<h2><strong>Qu&rsquo;est-ce qu&rsquo;un container?<\/strong><\/h2>\n<h6>Au Niveau du syst\u00e8me d&rsquo;exploitation, un container va regrouper un groupe de ressources mis \u00e0 disposition d&rsquo;un ensemble de process.<\/h6>\n<ul>\n<li>\n<h6>un syst\u00e8me de fichiers,<\/h6>\n<\/li>\n<li>\n<h6>des allocations de ressources syst\u00e8me (CPU, m\u00e9moire , capacit\u00e9 d&rsquo;entr\u00e9e\/sortie)<\/h6>\n<\/li>\n<li>\n<h6>un espace d&rsquo;isolation de process<\/h6>\n<\/li>\n<li>\n<h6>une ou plusieurs interfaces r\u00e9seau<\/h6>\n<\/li>\n<li>\n<h6>etc &#8230;<\/h6>\n<\/li>\n<\/ul>\n<h2>Pourquoi utiliser des containers<\/h2>\n<ul>\n<li>\n<h5>Pour illustrer ce probl\u00e8me, imaginez les programmes ARTHUR et BERTRAND d\u00e9pendant de la librairie libLili en version v1. Dans un premier temps, les choses devraient bien se passer. En revanche, dans une version du programme de BERTRAND, la version de la d\u00e9pendance libLili est pass\u00e9e de version v1 \u00e0 la version v2. Probl\u00e8me : ARTHUR est incompatible avec libLili en version v2.<\/h5>\n<\/li>\n<li>\n<h5>Les containers proposent de r\u00e9pondre \u00e0 ce type de probl\u00e8me de mani\u00e8re tr\u00e8s \u00e9l\u00e9gante en faisant de sorte que toutes les d\u00e9pendantes d&rsquo;un programme soient embarqu\u00e9es dans l&rsquo;image contenant l&rsquo;image \u00e0 lancer.Ainsi chaque container se retrouve isol\u00e9 avec ses propres d\u00e9pendances sans risquer d&rsquo;interf\u00e9rer avec les autres containers. La r\u00e9alisation du m\u00eame d\u00e9coupage \u00e0 l&rsquo;aide de machines virtuelles r\u00e9clamait beaucoup plus de ressources.<\/h5>\n<\/li>\n<\/ul>\n<h2>Probl\u00e8mes introduits avec les containers<\/h2>\n<ul>\n<li>\n<h5>comment mettre \u00e0 jour les containers<\/h5>\n<\/li>\n<li>\n<h5>comment faire la surveillance des containers,<\/h5>\n<\/li>\n<li>\n<h5>comment absorber les pics de charges,<\/h5>\n<\/li>\n<li>\n<h5>comment mettre en oeuvre de la persistance des donn\u00e9es,<\/h5>\n<\/li>\n<li>\n<h5>comment r\u00e9aliser des mises \u00e0 jour sans interruption de service,<\/h5>\n<\/li>\n<li>\n<h5>comment \u00e9tendre la capacit\u00e9 de traitement du cluster<\/h5>\n<\/li>\n<li>\n<h5>comment exposer les applications \u00e0 des utilisateurs.<\/h5>\n<\/li>\n<\/ul>\n<h2>A quoi va servir Kubernetes ?<\/h2>\n<h4>La gestion des containers \u00e0 Docker (ou un \u00e9quivalent)<\/h4>\n<ul>\n<li>\n<h5>Gestion de la mont\u00e9e en charge applicative (avec les pods)<\/h5>\n<\/li>\n<li>\n<h5>Gestion de la mont\u00e9e en charge syst\u00e8me ( avec les noeuds ou nodes)<\/h5>\n<\/li>\n<li>\n<h5>Surveillance de l&rsquo;\u00e9tat des containers.<\/h5>\n<\/li>\n<li>\n<h5>Gestion de cycles de vie des containers.<\/h5>\n<\/li>\n<\/ul>\n<h4>Les deux notions \u00e9voqu\u00e9es (pods et nodes) sont tr\u00e8s importantes dans Kubernetes :<\/h4>\n<ul>\n<li>\n<h5>Les pods vont repr\u00e9senter la plus petite unit\u00e9 de travail dans Kubernetes.<\/h5>\n<\/li>\n<li>\n<h5>Les noeuds (ou nodes) vont repr\u00e9senter les machines faisant partie du cluster Kubernetes.<\/h5>\n<\/li>\n<\/ul>\n<h4>Un pod est g\u00e9n\u00e9ralement constitu\u00e9 d&rsquo;un ou plusieurs containers ( g\u00e9n\u00e9ralement un seul) :<\/h4>\n<ul>\n<li>\n<h5>La surveillance de la bonne sant\u00e9 du\/des containers.<\/h5>\n<\/li>\n<li>\n<h5>La configuration et\/ou les variables d&rsquo;environnement.<\/h5>\n<\/li>\n<li>\n<h5>L&#8217;emplacement des volumes persistants.<\/h5>\n<\/li>\n<\/ul>\n<h4>En cas de d\u00e9faillance d\u00e9tect\u00e9e sur un container, Kubernetes se charge automatiquement d&rsquo;en d\u00e9marrer un nouveau et d&rsquo;arr\u00eater l&rsquo;ancien.<\/h4>\n<h4>M\u00eame chose lorsqu&rsquo;une charge importante est d\u00e9tect\u00e9e : Kubernetes proc\u00e9dera \u00e0 la cr\u00e9ation de nouveaux pods.<\/h4>\n<p>&nbsp;<\/p>\n<h1 style=\"text-align: right;\">Chapitre 1&nbsp;<\/h1>\n<h1 style=\"text-align: right;\">Introduction<\/h1>\n<p>&nbsp;<\/p>\n<h2>Cibles et Objectifs de l&rsquo;ouvrage : Connaissance aussi bien en administration syst\u00e8mes qu&rsquo;en d\u00e9veloppement.<\/h2>\n<ul>\n<li>\n<h5>Notions sur l&rsquo;administration syst\u00e8me Linux (Installation de paquets, t\u00e9l\u00e9chargement de binaires, utilisation de sudo)<\/h5>\n<\/li>\n<li>\n<h5>Connaissance minimale d&rsquo;un fournisseur d&rsquo;informatique dans les clouds (Azure, Google , AWS, OVH ou IONOS)<\/h5>\n<\/li>\n<li>\n<h5>Principe de fonctionnement des couches r\u00e9seaux\/HTTP (DNS,r\u00e9partiteur de charge, proxy inverse)<\/h5>\n<\/li>\n<li>\n<h5>Notion de l&rsquo;utilisation de Git (Cloner un d\u00e9p\u00f4t de code source)<\/h5>\n<\/li>\n<\/ul>\n<h2>Ressources documentaires<\/h2>\n<ul>\n<li>\n<h5>D\u00e9ploiement d&rsquo;application WEB.<\/h5>\n<\/li>\n<li>\n<h5>D\u00e9ploiement de base de donn\u00e9es.<\/h5>\n<\/li>\n<li>\n<h5>Mise en place de surveillance avec Prometheus.<\/h5>\n<\/li>\n<\/ul>\n<h5>Code source de ces exemples : <a href=\"https:\/\/github.com\/EditionsENI\/kubernetes\">https:\/\/github.com\/EditionsENI\/kubernetes<\/a><\/h5>\n<h5>Ressources documentaires du projet des derni\u00e8res \u00e9volutions : <a href=\"https:\/\/kubernetes.io\/fr\/docs\/home\">https:\/\/kubernetes.io\/fr\/docs\/home<\/a><\/h5>\n<h5>Racine de d\u00e9p\u00f4ts GitHub du projet :&nbsp; <a href=\"https:\/\/github.com\/kubernetes\">https:\/\/github.com\/kubernetes<\/a><\/h5>\n<p>&nbsp;<\/p>\n<h2>R\u00e9cup\u00e9ration des fichiers d&rsquo;exemples<\/h2>\n<ul>\n<li>\n<h5>D\u00e9p\u00f4ts GitHup du livre :&nbsp; <a href=\"https:\/\/githup.com\/EditionsENI\/kubernetes\">https:\/\/githup.com\/EditionsENI\/kubernetes<\/a><\/h5>\n<\/li>\n<li>\n<h5>R\u00e9cup\u00e9ration une copie des fichiers d&rsquo;exemples en local :&nbsp; <a href=\"https:\/\/github.com\/EditionsENI\/kubernetes.git\">https:\/\/github.com\/EditionsENI\/kubernetes.git<\/a><\/h5>\n<\/li>\n<\/ul>\n<h2>Pr\u00e9sentation g\u00e9n\u00e9rale<\/h2>\n<ul>\n<li>\n<h5>Exemples \u00e9labor\u00e9s sur une machine Linux Ubuntu 20.04 LTS<\/h5>\n<\/li>\n<\/ul>\n<h2>Utilisation de Kubernetes<\/h2>\n<ul>\n<li>\n<h5>Tableau de bord et ligne de commande : la notion de pod , de d\u00e9ploiement, de service ainsi qu le cycle de vie d&rsquo;un pod.<\/h5>\n<\/li>\n<li>\n<h5>Persistance de donn\u00e9es : MySQL\/MariaDB.<\/h5>\n<\/li>\n<li>\n<h5>Gestion des briques internes de Kubernetes, Helm &#8211; Gestionnaire de packages et Contextes et outils tiers Kubernetes permettent de d\u00e9couvrir les briques internes de Kubernetes, le gestionnaire de paquets Helm et enfin quelques outils d&rsquo;administration.<\/h5>\n<\/li>\n<\/ul>\n<h2>Extention du Cluster Kubernetes et notions avanc\u00e9es<\/h2>\n<ul>\n<li>\n<h5>Polices r\u00e9seau et Maillage de services avec Istio , s\u00e9curisation des acc\u00e8s internes du cluster ainsi qu&rsquo;au chiffrement des communications entre services.<\/h5>\n<\/li>\n<li>\n<h5>Mont\u00e9es en charge automatique, mont\u00e9e en charge d&rsquo;application , surveillance \u00e0 l&rsquo;aide de Prometheus et Centralisation des journaux d&rsquo;activit\u00e9 d&rsquo;application et d&rsquo;activit\u00e9s.<\/h5>\n<\/li>\n<li>\n<h5>Restriction et d\u00e9l\u00e9gation d&rsquo;acc\u00e8s avec le m\u00e9canisme d&rsquo;authentification et d&rsquo;autorisation des administrateurs Kubernetes ainsi que la mise en place de restrictions sur la consommation de ressources.<\/h5>\n<\/li>\n<\/ul>\n<h2>D\u00e9ploiement et int\u00e9gration continue<\/h2>\n<h5>Application avec Helm :<\/h5>\n<ul>\n<li>\n<h5>Comment cr\u00e9er une image de container.<\/h5>\n<\/li>\n<li>\n<h5>Comment mettre \u00e0 jour une image automatiquement.<\/h5>\n<\/li>\n<li>\n<h5>Comment d\u00e9ployer une application \u00e0 l&rsquo;aide de Helm<\/h5>\n<\/li>\n<\/ul>\n<h5 style=\"text-align: right;\">Chapitre 2<\/h5>\n<h1 style=\"text-align: right;\">Installation de l&rsquo;environnement<\/h1>\n<h1 style=\"text-align: right;\">Kubernetes<\/h1>\n<h1>Mise en place de la commande kuberctl<\/h1>\n<p>&nbsp;<\/p>\n<h5>Pr\u00e9requis d&rsquo;Installation Docker<\/h5>\n<h5 class=\"notranslate\"><code>### INSTALL DOCKER<\/code><code><\/code>&nbsp;<span style=\"color: #ff0000;\"> (\/shareProd\/1and1\/local\/appli\/Kubernetes\/scripts\/1-PrerequisDocker.ksh)<\/span><\/h5>\n<h5 class=\"notranslate\"><code>sudo apt-get update<br \/>\n<\/code><\/h5>\n<h5 class=\"notranslate\"><code>    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common<br \/>\nsudo mkdir -p \/etc\/apt\/keyrings<br \/>\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg<br \/>\necho \"deb [arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list &gt; \/dev\/null<\/code><\/h5>\n<h5>sudo apt-get update ; clear<br \/>\nsudo apt-get install -y docker-ce<code><\/code><\/h5>\n<h5>sudo wget https:\/\/raw.githubusercontent.com\/lerndevops\/labs\/master\/kubernetes\/0-install\/daemon.json -P \/etc\/docker<br \/>\nsudo systemctl restart docker.service<br \/>\nsudo service docker status<code><\/code><\/h5>\n<h6>######################################################################<\/h6>\n<p>Pour installer Docker sur Ubuntu 20.04, vous pouvez suivre les \u00e9tapes ci-dessous :<br \/>\n### \u00c9tape 1 : Mettre \u00e0 jour les paquets existants<br \/>\nOuvrez un terminal et ex\u00e9cutez la commande suivante pour mettre \u00e0 jour l&rsquo;index des paquets :<br \/>\nbash<br \/>\nsudo apt update<br \/>\nsudo apt upgrade<\/p>\n<p>### \u00c9tape 2 : Installer les d\u00e9pendances<br \/>\nInstallez les paquets n\u00e9cessaires pour permettre \u00e0 apt de g\u00e9rer les paquets via HTTPS :<br \/>\nbash<br \/>\nsudo apt install apt-transport-https ca-certificates curl software-properties-common<\/p>\n<p>### \u00c9tape 3 : Ajouter la cl\u00e9 GPG officielle de Docker<br \/>\nAjoutez la cl\u00e9 GPG officielle de Docker \u00e0 votre liste de cl\u00e9s :<br \/>\nbash<br \/>\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add &#8211;<\/p>\n<p>### \u00c9tape 4 : Ajouter le d\u00e9p\u00f4t de Docker<br \/>\nAjoutez le d\u00e9p\u00f4t Docker \u00e0 votre liste de d\u00e9p\u00f4ts APT :<br \/>\nbash<br \/>\nsudo add-apt-repository \u00ab\u00a0deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\u00a0\u00bb<\/p>\n<p>### \u00c9tape 5 : Mettre \u00e0 jour \u00e0 nouveau les paquets<br \/>\nApr\u00e8s avoir ajout\u00e9 le d\u00e9p\u00f4t, mettez \u00e0 jour l&rsquo;index des paquets :<br \/>\nbash<br \/>\nsudo apt update<\/p>\n<p>### \u00c9tape 6 : Installer Docker<br \/>\nInstallez Docker avec la commande suivante :<br \/>\nbash<br \/>\nsudo apt install docker-ce<\/p>\n<p>### \u00c9tape 7 : V\u00e9rifier l&rsquo;installation de Docker<br \/>\nV\u00e9rifiez si Docker est bien install\u00e9 et fonctionne :<br \/>\nbash<br \/>\nsudo systemctl status docker<\/p>\n<p>### \u00c9tape 8 : Ex\u00e9cuter Docker sans sudo (optionnel)<br \/>\nSi vous souhaitez ex\u00e9cuter Docker sans pr\u00e9fixe sudo, ajoutez votre utilisateur au groupe Docker :<br \/>\nbash<br \/>\nsudo usermod -aG docker $USER<\/p>\n<p>D\u00e9connectez-vous et reconnectez-vous pour appliquer les modifications.<br \/>\n### \u00c9tape 9 : Tester l&rsquo;installation<br \/>\nVous pouvez tester votre installation de Docker en ex\u00e9cutant le conteneur hello-world :<br \/>\nbash<br \/>\ndocker run hello-world<\/p>\n<p>Cela devrait afficher un message confirmant que Docker fonctionne correctement.<br \/>\nVoil\u00e0, Docker est maintenant install\u00e9 et pr\u00eat \u00e0 \u00eatre utilis\u00e9 sur votre syst\u00e8me&nbsp;Ubuntu&nbsp;20.04&nbsp;!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>####################################################################<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h5>L&#8217;emplacement de r\u00e9cup\u00e9ration des instructions d&rsquo;installation :&nbsp; <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/#install-kubectl\">https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-kubectl\/#install-kubectl<\/a><\/h5>\n<\/li>\n<\/ul>\n<h2>Installation sous Debian\/Ubuntu<\/h2>\n<h4><span style=\"color: #ff0000;\">( \/shareProd\/1and1\/local\/appli\/Kubernetes\/scripts\/2-Installation_du_package_kubectl.ksh)<\/span><\/h4>\n<ul>\n<li>\n<h3>Ajout des Cl\u00e9s<\/h3>\n<\/li>\n<\/ul>\n<h5>$ wget -O &#8211; https:\/\/packages.cloud.google.com\/apt\/doc\/apt-key.gpg | sudo apt-key add &#8211;<\/h5>\n<ul>\n<li>\n<h3>D\u00e9claration des sources kubernetes<\/h3>\n<\/li>\n<\/ul>\n<h5>$ echo \u00ab\u00a0deb https:\/\/pat.kubernetes.io\/ kubernetes-xenial main\u00a0\u00bb | sudo tee -a \/etc\/apt\/sources.list.d\/kubernetes.list<\/h5>\n<ul>\n<li>\n<h3>Mise \u00e0 jour des sources de package<\/h3>\n<ul>\n<li>\n<h3>Installation du package kubectl<\/h3>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<div class=\"s-prose js-post-body\">\n<h5>I cleared kubectl from <code>\/usr\/local\/bin<\/code><\/h5>\n<h5>and also from <code>\/home\/$USER\/.local\/bin<\/code><\/h5>\n<h5>And run the commands below:<\/h5>\n<h5 class=\"lang-bash s-code-block\"><strong><code class=\"hljs language-bash\" data-highlighted=\"yes\"># curl -LO <span class=\"hljs-string\">\"https:\/\/dl.k8s.io\/release\/v1.24.7\/bin\/linux\/amd64\/kubectl\"<\/span><\/code><\/strong><\/h5>\n<h5 class=\"lang-bash s-code-block\"><strong><code class=\"hljs language-bash\" data-highlighted=\"yes\"># curl -LO <span class=\"hljs-string\">\"https:\/\/dl.k8s.io\/v1.24.7\/bin\/linux\/amd64\/kubectl.sha256\"<\/span><br \/>\n<\/code><\/strong><\/h5>\n<h5 class=\"lang-bash s-code-block\"><strong><code class=\"hljs language-bash\" data-highlighted=\"yes\"><span class=\"hljs-built_in\"># echo<\/span> <span class=\"hljs-string\">\"<span class=\"hljs-subst\">$(cat kubectl.sha256)<\/span>  kubectl\"<\/span> | <span class=\"hljs-built_in\">sha256sum<\/span> --check<br \/>\n# sudo install -o root -g root -m 0755 kubectl \/usr\/local\/bin\/kubectl<br \/>\n<\/code><\/strong><\/h5>\n<h5 class=\"lang-bash s-code-block\"><strong><code class=\"hljs language-bash\" data-highlighted=\"yes\"># sudo install -o root -g root -m 0755 kubectl \/home\/<span class=\"hljs-variable\">$USER<\/span>\/.local\/bin\/kubectl<br \/>\n<\/code><\/strong><\/h5>\n<\/div>\n<\/li>\n<li>\n<h3>V\u00e9rification de l&rsquo;installation<\/h3>\n<\/li>\n<\/ul>\n<h5>$ kubctl version &#8211;client<\/h5>\n<ul>\n<li>\n<h3>Autocompl\u00e9tion sur kubectl<\/h3>\n<\/li>\n<\/ul>\n<h5>&#8211; Ajouter cette instruction suivante dans le fichier profile :&nbsp; source &lt;(kubectl completion bash)<\/h5>\n<ul>\n<li>\n<h4>Mise en place d&rsquo;un alias ( ~\/.bashrc)<\/h4>\n<\/li>\n<\/ul>\n<h5>$ alias k=kubectl<br \/>\n$ complete -F __start_kubectl k<\/h5>\n<h1>Pourquoi faire appel \u00e0 Minikube ?<\/h1>\n<h5>Minikube est un projet qui a pour but de fournir un environnement bac \u00e0 sable \u00e0 un utlisateur pour exp\u00e9rimenter le fonctionnement de kubernetes.<\/h5>\n<h2>T\u00e9l\u00e9chargement et installation de Minikube<\/h2>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\">(\/shareProd\/1and1\/local\/appli\/Kubernetes\/scripts\/3-telechargement-installation-Minikube.ksh)<\/span><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h3>T\u00e9l\u00e9chargement de Minikube<\/h3>\n<\/li>\n<\/ul>\n<h5>$ wget https:\/\/storage.googleapis.com\/minikube\/releases\/latest\/minikube-linux-amd64<\/h5>\n<ul>\n<li>\n<h3>D\u00e9placement du fichier Minikube dans \/usr\/local\/bin<\/h3>\n<\/li>\n<\/ul>\n<h5>$ sudo mv minikube-linux-amd64&nbsp; \/usr\/local\/bin\/minikube<\/h5>\n<p><strong>$sudo chmod +x \/usr\/local\/bin\/minikube<\/strong><\/p>\n<ul>\n<li>\n<h3>V\u00e9rification de l&rsquo;installation de Minikube<\/h3>\n<\/li>\n<\/ul>\n<h5>$ minikube version<\/h5>\n<ul>\n<li>\n<h3>Mise en place de l&rsquo;autocompl\u00e9tion<\/h3>\n<\/li>\n<\/ul>\n<p>&#8211; Ajouter cette instruction suivante dans le fichier profile :&nbsp; source &lt;(minikube completion $(basename $SHELL))<\/p>\n<h1>Installation du cluster Kubernetes avec Minikube<\/h1>\n<h2>Options de lancement<\/h2>\n<ul>\n<li>\n<h5>L&rsquo;installation du cluster Kubernetes par MInikube se fait soit \u00e0 l&rsquo;aide d&rsquo;un container Docker ou d&rsquo;une machine virtuelle (pilot\u00e9e par un hyperviseur)<\/h5>\n<\/li>\n<\/ul>\n<h2>Installation de Docker :<\/h2>\n<h2>&nbsp;<\/h2>\n<h4><span style=\"color: #ff0000;\"><em>Fichier : \/shareProd\/1and1\/local\/appli\/Kubernetres\/scripts\/.\/4-Installation-Docker.ksh<\/em><\/span><\/h4>\n<ul>\n<li>\n<h3>Installation de Docker Community Edition sur Ubuntu<\/h3>\n<\/li>\n<\/ul>\n<h5>$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common<\/h5>\n<h5>$ curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo apt-key add &#8211;<\/h5>\n<h5>$ sudo add-apt-repository \u00ab\u00a0deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\u00a0\u00bb<\/h5>\n<h5>$ sudo apt update<\/h5>\n<h5>$ sudo apt-get install docker.ce docker-ce-cli containerd.io<\/h5>\n<ul>\n<li>\n<h3>Configuration des acc\u00e8s \u00e0 Docker<\/h3>\n<\/li>\n<\/ul>\n<h5>$ sudo usermod -aG docker &lt;USER&gt;<\/h5>\n<ul>\n<li>\n<h3>V\u00e9rification de l&rsquo;installation de Docker<\/h3>\n<\/li>\n<\/ul>\n<h5>$ docker run hello -world<\/h5>\n<ul>\n<li>\n<h3>Extrait du r\u00e9sultat :<\/h3>\n<\/li>\n<\/ul>\n<p>u70779858@Kubernetes-SRV:<\/p>\n<h5>$ docker run hello-world<\/h5>\n<pre>u70779858@Kubernetes-SRV:~$ docker run hello-world\r\nUnable to find image 'hello-world:latest' locally\r\nlatest: Pulling from library\/hello-world\r\nc1ec31eb5944: Pull complete\r\nDigest: sha256:1408fec50309afee38f3535383f5b09419e6dc0925bc69891e79d84cc4cdcec6\r\nStatus: Downloaded newer image for hello-world:latest\r\n\r\nHello from Docker!\r\nThis message shows that your installation appears to be working correctly.\r\n\r\n<\/pre>\n<ul>\n<li>\n<h6><strong>$ minikube start &#8211;cpus 2 &#8211;memory 2048 &#8211;kubernetes-version v1.24.7 &#8211;vm-driver docker &#8211;container-runtime containerd<\/strong><\/h6>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h6><strong>$ minikube start &#8211;cpus 2 &#8211;memory 2048 &#8211;kubernetes-version v1.24.7 &#8211;vm-driver docker &#8211;container-runtime containerd<\/strong><\/h6>\n<\/li>\n<\/ul>\n<pre>&nbsp;<\/pre>\n<pre>X Fermeture en raison de K8S_NEW_UNSUPPORTED : La version Kubernetes 1.33.1 n'est pas prise en charge par cette version de minikube\r\n\r\nu70779858@Kubernetes-SRV:~$ k version\r\nWARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.\r\nClient Version: version.Info{Major:\"1\", Minor:\"24\", GitVersion:\"v1.24.7\", GitCommit:\"e6f35974b08862a23e7f4aad8e5d7f7f2de26c15\", GitTreeSta te:\"clean\", BuildDate:\"2022-10-12T10:57:14Z\", GoVersion:\"go1.18.7\", Compiler:\"gc\", Platform:\"linux\/amd64\"}\r\nKustomize Version: v4.5.4\r\nThe connection to the server localhost:8080 was refused - did you specify the right host or port?\r\nu70779858@Kubernetes-SRV:~$ minikube start --cpus 2 --memory 2048 --kubernetes-version v1.33.1 --vm-driver docker --container-runtime con tainerd\r\n* minikube v1.33.1 sur Ubuntu 20.04\r\n! La version de Kubernetes sp\u00e9cifi\u00e9e 1.33.1 est plus r\u00e9cente que la derni\u00e8re version prise en charge&nbsp;: v1.30.0. Utilisez `minikube config defaults kubernetes-version` pour plus de d\u00e9tails.\r\n! La version Kubernetes sp\u00e9cifi\u00e9e 1.33.1 est introuvable dans la liste des versions de Kubernetes\r\n* Recherche sur Internet de la version de Kubernetes...\r\n! Version Kubernetes introuvable dans la liste des versions de GitHub. Vous pouvez forcer une version de Kubernetes via l'indicateur --force\r\n\r\nX Fermeture en raison de K8S_NEW_UNSUPPORTED : La version Kubernetes 1.33.1 n'est pas prise en charge par cette version de minikube\r\n\r\nu70779858@Kubernetes-SRV:~$ minikube start --cpus 2 --memory 2048 --kubernetes-version v1.24.7 --vm-driver docker --container-runtime containerd\r\n* minikube v1.33.1 sur Ubuntu 20.04\r\n* Utilisation du pilote docker bas\u00e9 sur la configuration de l'utilisateur\r\n* Utilisation du pilote Docker avec le privil\u00e8ge root\r\n* D\u00e9marrage du n\u0153ud \"minikube\" primary control-plane dans le cluster \"minikube\"\r\n* Extraction de l'image de base v0.0.44...\r\n* T\u00e9l\u00e9chargement du pr\u00e9chargement de Kubernetes v1.24.7...\r\n&gt; gcr.io\/k8s-minikube\/kicbase...: 481.58 MiB \/ 481.58 MiB 100.00% 13.04 M\r\n&gt; preloaded-images-k8s-v18-v1...: 437.52 MiB \/ 437.52 MiB 100.00% 7.05 Mi\r\n* Cr\u00e9ation de docker container (CPU=2, Memory=2048Mo) ...\r\n* Pr\u00e9paration de Kubernetes v1.24.7 sur containerd 1.6.31...\r\nX Impossible de charger les images mises en cache&nbsp;: loading cached images: stat \/home\/u70779858\/.minikube\/cache\/images\/amd64\/registry.k8s.io\/kube-controller-manager_v1.24.7: no such file or directory\r\n- G\u00e9n\u00e9ration des certificats et des cl\u00e9s\r\n- D\u00e9marrage du plan de contr\u00f4le ...\r\n- Configuration des r\u00e8gles RBAC ...\r\n* Configuration de CNI (Container Networking Interface)...\r\n* V\u00e9rification des composants Kubernetes...\r\n- Utilisation de l'image gcr.io\/k8s-minikube\/storage-provisioner:v5\r\n* Modules activ\u00e9s: storage-provisioner, default-storageclass\r\n* Termin\u00e9 ! kubectl est maintenant configur\u00e9 pour utiliser \"minikube\" cluster et espace de noms \"default\" par d\u00e9faut.<\/pre>\n<h3>Installation dans l&rsquo;environnement Kubernetes<\/h3>\n<h3>&nbsp;<\/h3>\n<h5>$ kubectl get namespace<\/h5>\n<pre>$ kubectl get namespace\r\nNAME STATUS AGE\r\ndefault Active 24h\r\nkube-node-lease Active 24h\r\nkube-public Active 24h\r\nkube-system Active 24h<\/pre>\n<h3>Arr\u00eat\/d\u00e9marrage de la machine Minikube<\/h3>\n<h5>$ minikube stop<\/h5>\n<pre>u70779858@Kubernetes-SRV:~$ minikube stop\r\n* N\u0153ud d'arr\u00eat \"minikube\" ...\r\n* Mise hors tension du profil \"minikube\" via SSH\u2026\r\n* 1 n\u0153ud arr\u00eat\u00e9.<\/pre>\n<h4>$ minikube start<\/h4>\n<pre>u70779858@Kubernetes-SRV:~$ minikube start\r\n* minikube v1.33.1 sur Ubuntu 20.04\r\n* Kubernetes 1.30.0 est d\u00e9sormais disponible. Si vous souhaitez effectuer une mise \u00e0 niveau, sp\u00e9cifiez : --kubernetes -version=v1.30.0\r\n* Utilisation du pilote docker bas\u00e9 sur le profil existant\r\n* D\u00e9marrage du n\u0153ud \"minikube\" primary control-plane dans le cluster \"minikube\"\r\n* Extraction de l'image de base v0.0.44...\r\n* Red\u00e9marrage du docker container existant pour \"minikube\" ...\r\n* Pr\u00e9paration de Kubernetes v1.24.7 sur containerd 1.6.31...\r\nX Impossible de charger les images mises en cache&nbsp;: loading cached images: stat \/home\/u70779858\/.minikube\/cache\/images\/amd64\/registry.k8s.io\/etcd_3.5.3-0: no such file or directory\r\n* V\u00e9rification des composants Kubernetes...\r\n- Utilisation de l'image gcr.io\/k8s-minikube\/storage-provisioner:v5\r\n* Modules activ\u00e9s: default-storageclass, storage-provisioner\r\n* Termin\u00e9 ! kubectl est maintenant configur\u00e9 pour utiliser \"minikube\" cluster et espace de noms \"default\" par d\u00e9faut.<\/pre>\n<h3>Suppression de la machine Minikube<\/h3>\n<h5>$ minikube delete<\/h5>\n<h3>Quelques notions sur le format YAML<\/h3>\n<ul>\n<li>\n<h5>La commande kubectl permet d&rsquo;interagir avec Kubernete afin de cr\u00e9er certains objets (d\u00e9velopement, adresse de services, proxy inverse, etc<\/h5>\n<\/li>\n<\/ul>\n<pre>Un proxy inverse Kubectl vous permet de cr\u00e9er un tunnel s\u00e9curis\u00e9 vers un service Kubernetes en cours d'ex\u00e9cution, puis de vous connecter \u00e0 ce service \u00e0 partir de votre machine locale. Cela peut \u00eatre utile pour d\u00e9boguer ou tester des applications d\u00e9ploy\u00e9es dans un cluster Kubernetes<\/pre>\n<ul>\n<li>\n<h5>Yam permet permet d&rsquo;\u00e9crire des structures de donn\u00e9es sous forme de listes ou de dictionnaires ( lisibilit\u00e9 ou compacit\u00e9)<\/h5>\n<\/li>\n<\/ul>\n<h1>&nbsp;<\/h1>\n<h1 style=\"text-align: right;\">Chapitre 3<\/h1>\n<h1 style=\"text-align: right;\">Tableau de bord et<\/h1>\n<h1 style=\"text-align: right;\">Ligne de commande<\/h1>\n<ul>\n<li>\n<h3>Le tableau de bord (dashboard) Kubernettes<\/h3>\n<\/li>\n<li>\n<h3>La commande kubectl<\/h3>\n<\/li>\n<li>\n<h3>Le moteur Docker et Minikube<\/h3>\n<\/li>\n<li>\n<h3>La consultation de quelques objets de base (pods et nodes)<\/h3>\n<\/li>\n<li>\n<h3>Un cluster Kubernettes fonctionnel<\/h3>\n<\/li>\n<li>\n<h3>Un contexte kubectl coh\u00e9rent<\/h3>\n<\/li>\n<\/ul>\n<h2>Pourquoi utiliser Kubernetes<\/h2>\n<ul>\n<li>\n<h5>Possibilit\u00e9 de r\u00e9aliser des op\u00e9rations auparavant compliqu\u00e9es de fa\u00e7on plus rapide et simple \/<\/h5>\n<\/li>\n<\/ul>\n<h5>&#8211; D\u00e9marrer des \u00e9l\u00e9ments de tests \u00e0 la demande<\/h5>\n<h5>&#8211; s&rsquo;affranchir des probl\u00e8mes de d\u00e9pendances de librairies<\/h5>\n<h5>&#8211; uniformiser les livrables de tous les environnements<\/h5>\n<ul>\n<li>\n<h5>Nouveaux probl\u00e8mes rencontr\u00e9s pour ce nouvel outil :<\/h5>\n<\/li>\n<\/ul>\n<h5>&#8211; Persistance des donn\u00e9es.<\/h5>\n<h5>&#8211; Surveillance des applications dans les containers.<\/h5>\n<h5>&#8211; Mise \u00e0 jour automatique des applications<\/h5>\n<h5>&#8211; Scalabilit\u00e9 du moteur Docker<\/h5>\n<h5>&#8211; Scalabilit\u00e9 de la charge applicative<\/h5>\n<h5>&#8211; Publication des environnements sur l&rsquo;ext\u00e9rieur<\/h5>\n<h2>Le tableau de bord de Kubernetes (Dashboard)<\/h2>\n<ul>\n<li>\n<h3>D\u00e9ploiement du dashboard sur Minikube<\/h3>\n<\/li>\n<\/ul>\n<h5>$ minikube addons enables dashboard<\/h5>\n<h5>$ minikube addons enables metrics-server<\/h5>\n<h5>$minikube dashboard<\/h5>\n<p>&nbsp;<\/p>\n<ul>\n<li>\n<h3>Cr\u00e9ation d&rsquo;un d\u00e9ploiement<\/h3>\n<\/li>\n<\/ul>\n<h5>App name :<span style=\"color: #ff0000;\">mailhog<\/span> (Nom du d\u00e9ploiement)<\/h5>\n<h5>Container image : <span style=\"color: #ff0000;\">mailhog\/mailhog <span style=\"color: #000000;\">(Nom de l&rsquo;image)<\/span><\/span><\/h5>\n<h5>&nbsp;<\/h5>\n<h5>&nbsp;<\/h5>\n<h5>&nbsp;<\/h5>\n<h5><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7061\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1.png\" alt=\"\" width=\"746\" height=\"472\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1.png 746w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-300x190.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-80x51.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-705x446.png 705w\" sizes=\"(max-width: 746px) 100vw, 746px\" \/><\/a><\/h5>\n<h3>Consultation du gestionnaire de r\u00e9plicats<\/h3>\n<p>Nom du r\u00e9plicat<\/p>\n<p>L&rsquo;espace des noms, les labels et annotaions<\/p>\n<p>La date de cr\u00e9ation<\/p>\n<p>L&rsquo;image utilis\u00e9e<\/p>\n<p>La liste des pods<\/p>\n<p>La liste des pods associ\u00e9s<\/p>\n<p>Les services associ\u00e9s<\/p>\n<p>Le service de mise \u00e0 l&rsquo;\u00e9chelle<\/p>\n<p>Les \u00e9v\u00e9nements associ\u00e9s au R\u00e9plicaSetConsultation<\/p>\n<h3>Consultation de l&rsquo;\u00e9tat d&rsquo;un pod<\/h3>\n<h3>Journal d&rsquo;activit\u00e9 du container : View logs<\/h3>\n<h3>Scalabili\u00e9 : Option Scale (\u00e0 l&rsquo;\u00e9chelle)<\/h3>\n<h3>Mise \u00e0 jour de l&rsquo;application<\/h3>\n<h5>Edition de la d\u00e9finition au format YAML de l&rsquo;application MailHog<\/h5>\n<p>Pour r\u00e9sumer<\/p>\n<ul>\n<li>Cr\u00e9ation d&rsquo;un ReplicaSet<\/li>\n<li>Cr\u00e9ation d&rsquo;un Pod associ\u00e9 au ReplicaSet<\/li>\n<li>D\u00e9marrage du container<\/li>\n<\/ul>\n<p>Une mise \u00e0 jour du d\u00e9ploiement se traduira par la cr\u00e9ation d&rsquo;un nouveau ReplicaSet qui dispara\u00eetra une fois la mise \u00e0 jour termin\u00e9e.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7062\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7.png\" alt=\"\" width=\"816\" height=\"362\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7.png 816w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7-300x133.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7-80x35.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7-768x341.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog7-705x313.png 705w\" sizes=\"(max-width: 816px) 100vw, 816px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7063\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6.png\" alt=\"\" width=\"793\" height=\"386\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6.png 793w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6-300x146.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6-80x39.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6-768x374.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog6-705x343.png 705w\" sizes=\"(max-width: 793px) 100vw, 793px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog5.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7064\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog5.png\" alt=\"\" width=\"608\" height=\"421\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog5.png 608w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog5-300x208.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog5-80x55.png 80w\" sizes=\"(max-width: 608px) 100vw, 608px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7065\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4.png\" alt=\"\" width=\"841\" height=\"477\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4.png 841w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4-300x170.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4-80x45.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4-768x436.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog4-705x400.png 705w\" sizes=\"(max-width: 841px) 100vw, 841px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7066\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3.png\" alt=\"\" width=\"782\" height=\"410\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3.png 782w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3-300x157.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3-80x42.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3-768x403.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog3-705x370.png 705w\" sizes=\"(max-width: 782px) 100vw, 782px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7067\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2.png\" alt=\"\" width=\"737\" height=\"488\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2.png 737w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2-300x199.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2-80x53.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog2-705x467.png 705w\" sizes=\"(max-width: 737px) 100vw, 737px\" \/><\/a> <a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7068\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1.png\" alt=\"\" width=\"746\" height=\"472\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1.png 746w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1-300x190.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1-80x51.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/mailhog1-1-705x446.png 705w\" sizes=\"(max-width: 746px) 100vw, 746px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h5>$ minikube start<\/h5>\n<p>&nbsp;<\/p>\n<pre>u70779858@Ubuntu20Kubernetes:~$ minikube start\r\n* minikube v1.32.0 sur Ubuntu 20.04\r\n* minikube 1.33.1 est disponible ! T\u00e9l\u00e9chargez-le ici : https:\/\/github.com\/kubernetes\/minikube\/releases\/tag\/v1.33.1\r\n* Pour d\u00e9sactiver cette notification, ex\u00e9cutez&nbsp;: 'minikube config set WantUpdateNotification false'\r\n\r\n* Choix automatique du pilote docker\r\n* Utilisation du pilote Docker avec le privil\u00e8ge root\r\n* D\u00e9marrage du noeud de plan de contr\u00f4le minikube dans le cluster minikube\r\n* Extraction de l'image de base...\r\n* T\u00e9l\u00e9chargement du pr\u00e9chargement de Kubernetes v1.28.3...\r\n&gt; preloaded-images-k8s-v18-v1...: 403.35 MiB \/ 403.35 MiB 100.00% 40.28 M\r\n&gt; gcr.io\/k8s-minikube\/kicbase...: 453.90 MiB \/ 453.90 MiB 100.00% 19.42 M\r\n* Cr\u00e9ation de docker container (CPU=2, Memory=2200Mo) ...\r\n\r\nX Docker est presque \u00e0 court d'espace disque, ce qui peut entra\u00eener l'\u00e9chec des d\u00e9ploiements&nbsp;! (86&nbsp;% de la capacit\u00e9). Vous pouvez passer '--force' pour ignorer cette v\u00e9rification.\r\n* Suggestion&nbsp;:\r\n\r\nEssayez une ou plusieurs des solutions suivantes pour lib\u00e9rer de l'espace sur l'appareil&nbsp;:\r\n\r\n1. Ex\u00e9cutez \"docker system prune\" pour supprimer les donn\u00e9es Docker inutilis\u00e9es (\u00e9ventuellement avec \"-a\")\r\n2. Augmentez le stockage allou\u00e9 \u00e0 Docker for Desktop en cliquant sur&nbsp;:\r\nIc\u00f4ne Docker &gt; Settings &gt; Ressources &gt; Disk Image Size\r\n3. Ex\u00e9cutez \"minikube ssh -- docker system prune\" si vous utilisez l'environnement d'ex\u00e9cution du conteneur Docker\r\n* Probl\u00e8me connexe: https:\/\/github.com\/kubernetes\/minikube\/issues\/9024\r\n\r\n* Pr\u00e9paration de Kubernetes v1.28.3 sur Docker 24.0.7...\r\n- G\u00e9n\u00e9ration des certificats et des cl\u00e9s\r\n- D\u00e9marrage du plan de contr\u00f4le ...\r\n- Configuration des r\u00e8gles RBAC ...\r\n* Configuration de bridge CNI (Container Networking Interface)...\r\n- Utilisation de l'image gcr.io\/k8s-minikube\/storage-provisioner:v5\r\n* V\u00e9rification des composants Kubernetes...\r\n* Modules activ\u00e9s: default-storageclass, storage-provisioner\r\n* Termin\u00e9 ! kubectl est maintenant configur\u00e9 pour utiliser \"minikube\" cluster et espace de noms \"default\" par d\u00e9faut.<\/pre>\n<h5>$ <strong>minikube addons enable dashboard<\/strong><\/h5>\n<p>&nbsp;<\/p>\n<pre>u70779858@Ubuntu20Kubernetes:~$ minikube addons enable dashboard\r\n* dashboard est un addon maintenu par Kubernetes. Pour toute question, contactez minikube sur GitHub.\r\nVous pouvez consulter la liste des mainteneurs de minikube sur&nbsp;: https:\/\/github.com\/kubernetes\/minikube\/blob\/master\/OWNERS\r\n- Utilisation de l'image docker.io\/kubernetesui\/dashboard:v2.7.0\r\n- Utilisation de l'image docker.io\/kubernetesui\/metrics-scraper:v1.0.8\r\n* Certaines fonctionnalit\u00e9s du tableau de bord n\u00e9cessitent le module metrics-server. Pour activer toutes les fonctionnalit\u00e9s, veuillez ex\u00e9cuter&nbsp;:\r\n\r\nminikube addons enable metrics-server\r\n\r\n\r\n* Le module 'dashboard' est activ\u00e9<\/pre>\n<h3>Pr\u00e9sentaion de l&rsquo;outil kubectl<\/h3>\n<h5>$ kubectl get namespace<\/h5>\n<h5>$ kubectl get pod<\/h5>\n<h5>$ kubectl get node<\/h5>\n<h5>$ kubectl get node -o wide<\/h5>\n<h6>$ minikube ssh<\/h6>\n<h6>$ sudo ctr namespace ls<\/h6>\n<pre>docker@minikube:~$ sudo ctr namespace ls\r\nNAME LABELS\r\nk8s.io<\/pre>\n<h6>$ sudo ctr -n k8s.io container ls<\/h6>\n<pre>docker@minikube:~$ sudo ctr -n k8s.io container ls\r\nCONTAINER IMAGE RUNTIME\r\n130812f821ffb7ddba52ea8e451731b36d6a2f82baccf5e6aa470478e306baa3 k8s.gcr.io\/pause:3.7 io.containerd.runc.v2\r\n17703389b0c9bed338c5cb7bd4af68b871477d854b6ccbba212209beb5379a3b k8s.gcr.io\/pause:3.7 io.containerd.runc.v2\r\n2a6b86fe292dbc5c29f83b9deb7035b4dd942fe0515b43ab922ed832e75a4e52 k8s.gcr.io\/pause:3.7 io.containerd.runc.v2<\/pre>\n<p>$&nbsp; sudo crictl ps &#8211;label=io.kubernetes.container.name=etcd<\/p>\n<pre>docker@minikube:~$ sudo crictl ps --label=io.kubernetes.container.name=etcd\r\nCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD\r\na46f41882376f aebe758cef4cd 43 hours ago Running etcd 1 17703389b0c9b etcd-minikube<\/pre>\n<h6>$ sudo crictl inspect a46f41882376f<\/h6>\n<h1 style=\"text-align: right;\">Chapitre 4<\/h1>\n<h1 style=\"text-align: right;\">Automatisation et publication<\/h1>\n<h1 style=\"text-align: right;\">d\u2019une application&nbsp;<\/h1>\n<h2>Suppression d\u2019un d\u00e9ploiement<\/h2>\n<p>$ kubectl get deployment&nbsp;<\/p>\n<p>$ kubectl delete deployment mailhog<\/p>\n<h2>Cr\u00e9ation d\u2019un d\u00e9poiement&nbsp;<\/h2>\n<p>$ kubectl -create deployement mailhog \u2014image=mailhog\/mailhog<\/p>\n<p>$ kubectl get deployement<\/p>\n<p>$ kubectl describe deployement mailhog<\/p>\n<h2>M\u00e9canisme des r\u00e9plicats<\/h2>\n<ul>\n<li>\n<h5>Consultation &nbsp;des r\u00e9plicats&nbsp;<\/h5>\n<\/li>\n<li>\n<h5>Parmi les informations remont\u00e9es par la commande kubectl describe se trouve le ReplicaSet actuel ainsi que &#8211; en cas de mise \u00e0 jour &#8211; la liste des anciens ReplicaSet.<\/h5>\n<\/li>\n<li>\n<h5>Cet objet va prendre en charge la cr\u00e9ation d\u2019un nombre donn\u00e9es de Replicats pour une application donn\u00e9e. C\u2019est lui qui va indiquer au Cluster Kubernetes qu\u2019il faut d\u00e9marrer un pod en cas de suppression d\u2019un pod.<\/h5>\n<\/li>\n<li>\n<h5>Il vas \u00e9galement \u00eatre associ\u00e9 \u00e0 l\u2019ensemble des caract\u00e9ristiques d\u2019une applicationn\u00e0 un instant donn\u00e9.comme par exemple :<\/h5>\n<\/li>\n<\/ul>\n<h5>&#8211; les caract\u00e9ristiques d\u2019une image : num\u00e9ro de version, emplacement, nom<\/h5>\n<h5>&#8211; la r\u00e9servation d\u2019une quantit\u00e9 de m\u00e9moire et CPU<\/h5>\n<h5>&#8211; certaines caract\u00e9ristiques du d\u00e9ploiement : variables d\u2019environnement<\/h5>\n<h6>$ kubectl get replicaset&nbsp;<\/h6>\n<pre>NAME DESIRED CURRENT READY AGE\r\nmailhog-b44849b6f 1 1 1 3m21s<\/pre>\n<h6>$ kubectl describe rs mailhog-b44849b6f<\/h6>\n<pre>u70779858@Kubernetes-SRV:~$ k get replicaset\r\nNAME DESIRED CURRENT READY AGE\r\nmailhog-b44849b6f 1 1 1 3m21s\r\nu70779858@Kubernetes-SRV:~$ k describe rs mailhog-b44849b6f\r\nName: mailhog-b44849b6f\r\nNamespace: default\r\nSelector: app=mailhog,pod-template-hash=b44849b6f\r\nLabels: app=mailhog\r\npod-template-hash=b44849b6f\r\nAnnotations: deployment.kubernetes.io\/desired-replicas: 1\r\ndeployment.kubernetes.io\/max-replicas: 2\r\ndeployment.kubernetes.io\/revision: 1\r\nControlled By: Deployment\/mailhog\r\nReplicas: 1 current \/ 1 desired\r\nPods Status: 1 Running \/ 0 Waiting \/ 0 Succeeded \/ 0 Failed\r\nPod Template:\r\nLabels: app=mailhog\r\npod-template-hash=b44849b6f\r\nContainers:\r\nmailhog:\r\nImage: mailhog\/mailhog\r\nPort: &lt;none&gt;\r\nHost Port: &lt;none&gt;\r\nEnvironment: &lt;none&gt;\r\nMounts: &lt;none&gt;\r\nVolumes: &lt;none&gt;\r\nEvents:\r\nType Reason Age From Message\r\n---- ------ ---- ---- -------\r\nNormal SuccessfulCreate 5m4s replicaset-controller Created pod: <span style=\"color: #ff0000;\"><strong>mailhog-b44849b6f-444bt<\/strong><\/span><\/pre>\n<p>&nbsp;<\/p>\n<h6>$ watch kubectl get pods&nbsp;<\/h6>\n<h6>$ kubectl logs <span style=\"color: #ff0000;\">mailhog-b44849b6f-444bt<\/span> -c mailhog<\/h6>\n<pre>u70779858@Kubernetes-SRV:~$ k logs mailhog-b44849b6f-444bt -c mailhog\r\n2024\/08\/24 05:57:42 Using in-memory storage\r\n2024\/08\/24 05:57:42 [SMTP] Binding to address: 0.0.0.0:1025\r\n2024\/08\/24 05:57:42 Serving under http:\/\/0.0.0.0:8025\/\r\n[HTTP] Binding to address: 0.0.0.0:8025\r\nCreating API v1 with WebPath:\r\nCreating API v2 with WebPath:\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events\r\n[APIv1] KEEPALIVE \/api\/v1\/events<\/pre>\n<h2>Acc\u00e9der \u00e0 l\u2019application Mailhog<\/h2>\n<h3>Le container Mailhog utilise 2 ports d\u2019\u00e9coute :<\/h3>\n<h6>&#8211; Le port 1025 pour le protocole SMTP<\/h6>\n<h6>&#8211; Le port 8025 pour l\u2019interface web de MailHog&nbsp;<\/h6>\n<h6>&#8211; Le nom du pod`\b<\/h6>\n<h6>&#8211; Une &nbsp;piste \u00e0 faire suivre&nbsp;<\/h6>\n<h3>Pour acc\u00e9der au port 8025, dans le cas de MailHog, :<\/h3>\n<h6>$ kubectl port-forward&nbsp;<span style=\"color: #ff0000;\"> mailhog-b44849b6f-444bt<\/span> 8025<\/h6>\n<pre>Forwarding from 127.0.0.1:8025 -&gt; 8025\r\nForwarding from [::1]:8025 -&gt; 8025<\/pre>\n<h6>$ kubectl port-forward deployement\/mailhog 8025<\/h6>\n<pre>Forwarding from 127.0.0.1:8025 -&gt; 8025\r\nForwarding from [::1]:8025 -&gt; 8025<\/pre>\n<h3>Pourquoi utiliser un service<\/h3>\n<h4>&#8211; Cr\u00e9ation d\u2019une entr\u00e9e stable dans Kubernetes<br \/>\n&#8211; Mise \u00e0 jour de l\u2019entr\u00e9e DNS du service en cas de changement<\/h4>\n<h3>Exposition d\u2019un d\u00e9ploiement via un service<\/h3>\n<h6>$ kubectl expose deployment\/mailhog \u2014port 1025,8025<\/h6>\n<pre>R\u00c9SULTAT : \r\nService\/mailhog exposed<\/pre>\n<h3>V\u00e9rification du service mailhog<\/h3>\n<h6>$ kubectl exec -it mailhog-b44849b6f-444bt sh<\/h6>\n<pre>kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.\r\n~ $<\/pre>\n<h3>$ kubectl exec -it deployment\/mailhog &#8212; sh<\/h3>\n<p>&nbsp;<\/p>\n<h3>&nbsp;<\/h3>\n<h3>&nbsp;<\/h3>\n<h3>Il est possible de r\u00e9aliser une r\u00e9solution de nom sur l\u2019entr\u00e9e DNS du service<\/h3>\n<h4>&#8211; la commande dig<br \/>\n&#8211; La commande nslookup<br \/>\n&#8211; L\u2019instruction g\u00e8rent hosts<\/h4>\n<h4>Sh du pod : dig nslookup et getent hosts<\/h4>\n<p>&nbsp;<\/p>\n<h4>Malheureusement pour l\u2019administrateur Unix classique, une pratique courante dans la mise au point d\u2019image de container est de r\u00e9duire au maximum des outils pr\u00e9sents (notamment pour r\u00e9duire au maximum la couverture d\u2019attaque).<\/h4>\n<h6>$ getent hosts mailhog<\/h6>\n<pre>R\u00c9SULTAT :\r\n192.168.1.99 mailhog.default.svc.cluster.local\r\nMailhog.default.svc.cluster.local mailhog<\/pre>\n<h3>Que faire en cas d\u2019absence de Shell<\/h3>\n<h4>Contexte<br \/>\n&#8211; connexion au pod du service<br \/>\n&#8211; Container ne contient aucun Shell UNIX<\/h4>\n<h3>Dans le cas de minikube le pod storage-provisioner de l\u2019espace<\/h3>\n<h4>$ kubectl -n kube-system exec -it storage-provisioner sh<\/h4>\n<p>&nbsp;<\/p>\n<pre>kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.\r\nerror: unable to upgrade connection: container not found (\"storage-provisioner\")<\/pre>\n<p>&nbsp;<\/p>\n<h3>Utilisation d\u2019un pod \u00e9ph\u00e9m\u00e8re<\/h3>\n<h4>&#8211; instruction de DEBUG : permet de d\u00e9bogguer le comportement d\u2019un pod<\/h4>\n<h6>&nbsp;$ kubectl debug&nbsp; -it&nbsp; <span style=\"color: #ff0000;\">mailhog-b44849b6f-444bt<\/span> \u2014image=alpine<\/h6>\n<pre>u70779858@Kubernetes-SRV:~$ k debug mailhog-b44849b6f-444bt -it --image=alpine\r\nDefaulting debug container name to debugger-ctv4z.\r\nIf you don't see a command prompt, try pressing enter.\r\n\/ #<\/pre>\n<p>&nbsp;<\/p>\n<h6>&nbsp;$ kubectl exec -it deployment\/mailhog &#8212; sh<\/h6>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl exec -it deployment\/mailhog -- sh\r\nDefaulted container \"mailhog\" out of: mailhog, debugger-ctv4z (ephem), debugger-r54dl (ephem), debugger-d9699 (ephem)\r\n\r\n\r\n~ $ getent hosts mailhog\r\n10.111.25.214 mailhog.default.svc.cluster.local mailhog.default.svc.cluster.local mailhog\r\n~ $\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Lancement d\u2019un pod de test<\/h3>\n<h6>$ kubectl&nbsp; run -it \u2014rm test-mailhog \u2014image=alpine sh<\/h6>\n<h6>$ nslookup mailhog<\/h6>\n<pre>u70779858@Kubernetes-SRV:~$ k run -it --rm test-mailhog --image=alpine sh\r\nIf you don't see a command prompt, try pressing enter.\r\n\/ # nslookup mailhog\r\nServer: 10.96.0.10\r\nAddress: 10.96.0.10:53\r\n\r\n** server can't find mailhog.cluster.local: NXDOMAIN\r\n\r\n** server can't find mailhog.svc.cluster.local: NXDOMAIN\r\n\r\n** server can't find mailhog.cluster.local: NXDOMAIN\r\n\r\n\r\n** server can't find mailhog.svc.cluster.local: NXDOMAIN\r\n\r\nName: mailhog.default.svc.cluster.local\r\nAddress: 10.111.25.214\r\n\r\n\/ #\r\n\r\n<\/pre>\n<h3>A la sortie du shell associ\u00e9 au container, le pod est supprim\u00e9 automatiquement.<\/h3>\n<p>&nbsp;<\/p>\n<pre>\/ # exit\r\nSession ended, resume using 'kubectl attach test-mailhog -c test-mailhog -i -t' command when the pod is running\r\npod \"test-mailhog\" deleted\r\nu70779858@Kubernetes-SRV:~$<\/pre>\n<h3>&nbsp;<\/h3>\n<h3>R\u00e9silience et scalabilit\u00e9<\/h3>\n<h4>La r\u00e9silience d&rsquo;un pod, dans le contexte de l&rsquo;informatique et plus particuli\u00e8rement de Kubernetes, fait r\u00e9f\u00e9rence \u00e0 la capacit\u00e9 du pod \u00e0 continuer de fonctionner de mani\u00e8re stable malgr\u00e9 des d\u00e9faillances ou des perturbations dans l&rsquo;environnement o\u00f9 il s&rsquo;ex\u00e9cute.<\/h4>\n<h3>Voici ce que cela peut impliquer :<\/h3>\n<h4>1. *Tol\u00e9rance aux pannes* : Le pod peut r\u00e9sister \u00e0 la d\u00e9faillance de certaines de ses d\u00e9pendances (comme un n\u0153ud de cluster qui tombe en panne) sans interruption majeure.<\/h4>\n<h4>2. *Redondance* : La r\u00e9silience peut \u00eatre am\u00e9lior\u00e9e par la cr\u00e9ation de plusieurs instances d&rsquo;un pod (r\u00e9plication), de sorte que si une instance tombe en panne, une autre instance prend le relais sans affecter la disponibilit\u00e9 de l&rsquo;application.<\/h4>\n<h4>3. *Auto-r\u00e9paration* : Kubernetes permet de red\u00e9marrer automatiquement un pod en cas de d\u00e9faillance ou de mauvais fonctionnement, ce qui am\u00e9liore la r\u00e9silience.<\/h4>\n<h4>4. *Scalabilit\u00e9* : La capacit\u00e9 du syst\u00e8me \u00e0 ajuster dynamiquement le nombre de pods en r\u00e9ponse \u00e0 la charge de travail peut \u00e9galement \u00eatre vue comme une forme de r\u00e9silience, car elle aide \u00e0 pr\u00e9venir la saturation des ressources.<\/h4>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #993300;\"><em>En somme, la r\u00e9silience d&rsquo;un pod est sa capacit\u00e9 \u00e0 maintenir ses services fonctionnels m\u00eame en cas de probl\u00e8me, gr\u00e2ce \u00e0 des m\u00e9canismes tels que la r\u00e9plication, le red\u00e9marrage automatique et l&rsquo;ajustement dynamique des ressources.<\/em><\/span><\/h4>\n<p>&nbsp;<\/p>\n<h3>Scalabilit\u00e9 manuelle<\/h3>\n<p>$ kubectl scale deployment mailhog &#8211;replicas=2<\/p>\n<p>&nbsp;<\/p>\n<pre>deployment.apps\/mailhog scaled<\/pre>\n<h3>Nombre de pods associ\u00e9s \u00e0 un d\u00e9ploiement<\/h3>\n<p>$ kubectl get deployment mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY UP-TO-DATE AVAILABLE AGE\r\nmailhog 2\/2 2 2 75m<\/pre>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-b44849b6f-444bt 1\/1 Running 0 76m\r\nmailhog-b44849b6f-l485j 1\/1 Running 0 94s<\/pre>\n<h4>Arr\u00eater temporairement une application<\/h4>\n<p>$ kubectl scale deployment mailhog &#8211;replicas=0<\/p>\n<pre>deployment.apps\/mailhog scaled<\/pre>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<pre>No resources found in default namespace.<\/pre>\n<p>&nbsp;<\/p>\n<p>$ kubectl scale deployment mailhog &#8211;replicas=1<\/p>\n<p>&nbsp;<\/p>\n<pre>deployment.apps\/mailhog scaled<\/pre>\n<h3>Automatisation de d\u00e9ploiement par fichier YAML<\/h3>\n<h3>M\u00e9canisme de mise \u00e0 jour<\/h3>\n<h4>&#8211; le Dashboard de Kubernetes<br \/>\n&#8211; La commande kubectl avec l\u2019option creat<\/h4>\n<h3>Structure YAML d\u2019un d\u00e9ploiement<\/h3>\n<h4>R\u00e9cup\u00e9ration d\u2019une structure au format YALM<\/h4>\n<p>$ kubectl get deployment mailhog -o yaml<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\nannotations:\r\ndeployment.kubernetes.io\/revision: \"1\"\r\ncreationTimestamp: \"2024-08-24T05:57:38Z\"\r\ngeneration: 4\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nnamespace: default\r\nresourceVersion: \"1209263\"\r\nuid: 3364b92d-a5ff-49f3-a256-2f53ac62ccda\r\nspec:\r\nprogressDeadlineSeconds: 600\r\nreplicas: 1\r\nrevisionHistoryLimit: 10\r\nselector:\r\nmatchLabels:\r\napp: mailhog\r\nstrategy:\r\nrollingUpdate:\r\nmaxSurge: 25%\r\nmaxUnavailable: 25%\r\ntype: RollingUpdate\r\ntemplate:\r\nmetadata:\r\ncreationTimestamp: null\r\nlabels:\r\napp: mailhog\r\nspec:\r\ncontainers:\r\n- image: mailhog\/mailhog\r\nimagePullPolicy: Always\r\nname: mailhog\r\nresources: {}\r\nterminationMessagePath: \/dev\/termination-log\r\nterminationMessagePolicy: File\r\ndnsPolicy: ClusterFirst\r\nrestartPolicy: Always\r\nschedulerName: default-scheduler\r\nsecurityContext: {}\r\nterminationGracePeriodSeconds: 30\r\nstatus:\r\navailableReplicas: 1\r\nconditions:\r\n- lastTransitionTime: \"2024-08-24T05:57:38Z\"\r\nlastUpdateTime: \"2024-08-24T05:57:42Z\"\r\nmessage: ReplicaSet \"mailhog-b44849b6f\" has successfully progressed.\r\nreason: NewReplicaSetAvailable\r\nstatus: \"True\"\r\ntype: Progressing\r\n- lastTransitionTime: \"2024-08-24T07:23:08Z\"\r\nlastUpdateTime: \"2024-08-24T07:23:08Z\"\r\nmessage: Deployment has minimum availability.\r\nreason: MinimumReplicasAvailable\r\nstatus: \"True\"\r\ntype: Available\r\nobservedGeneration: 4\r\nreadyReplicas: 1\r\nreplicas: 1\r\nupdatedReplicas: 1<\/pre>\n<p>&nbsp;<\/p>\n<h4>\u00c9dition d\u2019un d\u00e9ploiement<\/h4>\n<p>$ kubectl edit deployment mailhog<\/p>\n<h6>Export EDITOR=vi<\/h6>\n<h3>Squelette d\u2019un d\u00e9ploiement<\/h3>\n<h4>Un meilleur moyen pour obtenir un squelette d\u2019objet afin d\u2019automatiser sa cr\u00e9ation<\/h4>\n<p>$ kubectl create deployment mailhog &#8211;image mailhog\/mailhog &#8211;dry-run=client -o yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\ncreationTimestamp: null\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nspec:\r\nreplicas: 1\r\nselector:\r\nmatchLabels:\r\napp: mailhog\r\nstrategy: {}\r\ntemplate:\r\nmetadata:\r\ncreationTimestamp: null\r\nlabels:\r\napp: mailhog\r\nspec:\r\ncontainers:\r\n- image: mailhog\/mailhog\r\nname: mailhog\r\nresources: {}\r\nstatus: {}<\/pre>\n<p>&nbsp;<\/p>\n<p>$ kubectl create deployment mailhog &#8211;image mailhog\/mailhog &#8211;dry-run=client -o yaml &gt; mailhog-deployment.yaml<\/p>\n<p><span style=\"color: #ff0000;\">Fichier : \/home\/u70779858\/mailhog-deployment.yaml<\/span><\/p>\n<h3>Cr\u00e9ation d\u2019un d\u00e9ploiement \u00e0 l\u2019aide d\u2019un fichier<\/h3>\n<h3>2 mani\u00e8res \u00e0 cr\u00e9er un objet avec kubectl<\/h3>\n<h4>&#8211; <span style=\"color: #ff0000;\"><em>Avec l\u2019option create<\/em> <\/span>: l\u2019objet sera cr\u00e9\u00e9 mais ne pourra plus \u00eatre mis \u00e0 jour<br \/>\n&#8211; <em><span style=\"color: #ff0000;\">Avec l\u2019option apply<\/span><\/em> : l\u2019objet sera cr\u00e9\u00e9 mais en revanche s\u2019il existe d\u00e9j\u00e0 , kubectl se chargera tout <em>seul<\/em> \u00e0 mettre \u00e0 jour.<\/h4>\n<p>$ kubectl apply -f mailhog-deployment.yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>Warning: resource deployments\/mailhog 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.\r\ndeployment.apps\/mailhog configured<\/pre>\n<p>&nbsp;<\/p>\n<h4>Suppression des \u00e9l\u00e9ments d\u2019un fichier<\/h4>\n<p>$ kubectl delete -f mailhog-deployment.yaml<\/p>\n<h3>Gestion de l\u2019dempotence et de la r\u00e9entrance<\/h3>\n<h4>Idempotence : le r\u00e9sultat d\u2019une op\u00e9ration sera le m\u00eame qu\u2019il soit appliqu\u00e9 une fois ou plusieurs fois.<br \/>\nLa r\u00e9entrance : d\u00e9signe le m\u00eame m\u00e9canisme et sera \u00e0 prendre comme un synonyme .<\/h4>\n<p>$ kubectl apply mailhog-deployment.yaml<\/p>\n<pre>|| deployment.apps\/mailhog configured<\/pre>\n<p><span style=\"color: #ff0000;\"><em>Malheureusement les lancements suivant continuent de renvoyer le m\u00eame message alors que la commande devrait renvoyer le message unchanged<\/em> <\/span><\/p>\n<h3>Afin d\u2019\u00e9viter ce comportement :<\/h3>\n<h4>Suppression de la ligne sous champ creationTimestamp : null du champ metadata :<br \/>\nEt le sous champ strategy : () et ressources : () du champ spec :<br \/>\nEt testez les modifications r\u00e9alis\u00e9es :<\/h4>\n<p>Modifier le fichier mailhog-deployment.yaml :<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nspec:\r\nreplicas: 1\r\nselector:\r\nmatchLabels:\r\napp: mailhog\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mailhog\r\nspec:\r\ncontainers:\r\n- image: mailhog\/mailhog\r\nname: mailhog<\/pre>\n<p>$ kubectl apply -f mailhog-deployment.yaml<\/p>\n<pre>R\u00e9sultat du 1er lancement : \r\n\r\n|| deployment.apps\/mailhog configured\r\nEt r\u00e9sultat du second lancement :\r\n|| deployment.apps\/mailhog unchanged\r\n\r\n<\/pre>\n<h3>Cr\u00e9ation du service<\/h3>\n<h5>Tout comme le d\u00e9ploiement , il est possible d\u2019exporter la d\u00e9finition de l\u2019objet service au format YAML<\/h5>\n<p>$ kubectl expose deployment\/mailhog \u2014dry-run=client \u2014port 1025, 8025 -o yaml &gt; mailhog-service.yaml<\/p>\n<pre>apiVersin: v1\r\nkind: Service\r\nmetadata:\r\ncreationTimestamp: null\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nspec:\r\nports:\r\n- name: port-1\r\nport: 1025\r\nprotocol: TCP\r\ntargetPort: 1025\r\n- name: port-2\r\nport: 8025\r\nprotocol: TCP\r\ntargetPort: 8025\r\nselector:\r\napp: mailhog\r\nstatus:\r\nloadBalancer: {}<\/pre>\n<h5>&nbsp;<\/h5>\n<h5>Le contenu sera stock\u00e9 dans le fichier mailhog-service.yaml<\/h5>\n<h4>Application de la d\u00e9finition du service<\/h4>\n<p>$ kubectl apply -f mailhog-service.yaml<\/p>\n<pre>service\/mailhog configured<\/pre>\n<h4>Gestion de la r\u00e9entrance<\/h4>\n<h5>Tout comme pour le d\u00e9ploiement CreationTimestamp et Status \u00e0 supprimer<\/h5>\n<p>Fichier mailhog-service.yaml :<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: v1\r\nkind: Service\r\nmetadata:\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nspec:\r\nports:\r\n- name: port-1\r\nport: 1025\r\nprotocol: TCP\r\ntargetPort: 1025\r\n- name: port-2\r\nport: 8025\r\nprotocol: TCP\r\ntargetPort: 8025\r\nselector:\r\napp: mailhog\r\nloadBalancer: {}<\/pre>\n<p>&nbsp;<\/p>\n<h4>M\u00e9canisme de s\u00e9lecteur et labels<\/h4>\n<h5>metadata:<br \/>\nlabels:<br \/>\ncle1: valeur1<br \/>\ncle2: valeur2<\/h5>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<h4>Regroupement de la cr\u00e9ation des \u00e9l\u00e9ments<\/h4>\n<p>&#8211; Cr\u00e9ation d\u2019un r\u00e9pertoire mailhog<br \/>\n&#8211; D\u00e9placement du fichier mailhog-deployment.yaml dans ce r\u00e9pertoire sous le nom deployment.yaml<br \/>\n&#8211; D\u00e9placement du fichier mailhog-service.yaml dans le r\u00e9pertoire sous le nom service.yaml<br \/>\n$ kubectl apply -f .\/mailhog<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ k apply -f .\/mailhog\r\ndeployment.apps\/mailhog unchanged\r\nservice\/mailhog unchanged<\/pre>\n<h4>Consultation de l\u2019\u00e9tat d\u2019un groupe d\u2019objets<\/h4>\n<p>$ kubectl get -f .\/mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ k get -f .\/mailhog\r\nNAME READY UP-TO-DATE AVAILABLE AGE\r\ndeployment.apps\/mailhog 1\/1 1 1 25h\r\n\r\nNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\r\nservice\/mailhog ClusterIP 10.111.25.214 &lt;none&gt; 1025\/TCP,8025\/TCP 24h\r\nu70779858@Kubernetes-SRV:~$<\/pre>\n<h4>Structure des objets<\/h4>\n<h5>Interrogation de Kubernetes avec kubectl<\/h5>\n<h5>Kubectl offre la possibilit\u00e9 d\u2019interroger le moteur de Kubernetes la structure d\u2019un objet (explain)<\/h5>\n<p>$ kubectl explain service<\/p>\n<p>&nbsp;<\/p>\n<pre>KIND: Service\r\nVERSION: v1\r\n\r\nDESCRIPTION:\r\nService is a named abstraction of software service (for example, mysql)\r\nconsisting of local port (for example 3306) that the proxy listens on, and\r\nthe selector that determines which pods will answer requests sent through\r\nthe proxy.\r\n\r\nFIELDS:\r\napiVersion &lt;string&gt;\r\nAPIVersion defines the versioned schema of this representation of an\r\nobject. Servers should convert recognized schemas to the latest internal\r\nvalue, and may reject unrecognized values. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#resources\r\n\r\nkind &lt;string&gt;\r\nKind is a string value representing the REST resource this object\r\nrepresents. Servers may infer this from the endpoint the client submits\r\nrequests to. Cannot be updated. In CamelCase. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#types-kinds\r\n\r\nmetadata &lt;Object&gt;\r\nStandard object's metadata. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#metadata\r\n\r\nspec &lt;Object&gt;\r\nSpec defines the behavior of a service.\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#spec-and-status\r\n\r\nstatus &lt;Object&gt;\r\nMost recently observed status of the service. Populated by the system.\r\nRead-only. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#spec-and-status<\/pre>\n<p>$ kubectl explain service.status<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ k explain service.status\r\nKIND: Service\r\nVERSION: v1\r\n\r\nRESOURCE: status &lt;Object&gt;\r\n\r\nDESCRIPTION:\r\nMost recently observed status of the service. Populated by the system.\r\nRead-only. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#spec-and-status\r\n\r\nServiceStatus represents the current status of a service.\r\n\r\nFIELDS:\r\nconditions &lt;[]Object&gt;\r\nCurrent service state\r\n\r\nloadBalancer &lt;Object&gt;\r\nLoadBalancer contains the current status of the load-balancer, if one is\r\npresent.<\/pre>\n<p>&nbsp;<\/p>\n<h4>Ingress et reverse proxy<\/h4>\n<h5>Origine du Besoin<\/h5>\n<h6>Inaccessible depuis l\u2019ext\u00e9rieur sauf \u00e0 passer la commande kubectl port-forward<br \/>\nLes objets Ingress con\u00e7u pour ce type d\u2019op\u00e9ration. Ces derniers comme le d\u00e9ploiement et les services se manipulent \u00e0 l\u2019aide de la commande kubectl get describe et create ou apply.<\/h6>\n<h5>R\u00f4le d\u2019un proxy inverse<\/h5>\n<h6>Un proxy inverse d\u00e9signe un composant qui va se placer en amont d\u2019un autre afin d\u2019\u00e9tendre ses capacit\u00e9s.<br \/>\nUtilis\u00e9e pour r\u00e9pondre aux probl\u00e9matiques suivantes.<br \/>\n&#8211; Acc\u00e9der \u00e0 un programme inaccessible directement depuis Internet<br \/>\n&#8211; R\u00e9partir la charge sur plusieurs serveurs<br \/>\n&#8211; Prendre en charge les op\u00e9rations de chiffrements et de compression<br \/>\n&#8211; Prendre en charge la gestion de s\u00e9curit\u00e9.<br \/>\n&#8211; Mutualiser les acc\u00e8s et r\u00e9duire l-utilisation d\u2019adresse IP publiques.<\/h6>\n<h6><span style=\"color: #ff0000;\">Minikube dispose d\u2019un contr\u00f4leur Nginx pr\u00eat \u00e0 l\u2019emploie par simple activation.<\/span><\/h6>\n<h5>Activation du contr\u00f4leur Ingress dans MInikube<\/h5>\n<p>$ minikube addons enable ingress<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ k explain service.status\r\nKIND: Service\r\nVERSION: v1\r\n\r\nRESOURCE: status &lt;Object&gt;\r\n\r\nDESCRIPTION:\r\nMost recently observed status of the service. Populated by the system.\r\nRead-only. More info:\r\nhttps:\/\/git.k8s.io\/community\/contributors\/devel\/sig-architecture\/api-conventions.md#spec-and-status\r\n\r\nServiceStatus represents the current status of a service.\r\n\r\nFIELDS:\r\nconditions &lt;[]Object&gt;\r\nCurrent service state\r\n\r\nloadBalancer &lt;Object&gt;\r\nLoadBalancer contains the current status of the load-balancer, if one is\r\npresent.\r\n\r\nu70779858@Kubernetes-SRV:~$ minikube addons enable ingress\r\n* ingress est un addon maintenu par Kubernetes. Pour toute question, contactez minikube sur GitHub.\r\nVous pouvez consulter la liste des mainteneurs de minikube sur&nbsp;: https:\/\/github.com\/kubernetes\/minikube\/blob\/master\/OWNERS\r\n- Utilisation de l'image registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.4.1\r\n- Utilisation de l'image registry.k8s.io\/ingress-nginx\/controller:v1.10.1\r\n- Utilisation de l'image registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.4.1\r\n* V\u00e9rification du module ingress...\r\n* Le module 'ingress' est activ\u00e9\r\nu70779858@Kubernetes-SRV:~$<\/pre>\n<p>$ kubectl get namespace<\/p>\n<pre>NAME STATUS AGE\r\ndefault Active 25d\r\ningress-nginx Active 5m17s\r\nkube-node-lease Active 25d\r\nkube-public Active 25d\r\nkube-system Active 25d\r\nkubernetes-dashboard Active 24d<\/pre>\n<p>Les pods associ\u00e9s \u00e0 ce m\u00e9canisme portent le label app.kuberneters.io<\/p>\n<p>$ kubectl -n ingress-nginx get pods -l app.kubernetes.io\/name<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl -n ingress-nginx get pods -l app.kubernetes.io\/name\r\nNAME READY STATUS RESTARTS AGE\r\ningress-nginx-admission-create-l7l9p 0\/1 Completed 0 9m21s\r\ningress-nginx-admission-patch-t5cdb 0\/1 Completed 0 9m21s\r\ningress-nginx-controller-6cbb9754ff-z746c 1\/1 Running 0 9m21s\r\nu70779858@Kubernetes-SRV:~$<\/pre>\n<p>D\u00e9claration d\u2019une r\u00e8gle Ingress<\/p>\n<p>D\u00e9claration d\u2019un objet Ingress est assez similaire \u00e0 celle d\u2019un service :<\/p>\n<p>Fichier .\/mailhog\/ingress.yaml cr\u00e9\u00e9 :<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: networking.k8s.io\/v1\r\nkind: Ingress\r\nmetadata:\r\nlabels:\r\nname: mailhog\r\nspec:\r\nrules:\r\n- http:\r\npaths:\r\n- path: \/\r\npathType: Prefix\r\nbackend:\r\nservice:\r\nname: mailhog\r\nport:\r\nnumber: 8025<\/pre>\n<p>$ kubectl apply -f mailhog\/ingress.yalm<\/p>\n<pre>ingress.networking.k8s.io\/mailhog created<\/pre>\n<h6>Consultation des r\u00e8gles Ingress<\/h6>\n<p>$ kubectl get ingress<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME CLASS HOSTS ADDRESS PORTS AGE\r\nmailhog nginx * 192.168.49.2 80 3m8s<\/pre>\n<p>NAME CLASS HOSTS ADDRESS PORTS AGES<\/p>\n<p>|| mailhog nginx * localhost 80 4m54s<\/p>\n<p>$ minikube ip<\/p>\n<p>&nbsp;<\/p>\n<pre>192.168.49.2<\/pre>\n<h3>Ouvrir une session du serveur KUB-SERVER avec MobaXterm :<\/h3>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7096\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG.png\" alt=\"\" width=\"1051\" height=\"524\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG.png 1051w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG-300x150.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG-1030x514.png 1030w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG-80x40.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG-768x383.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/http192-168-49-2_MAILHOG-705x351.png 705w\" sizes=\"(max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<h4>Interface Mailhog est maintenant accessible depuis un navigateur :<\/h4>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7097\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV.png\" alt=\"\" width=\"856\" height=\"541\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV.png 856w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV-300x190.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV-80x51.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV-768x485.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/MailHog-Mozilla-Firefox_Kubernetes-SRV-705x446.png 705w\" sizes=\"(max-width: 856px) 100vw, 856px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h4>H\u00f4te virtuel et nip.io<\/h4>\n<p>H\u00f4te par d\u00e9faut<\/p>\n<p>Pr\u00e9sentation du m\u00e9canisme de nip.io<\/p>\n<p>IP 192.168.1.67.nip.io<\/p>\n<p>Mailhog.192.168.1.67.nip.io<\/p>\n<h4>Configuration du serveur DNS<\/h4>\n<pre>Adresse DNS 192.168.0.1\r\n\r\n\r\n$ dig +short 192.168.0.1.nip.io\r\n$ nmcli connection show\r\n\r\n\r\n$ nmcli con mod \u00ab connexion filaire 1 \u00bb ipv4.dns \u00ab 8.8.8.8 8.8.8.4\r\n$ nmcli con mod \u00ab connexion filaire 1 \u00bb ipv4.ignore-auto-dns yes\r\n$ nmcli con down \u00ab Connexion filaire 1 \u00bb\r\n$ nmcli con IP \u00ab Connexion filaire 1 \u00ab\r\n$ dig +short 192.168.0.1.nip.io<\/pre>\n<h3>Cr\u00e9ation d\u2019un h\u00f4te virtuel pour Mailhog<\/h3>\n<h4>Modifier le fichier ingress.yaml<\/h4>\n<p>&nbsp;<\/p>\n<pre>apiVersion: networking.k8s.io\/v1\r\nkind: Ingress\r\nmetadata:\r\nlabels:\r\nname: mailhog\r\nspec:\r\nrules:\r\n- host: \"mailhog.192.168.49.2.nip.io\"\r\nhttp:\r\npaths:\r\n- path: \/\r\npathType: Prefix\r\nbackend:\r\nservice:\r\nname: mailhog\r\nport:\r\nnumber: 8025<\/pre>\n<p>&nbsp;<\/p>\n<p>$ kubectl appli -f mailhog\/<\/p>\n<p>$ curl 192.168.49.2<\/p>\n<p>&nbsp;<\/p>\n<pre>&lt;html&gt;\r\n&lt;head&gt;&lt;title&gt;404 Not Found&lt;\/title&gt;&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;center&gt;&lt;h1&gt;404 Not Found&lt;\/h1&gt;&lt;\/center&gt;\r\n&lt;hr&gt;&lt;center&gt;nginx&lt;\/center&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p><span style=\"color: #ff0000;\"><em><strong>Le m\u00e9canisme de publication sur h\u00f4te virtuel est bien en place. Il va permettre de facilement exposer des applications HTTP vers l&rsquo;ext\u00e9rieur.<\/strong><\/em><\/span><\/p>\n<p>&nbsp;<\/p>\n<h1 style=\"text-align: right;\">Chapitre 5<br \/>\nCycle de vie d\u2019un container<br \/>\nDans Kubernetes<\/h1>\n<h2>L\u2019application pourrait installer de plusieurs mani\u00e8res :<\/h2>\n<h6>&#8211; manuellement \u00e0 l\u2019aide de Dashboard de Kubernetes<br \/>\n&#8211; Via la cr\u00e9ation de l\u2019objet \u00e0 l\u2019aide. De kubectl<br \/>\n&#8211; Enfin, \u00e0 l\u2019aide de fichiers de d\u00e9finition des \u00e9l\u00e9ments \u00e0 cr\u00e9er<\/h6>\n<h6>Cycle de vie d\u2019un container au travers de 2 aspects<\/h6>\n<h6>&#8211; la correspondance entre un pod et son container au niveau du moteur Docker<br \/>\n&#8211; Le m\u00e9canisme de surveillance des containers<\/h6>\n<h2>Gestion des crash d\u2019application<\/h2>\n<h3>Consultation de l\u2019\u00e9tat des pods<\/h3>\n<p>&nbsp;<\/p>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-b44849b6f-khwt9 1\/1 Running 0 2d6h<\/pre>\n<p>&nbsp;<\/p>\n<h3>Connexion \u00e0 un pod<\/h3>\n<p>$ kubctl exec -it deployment\/mailhog &#8212; sh<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ k exec -it deployment\/mailhog -- sh\r\n~ $ ps -ef\r\nPID USER TIME COMMAND\r\n1 mailhog 0:13 MailHog\r\n14 mailhog 0:00 sh\r\n20 mailhog 0:00 ps -ef\r\n~ $<\/pre>\n<p>$ mkdir \/tmp\/test<br \/>\n$ ls -ld \/tmp\/test<\/p>\n<p>&nbsp;<\/p>\n<pre>PID USER TIME COMMAND\r\n1 mailhog 0:13 MailHog\r\n14 mailhog 0:00 sh\r\n20 mailhog 0:00 ps -ef\r\n~ $ mkdir \/tmp\/test\r\n~ $ ls -ld \/tmp\/test\r\ndrwxr-xr-x 2 mailhog mailhog 4096 Aug 26 14:21 \/tmp\/test<\/pre>\n<p>&nbsp;<\/p>\n<h3>Container associ\u00e9 \u00e0 MailHog<\/h3>\n<p>&nbsp;<\/p>\n<p>$ kubectl get pods -l app=mailhog -o jsonpath=\u00a0\u00bb{.items[*].status.containerStatuses[*].containerID}\u00a0\u00bb<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl get pods -l app=mailhog -o jsonpath=\"{.items[*].status.containerStatuses[*].containerID}\"\r\ncontainerd:<span style=\"color: #ff0000;\">\/\/6a520ea5128e7f8914626c13b7c0c3bde7c942b8e225230d7251e31be0a0f37cu70779858@Kubernetes<\/span>-SRV:~$<\/pre>\n<p>Comportement en cas de Crash<\/p>\n<p>Killer le process de MailHog<\/p>\n<p>Constat : Le process a d\u00e9marr\u00e9 automatiquement<\/p>\n<p>&nbsp;<\/p>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl get pods -l app=mailhog\r\nNAME READY STATUS RESTARTS AGE\r\nmailhog-b44849b6f-khwt9 1\/1 Running 4 (5m45s ago) 5d<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>&#8211; <\/strong>Un pr\u00e9fixe <strong>(<span style=\"color: #ff0000;\">containerd:<\/span>\/\/)<\/strong><\/p>\n<p><strong>&#8211; <\/strong>Un Identifiant unique <strong>: \/\/6a520ea5128e7f8914626c13b7c0c3bde7c942b8e225230d7251e31be0a0f37cu70779858@Kubernetes-SRV.<\/strong><\/p>\n<p><strong>Cet identifiant est celui correspondant au moteur de container (ici Containerd)<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ ps -ef |grep -i mailhog\r\nu707798+ 835215 721591 1 09:27 ? 00:00:00 MailHog\r\nu707798+ 835254 834140 0 09:27 pts\/1 00:00:00 grep --color=auto -i mailhog\r\nu70779858@Kubernetes-SRV:~$ kill 835215\r\n\r\nu707798+ 835387 721591 1 09:31 ? 00:00:00 MailHog\r\nu707798+ 835426 834140 0 09:31 pts\/1 00:00:00 grep --color=auto -i mailhog<\/pre>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl get pods -l app=mailhog -o jsonpath=\"{.items[*].status.containerStatuses[*].containerID}\"\r\ncontainerd:\/\/72c035a1530b03c3f8664e8c9fb490f842511feac76e8ad3636e3b3d52b1521eu70779858@Kubernetes-SRV:~$<\/pre>\n<p>ce n&rsquo;est plus le m\u00eame ID du container : \/\/72c035a1530b03c3f8664e8c9fb490f842511feac76e8ad3636e3b3d52b1521eu7077985<\/p>\n<p>&nbsp;<\/p>\n<h3>Etat du container apr\u00e8s red\u00e9marrage du pod<\/h3>\n<p>&nbsp;<\/p>\n<p>$ kubectl exec -it deployment\/mailhog &#8212; sh<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl exec -it deployment\/mailhog -- sh\r\n~ $ ls -ld \/tmp\/test\r\nls: \/tmp\/test: No such file or directory\r\n~ $<\/pre>\n<h3>Container vu depuis Containerd (Minikube)<\/h3>\n<p>&nbsp;<\/p>\n<p>$ ps -ef |grep -i mailhog<\/p>\n<pre>u707798+ 835387 721591 0 09:31 ? 00:00:00 MailHog\r\nu707798+ 836070 834140 0 09:51 pts\/1 00:00:00 grep --color=auto -i mailhog<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ kill -9 835387<\/p>\n<p>u70779858@Kubernetes-SRV:~$ ps -ef |grep -i mailhog<\/p>\n<pre>u707798+ 836140 721591 0 09:52 ? 00:00:00 MailHog\r\nu707798+ 836180 834140 0 09:52 pts\/1 00:00:00 grep --color=auto -i mailhog<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ kubectl get pods -l app=mailhog -o jsonpath=\u00a0\u00bb{.items[*].status.containerStatuses[*].containerID}\u00a0\u00bb<\/p>\n<pre>containerd:\/\/<span style=\"color: #ff0000;\"><strong>ecc0c44c605e133a396cac35cb5244b20e4cd86d079979efe77c2c083b6cbbd7<\/strong><\/span>u70779858@Kubernetes-SRV:~$<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ minikube ssh<\/p>\n<p>docker@minikube:~$ <strong>sudo crictl inspect 126010f1d0ab0<\/strong><\/p>\n<p>docker@minikube:~$ <strong>sudo crictl inspect <span style=\"color: #ff0000;\">ecc0c44c605e133a396cac35cb5244b20e4cd86d079979efe77c2c083b6cbbd7<\/span><\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre>docker@minikube:~$ sudo crictl inspect ecc0c44c605e133a396cac35cb5244b20e4cd86d079979efe77c2c083b6cbbd7\r\n{\r\n\"status\": {\r\n\"id\": \"ecc0c44c605e133a396cac35cb5244b20e4cd86d079979efe77c2c083b6cbbd7\",\r\n\"metadata\": {\r\n\"attempt\": 5,\r\n\"name\": \"mailhog\"\r\n},\r\n\"state\": \"CONTAINER_RUNNING\",\r\n\"createdAt\": \"2024-08-29T07:52:16.99],\r\n\r\n\r\n\"maskedPaths\": [\r\n\"\/proc\/acpi\",\r\n\"\/proc\/kcore\",\r\n\"\/proc\/keys\",\r\n\"\/proc\/latency_stats\",\r\n\"\/proc\/timer_list\",\r\n\"\/proc\/timer_stats\",\r\n\"\/proc\/sched_debug\",\r\n\"\/proc\/scsi\",\r\n\"\/sys\/firmware\"\r\n],\r\n\r\n ]\r\n}\r\n],\r\n<span style=\"color: #ff0000;\"><strong>\"annotations\": {<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.container-name\": \"mailhog\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.container-type\": \"container\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.image-name\": \"docker.io\/mailhog\/mailhog:latest\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.sandbox-id\": \"9d0ff9f9095f688525269520c584a0b3492997e3fcd6febd8fbf321eeb2d02b1\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.sandbox-name\": \"mailhog-b44849b6f-khwt9\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.sandbox-namespace\": \"default\",<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>\"io.kubernetes.cri.sandbox-uid\": \"6e0f6f06-c040-4f88-ba2d-a5a86c5300e1\"<\/strong><\/span>\r\n<span style=\"color: #ff0000;\"><strong>},<\/strong><\/span>\r\n\"linux\": {\r\n\r\n\"readonlyPaths\": [\r\n\"\/proc\/asound\",\r\n\"\/proc\/bus\",\r\n\"\/proc\/fs\",\r\n\"\/proc\/irq\",\r\n\"\/proc\/sys\",\r\n\"\/proc\/sysrq-trigger\"\r\n]\r\n}\r\n}\r\n}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>docker@minikube:~$ sudo crictl ps &#8211;all &#8211;label io.kubernetes.container.name=mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>docker@minikube:~$ sudo crictl ps --all --label io.kubernetes.container.name=mailhog\r\nCONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD\r\necc0c44c605e1 4de68494cd0db 20 minutes ago Running mailhog 5 9d0ff9f9095f6 mailhog-b44849b6f-khwt9\r\n72c035a1530b0 4de68494cd0db 41 minutes ago Exited mailhog 4 9d0ff9f9095f6 mailhog-b44849b6f-khwt9<\/pre>\n<p>&nbsp;<\/p>\n<h3>Attention au nettoyage<\/h3>\n<h4>Dans le cas de kubernetes , le crash d&rsquo;un container va donc avoir 2 cons\u00e9quences .<\/h4>\n<h5>&#8211; la cr\u00e9ation d&rsquo;un nouveau container<\/h5>\n<h5>&#8211; la pr\u00e9sence d&rsquo;un container arr\u00eat\u00e9<\/h5>\n<h2>Etat d&rsquo;un container<\/h2>\n<h3>Pourquoi scruter l&rsquo;\u00e9tat d&rsquo;un container ?<\/h3>\n<h4>Un process peut \u00eatre :<\/h4>\n<ul>\n<li>\n<h5>soit dans un \u00e9tat fig\u00e9<\/h5>\n<\/li>\n<li>\n<h5>soit dans un boucle infini<\/h5>\n<\/li>\n<li>\n<h5>soit dans un \u00e9tat satur\u00e9<\/h5>\n<\/li>\n<\/ul>\n<h4>V\u00e9rification de la pr\u00e9sence d&rsquo;un process :<\/h4>\n<ul>\n<li>\n<h5>Surveiller la pr\u00e9sence d&rsquo;un port d&rsquo;\u00e9coute<\/h5>\n<\/li>\n<li>\n<h5>Surveiller la pr\u00e9sence d&rsquo;un fichier<\/h5>\n<\/li>\n<li>\n<h5>R\u00e9aliser une connexion HTTP<\/h5>\n<\/li>\n<li>\n<h5>Se connecter \u00e0 une base de donn\u00e9es<\/h5>\n<\/li>\n<li>\n<h5>Faire appel \u00e0 une page de diagnostic<\/h5>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>Readines vs Liveness<\/h3>\n<h4>Kubernetes permet de d\u00e9finir 2 types de surveillance sur un container<\/h4>\n<ul>\n<li>\n<h5>tests Readines : container est-il pr\u00eat<\/h5>\n<\/li>\n<li>\n<h5>tests liveness : container est-il toujours utilisable<\/h5>\n<\/li>\n<li>\n<h5>TEST SUPPLEMENTAIRE : startupProbe lors de d\u00e9marage du container ( faire appel \u00e0 ce champ pour les containers ayant une phase de d\u00e9marrage un peu longue<\/h5>\n<\/li>\n<\/ul>\n<h3>V\u00e9rification de la pr\u00e9sence d&rsquo;un port<\/h3>\n<h4>Fichier mailhog-tcp-port.yaml<\/h4>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\nlabels:\r\napp: mailhog\r\nname: mailhog\r\nspec:\r\nreplicas: 1\r\nselector:\r\nmatchLabels:\r\napp: mailhog\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mailhog\r\nspec:\r\ncontainers:\r\n- image: mailhog\/mailhog\r\nname: mailhog\r\nreadinessProbe:\r\ntcpSocket:\r\nport: 1025\r\nlivenessProbe:\r\ntcpSocket:\r\nport: 8025<\/pre>\n<p>$ kubectl apply -f mailhog\/mailhog-tcp-port.yaml<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl apply -f mailhog\/mailhog-tcp-port.yaml\r\ndeployment.apps\/mailhog configured<\/pre>\n<h3>Etat d&rsquo;indisponibilit\u00e9 sur un pod non pr\u00eat<\/h3>\n<p>&nbsp;<\/p>\n<h4>Nouvelle de d\u00e9finition du champ readinessProbe :<\/h4>\n<ul>\n<li>\n<h5>readinessProbe:<\/h5>\n<\/li>\n<li>\n<h5>&nbsp; tcpSocket:<\/h5>\n<\/li>\n<li>\n<h5>&nbsp;&nbsp;&nbsp;&nbsp; port: 2025<\/h5>\n<\/li>\n<\/ul>\n<h4>AVANT MODIF mailhog-tcp-port.yaml :<\/h4>\n<p>$ k get pods -l app=mailhog<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-6d798f5dd-mj54x <span style=\"color: #ff0000;\"><strong>1\/1<\/strong> <\/span>Running 0 3m54s<\/pre>\n<h5>APRES MODIF mailhog\/mailhog-tcp-port.yaml :<\/h5>\n<p>u70779858@Kubernetes-SRV:~$ vim mailhog\/mailhog-tcp-port.yaml<br \/>\nu70779858@Kubernetes-SRV:~$ kubectl apply -f mailhog\/mailhog-tcp-port.yaml<br \/>\ndeployment.apps\/mailhog configured<\/p>\n<p>u70779858@Kubernetes-SRV:~$ k get pods -l app=mailhog<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-6d798f5dd-mj54x 1\/1 Running 0 4m58s\r\nmailhog-86f6dc75dc-jjgmp <span style=\"color: #ff0000;\"><strong>0\/1<\/strong> <\/span>Running 0 6s<\/pre>\n<h4>Le point int\u00e9ressant est ici le champ READY du nouveau pod mailhog-86f6dc75dc-jjgmp qui reste ind\u00e9finiment \u00e0 la valeur 0\/1 . Cette indication indique que le pod n&rsquo;est pas pr\u00eat pour recevoir le trafic.<\/h4>\n<p>&nbsp;<\/p>\n<h3>Test d&rsquo;indisponibilit\u00e9 sur un pod en mauvaise sant\u00e9 : PAGE 168-188<\/h3>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Allocation de ressources \u00e0 l&rsquo;application \u00e0 l&rsquo;application MailHog<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Modifier le fichier deployment.yaml<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/i.imgur.com\/bhf1akA.gif\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7108\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources3.png\" alt=\"\" width=\"652\" height=\"448\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources3.png 652w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources3-300x206.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources3-80x55.png 80w\" sizes=\"(max-width: 652px) 100vw, 652px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~$ kubectl apply -f mailhog\/deployment.yaml<\/p>\n<pre>deployment.apps\/mailhog configured<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ k get pods -l app=mailhog<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-7d9896576-v6tt9 1\/1 Running 0 25s<\/pre>\n<h3>Comportement en cas de saturation des ressources<\/h3>\n<h4>Demande trop importanate de CPU<\/h4>\n<ul>\n<li>\n<h5>Modification du fichier : deployment.yaml<\/h5>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7104\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources2.png\" alt=\"\" width=\"701\" height=\"441\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources2.png 701w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources2-300x189.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/08\/ressources2-80x50.png 80w\" sizes=\"(max-width: 701px) 100vw, 701px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~$ kubectl apply -f mailhog\/deployment.yaml<\/p>\n<pre>deployment.apps\/mailhog configured<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ k get pods -l app=mailhog<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-7c694f6b56-xdvfs 0\/1 ContainerCreating 0 6s\r\nmailhog-7d9896576-v6tt9 1\/1 Running 0 5m40s<\/pre>\n<p>Creer le fichier : mailhog-deployment.yaml<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/bhf1akA.gif\"><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~$ kubectl apply -f .\/mailhog<\/p>\n<pre>deployment.apps\/mailhog configured\r\ningress.networking.k8s.io\/mailhog configured\r\ndeployment.apps\/mailhog configured\r\ndeployment.apps\/mailhog configured\r\nservice\/mailhog unchanged<\/pre>\n<p>u70779858@Kubernetes-SRV:~$ k get pods -l app=mailhog<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-7bc6c6fdb8-8525t 1\/1 Running 0 4m48s<\/pre>\n<p>&nbsp;<\/p>\n<h3>Consultation des priorit\u00e9s des pods<\/h3>\n<ul>\n<li>\n<h5>La d\u00e9finition de la classe de priorit\u00e9 sur un pod se fait \u00e0 l&rsquo;aide du champ priorityClassName.<\/h5>\n<\/li>\n<\/ul>\n<p>$ kubectl describe pods -1 app-mailhog<\/p>\n<p>Dans le cas o\u00f9 le pod n&rsquo;aurait pas de classe de priorit\u00e9, le champ Priority- ClassName prendra la&nbsp;valeur&nbsp;&lt;none&gt;.<\/p>\n<p>&nbsp;<\/p>\n<p>La r\u00e9cup\u00e9ration de l&rsquo;ensemble des classes de priorit\u00e9 des pods du cluster peut se faire \u00e0 l&rsquo;aide de la commande kubectl suivie des options suivantes :<\/p>\n<p>&#8211; Une option de s\u00e9lection de l&rsquo;espace de noms syst\u00e8me (-n kube-system).<\/p>\n<p>L&rsquo;option -o suivie de l&rsquo;option custom-columns suivie des colonnes<\/p>\n<p>Les instructions get pods.<\/p>\n<p>suivantes :<\/p>\n<p>&#8211; NAME : r\u00e9cup\u00e9ration du nom du pod (.metadata.name).<\/p>\n<p>&#8211; PRIORITY : r\u00e9cup\u00e9ration de la classe (.spec.priorityClassName).<\/p>\n<p>&nbsp;<\/p>\n<p>Remarque<\/p>\n<p>Pour r\u00e9cup\u00e9rer l&rsquo;ensemble des pods, utilisez l&rsquo;option &#8211;all-namespaces. La commande \u00e0 lancer prenant en compte ces indications:<\/p>\n<p>$ kubectl get pods -n kube-system -o custom-columns=NAME: .metadata.name, \\ PRIORITY:.spec.priorityClassName<\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl get pods -n kube-system -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName\r\nNAME PRIORITY\r\ncoredns-6d4b75cb6d-cp7st system-cluster-critical\r\netcd-minikube system-node-critical\r\nkindnet-gfc94 &lt;none&gt;\r\nkube-apiserver-minikube system-node-critical\r\nkube-controller-manager-minikube system-node-critical\r\nkube-proxy-248nb system-node-critical\r\nkube-scheduler-minikube system-node-critical\r\nmetrics-server-8cf8b7f65-9b5v2 system-cluster-critical\r\nstorage-provisioner &lt;none&gt;<\/pre>\n<p>Les pods critiques pour le syst\u00e8me sont bien affect\u00e9s \u00e0 une classe de priorit\u00e9 :<\/p>\n<p>&#8211; La classe system-node-critical pour les pods Calico g\u00e9rant le r\u00e9seau.<\/p>\n<p>&#8211; La classe system-cluster-critical pour le pod CalicoTypha.<\/p>\n<p>Les pods de gestion du r\u00e9seau ont la priorit\u00e9 la plus grande tandis que le pod Calico Typha (affect\u00e9 au stockage de donn\u00e9es pour Calico) est l\u00e9g\u00e8rement En cas de conflit entre ces deux types de pods, le pod Typha sera r\u00e9affect\u00e9 sur un autre noeud tandis que le pod de gestion du r\u00e9seau Calico restera en<\/p>\n<p>moins prioritaire.<\/p>\n<h3>Cr\u00e9ation d&rsquo;une classe de priorit\u00e9<\/h3>\n<p>Cr\u00e9ation d&rsquo;une classe : D\u00e9claration contenant les indications suivantes.<\/p>\n<p>&#8211; La version d&rsquo;API (apiVersion).<\/p>\n<p>&#8211; Un champ metadata avec le nom de la classe (champ name).<\/p>\n<p>&#8211; Un champ description.<\/p>\n<p>&#8211; Un champ value avec un entier donnant le priorit\u00e9 relative<\/p>\n<p>Pour une classe custom-priority de priorit\u00e9 100 000 :<\/p>\n<ul>\n<li>\n<h4>Cr\u00e9ation le fichier sous le nom custom-priority-class.yaml<\/h4>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<pre>apiVersion: scheduling.k8s.io\/v1\r\n\r\nkind: PriorityClass\r\n\r\nmetadata:\r\n\r\n   name: custom-priority\r\n\r\ndescription: Custom priority class.\r\n\r\nvalue: 100000<\/pre>\n<p>$ kubectl apply -f custom-priority-class.yaml<\/p>\n<p>$ kubectl get priorityclasses<\/p>\n<pre>u70779858@Kubernetes-SRV:~$ kubectl get priorityclasses\r\nNAME VAL<\/pre>\n<h3>Affectation d&rsquo;une classe de priorit\u00e9 personnalis\u00e9e<\/h3>\n<ul>\n<li>\n<h5>Comme indiqu\u00e9 plus haut, l&rsquo;affectation de la classe de priorit\u00e9 se fait dans le champ priorityClassName associ\u00e9 \u00e0 un pod.<\/h5>\n<\/li>\n<\/ul>\n<p>Reprenez le fichier associ\u00e9 au d\u00e9ploiement de MailHog afin d&rsquo;y ajouter ce champ \u00e0 la valeur custom-priority.<\/p>\n<p>Ci-dessous la d\u00e9claration suite \u00e0 cet ajout :<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/priority.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7114\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/priority.png\" alt=\"\" width=\"565\" height=\"432\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/priority.png 565w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/priority-300x229.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/priority-80x61.png 80w\" sizes=\"(max-width: 565px) 100vw, 565px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h5>Sauvegardez le fichier sous le nom mailhog.yaml et appliquez-le :<\/h5>\n<p>$ kubectl apply -f mailhog.yaml<\/p>\n<h5><span style=\"color: #ff0000;\"><em>Dor\u00e9navant, en cas de conflit avec un autre d\u00e9ploiement, MailHog sera prioritaire<\/em><\/span><\/h5>\n<h3>&nbsp;Remarque sur les classes de priorit\u00e9 par d\u00e9fault<\/h3>\n<ul>\n<li>\n<h5>Les classes de priori\u00e9 du cluster ont des niveaux tr\u00e8s importants. Afin d&rsquo;\u00e9viter qu&rsquo;une charge applicative puisse prendre le pas sur une charge syst\u00e8me, ces Les classes de priorit\u00e9 du cluster ont des niveaux tr\u00e8s importants. Afin d&rsquo;\u00e9viter classes ne peuvent pas \u00eatre affect\u00e9es \u00e0 un pod en dehors de l&rsquo;espace de noms kube-system.<\/h5>\n<\/li>\n<li>\n<h5>Dans le cas o\u00f9 vous tenteriez d&rsquo;effectuer cette affectation, le cluster Kuber- netes refuserait de le faire. Dans le cas d&rsquo;un d\u00e9ploiement, l&rsquo;erreur se trouverait au niveau de l&rsquo;objet interm\u00e9diaire ReplicaSet.<\/h5>\n<\/li>\n<li>\n<h5>Cette consultation peut se faire \u00e0 l&rsquo;aide de la commande suivante (pour l&rsquo;application MailHog) :<\/h5>\n<\/li>\n<\/ul>\n<p>$ kubectl describe rs -l app=mailhog<\/p>\n<p>$ kubectl get pods -l app=mailhog<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~$ k get pods -l app=mailhog -o yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: v1\r\nitems:\r\n- apiVersion: v1\r\nkind: Pod\r\nmetadata:\r\ncreationTimestamp: \"2024-09-02T13:22:48Z\"\r\ngenerateName: mailhog-b558bd46-\r\nlabels:\r\napp: mailhog\r\npod-template-hash: b558bd46\r\nname: mailhog-b558bd46-xddmj\r\nnamespace: default\r\nownerReferences:\r\n- apiVersion: apps\/v1\r\nblockOwnerDeletion: true\r\ncontroller: true\r\nkind: ReplicaSet\r\nname: mailhog-b558bd46\r\nuid: dd626857-233b-4226-8075-126ee8677905\r\nresourceVersion: \"1844580\"\r\nuid: 60bb8232-8f74-4ae6-89ef-15f0fa2aa020\r\nspec:\r\ncontainers:\r\n- image: mailhog\/mailhog\r\nimagePullPolicy: Always\r\nname: mailhog\r\nresources:\r\nlimits:\r\ncpu: 400m\r\nmemory: 128Mi\r\nrequests:\r\ncpu: 150m\r\nmemory: 64Mi\r\nterminationMessagePath: \/dev\/termination-log\r\nterminationMessagePolicy: File\r\nvolumeMounts:\r\n- mountPath: \/var\/run\/secrets\/kubernetes.io\/serviceaccount\r\nname: kube-api-access-4vzsl\r\nreadOnly: true\r\ndnsPolicy: ClusterFirst\r\nenableServiceLinks: true\r\nnodeName: minikube\r\npreemptionPolicy: PreemptLowerPriority\r\npriority: 100000\r\npriorityClassName: custom-priority\r\nrestartPolicy: Always\r\nschedulerName: default-scheduler\r\nsecurityContext: {}\r\nserviceAccount: default\r\nserviceAccountName: default\r\nterminationGracePeriodSeconds: 30\r\ntolerations:\r\n- effect: NoExecute\r\nkey: node.kubernetes.io\/not-ready\r\noperator: Exists\r\ntolerationSeconds: 300\r\n- effect: NoExecute\r\nkey: node.kubernetes.io\/unreachable\r\noperator: Exists\r\ntolerationSeconds: 300\r\nvolumes:\r\n- name: kube-api-access-4vzsl\r\nprojected:\r\ndefaultMode: 420\r\nsources:\r\n- serviceAccountToken:\r\nexpirationSeconds: 3607\r\npath: token\r\n- configMap:\r\nitems:\r\n- key: ca.crt\r\npath: ca.crt\r\nname: kube-root-ca.crt\r\n- downwardAPI:\r\nitems:\r\n- fieldRef:\r\napiVersion: v1\r\nfieldPath: metadata.namespace\r\npath: namespace\r\nstatus:\r\nconditions:\r\n- lastProbeTime: null\r\nlastTransitionTime: \"2024-09-02T13:22:48Z\"\r\nstatus: \"True\"\r\ntype: Initialized\r\n- lastProbeTime: null\r\nlastTransitionTime: \"2024-09-02T13:22:52Z\"\r\nstatus: \"True\"\r\ntype: Ready\r\n- lastProbeTime: null\r\nlastTransitionTime: \"2024-09-02T13:22:52Z\"\r\nstatus: \"True\"\r\ntype: ContainersReady\r\n- lastProbeTime: null\r\nlastTransitionTime: \"2024-09-02T13:22:48Z\"\r\nstatus: \"True\"\r\ntype: PodScheduled\r\ncontainerStatuses:\r\n- containerID: containerd:\/\/f4392f5ac202ae000f8363b323d4738bfab1b5e36210d44067894ef3bd77fb12\r\nimage: docker.io\/mailhog\/mailhog:latest\r\nimageID: docker.io\/mailhog\/mailhog@sha256:8d76a3d4ffa32a3661311944007a415332c4bb855657f4f6c57996405c009bea\r\nlastState: {}\r\nname: mailhog\r\nready: true\r\nrestartCount: 0\r\nstarted: true\r\nstate:\r\nrunning:\r\nstartedAt: \"2024-09-02T13:22:51Z\"\r\nhostIP: 192.168.49.2\r\nphase: Running\r\npodIP: 10.244.0.48\r\npodIPs:\r\n- ip: 10.244.0.48\r\nqosClass: Burstable\r\nstartTime: \"2024-09-02T13:22:48Z\"\r\nkind: List\r\nmetadata:\r\nresourceVersion: \"\"<\/pre>\n<p>&nbsp;<\/p>\n<p>Ci-dessous un exemple de message d&rsquo;erreur indiquant l&rsquo;origine du probl\u00e8me:<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre>Warning FailedCreate 2s (x14 over 43s). replicaset-controller\r\n\r\ncreating: pods \"mailhog-5b6ddd9f6-\" is forbidden: pods with system-cluster- critical priorityClass is not permitted in default&nbsp;namespace<\/pre>\n<h1>&nbsp;<\/h1>\n<h1 style=\"text-align: right;\">Chapitre 6<\/h1>\n<h1 style=\"text-align: right;\">Persistance des donn\u00e9es<\/h1>\n<h2>Objectifs du chapitre et pr\u00e9requis<\/h2>\n<ul>\n<li>\n<h5>Ce chapitre pr\u00e9sente la persistance des donn\u00e9es dans Kubernetes. En effet, le contenu d&rsquo;un container n&rsquo;a pas vocation \u00e0 perdurer. Ce m\u00e9canisme est l\u00e0 pour permettre de conserver une information lorsque c&rsquo;est n\u00e9cessaire (bases de donn\u00e9es, serveurs de fichiers, etc.).<\/h5>\n<\/li>\n<li>\n<h5>Le chapitre abordera deux points de vue :<\/h5>\n<\/li>\n<\/ul>\n<h6>&#8211; L&rsquo;utilisateur faisant appel aux volumes persistants.<\/h6>\n<h6>&#8211; L&rsquo;administrateur mettant en place ce m\u00e9canisme.<\/h6>\n<h2 style=\"text-align: right;\">Chapitre 6<\/h2>\n<h2 style=\"text-align: right;\">Persistance des donn\u00e9es<\/h2>\n<h4 style=\"text-align: right;\">Page 189<\/h4>\n<h3>&nbsp;2.1Origine du besoin<\/h3>\n<ul>\n<li>\n<h5>Dans ce qui a pr\u00e9c\u00e9d\u00e9, vous avez pu aborder le cycle de vie du container dans Kubernetes. Un point important \u00e0 retenir est qu&rsquo;un container a une dur\u00e9e de vie relativement courte et, qu&rsquo;en l&rsquo;\u00e9tat, il n&rsquo;est pas possible de conserver&nbsp;de&nbsp;la&nbsp;donn\u00e9e.<\/h5>\n<\/li>\n<li>\n<h5>Pour r\u00e9pondre \u00e0 ce besoin, Kubernetes peut mettre \u00e0 disposition des espaces de stockage externes au cluster. Ce m\u00e9canisme s&rsquo;appuie sur la notion de volume de donn\u00e9es persistant (Persistent Volume).<\/h5>\n<\/li>\n<\/ul>\n<h3>2.2 Utilisation d&rsquo;un volume persistant externe<\/h3>\n<ul>\n<li>\n<h5>L&rsquo;utilisation d&rsquo;un volume persistant se fait au sein de la d\u00e9claration d&rsquo;un pod. Une premi\u00e8re solution pourrait \u00eatre de passer par un service externe comme avec un point de montage NFS.<\/h5>\n<\/li>\n<li>\n<h5>Cette d\u00e9claration de persistance de donn\u00e9es se d\u00e9finira en deux parties :<\/h5>\n<\/li>\n<\/ul>\n<h5>\u2013 Un r\u00e9f\u00e9rencement au niveau du pod dans le champ volumes.<\/h5>\n<h5>\u2013 une indication de l&#8217;emplacement du montage au sein du container.<\/h5>\n<ul>\n<li>\n<h5>Le r\u00e9f\u00e9rencement d&rsquo;un volume NFS au niveau d&rsquo;un pod se pr\u00e9sentera sous la forme suivante :<\/h5>\n<\/li>\n<\/ul>\n<pre>spec:\r\n\r\nvolumes:\r\n\r\n- name: nfs\r\n\r\nnfs:\r\n\r\n# URL for the NFS server\r\n\r\nserver: 192.168.0.1\r\n\r\npath: \/<\/pre>\n<ul>\n<li>\n<h5>Le montage au niveau du container se pr\u00e9sentera ainsi :<\/h5>\n<\/li>\n<\/ul>\n<pre>spec:\r\n\r\ncontainers:\r\n\r\nname: mailhog\r\n\r\nimage: mailhog\/mailhog\r\n\r\n# Mount the NFS volume in the container volumeMounts:\r\n\r\nname: nfs\r\n\r\nmountPath:&nbsp;\/maildir<\/pre>\n<h3>2.3 Volumes persistants<\/h3>\n<h4>2.3.1 Structure du volume persistant<\/h4>\n<ul>\n<li>\n<h5>En plus de faire appel \u00e0 des services externes, il est possible de r\u00e9f\u00e9rencer des objets de type volume persistant (Persistent Volume). Ces derniers ont la structure suivante :<\/h5>\n<\/li>\n<\/ul>\n<h6>&#8211; Une version et un type (apiVersion et kind).<\/h6>\n<h6>&#8211; Des m\u00e9tadonn\u00e9es (champ metadata).<\/h6>\n<h6>&#8211; Une sp\u00e9cification contenant :<\/h6>\n<h6>&#8211; le type d&rsquo;acc\u00e8s,<\/h6>\n<h6>&#8211; la capacit\u00e9 de stockage,<\/h6>\n<h6>&#8211; la classe du volume persistant (positionner \u00e0 manual pour l&rsquo;exemple), &#8211; les caract\u00e9ristiques du stockage.<\/h6>\n<ul>\n<li>\n<h5>Ci-dessous un exemple de stockage portant le nom de pv-mailhog s&rsquo;appuyant sur un r\u00e9pertoire de la machine h\u00f4te. Ce volume a une capacit\u00e9 d\u00e9clar\u00e9e de 10 Go:<\/h5>\n<\/li>\n<\/ul>\n<pre>apiVersion: v1\r\nkind: PersistentVolume\r\nmetadata:\r\n   name: pv-mailhog\r\nspec:\r\n   accessModes:\r\n     - ReadWriteOnce\r\n   storageClassName: manual\r\n   capacity:\r\n     storage: 10Mi hostPath:\r\npath: \/maildir<\/pre>\n<ul>\n<li>\n<h5>Sauvegardez cette d\u00e9claration dans le fichier <em><span style=\"color: #ff0000;\">pv-mailhog.yaml.<\/span><\/em><\/h5>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7132\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml.png\" alt=\"\" width=\"780\" height=\"412\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml.png 780w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml-300x158.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml-80x42.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml-768x406.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml-710x375.png 710w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv-yaml-705x372.png 705w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/a><\/p>\n<h3>2.3.2 Cr\u00e9ation du volume persistant<\/h3>\n<ul>\n<li>La d\u00e9claration r\u00e9alis\u00e9e, l&rsquo;application de cette d\u00e9claration se fera \u00e0 l&rsquo;aide de la commande kubectl suivie des indications suivantes :<\/li>\n<\/ul>\n<p>&#8211; Le mot-cl\u00e9 apply.<\/p>\n<p>&#8211; L&rsquo;option -f suivie du nom de fichier.<\/p>\n<ul>\n<li>Ci-dessous la commande correspondante:<\/li>\n<\/ul>\n<p>$ kubectl apply -f pv-mailhog.yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>persistentvolume\/pv-mailhog created<\/pre>\n<p>&nbsp;<\/p>\n<h3>2.4 Persistance de donn\u00e9es avec MailHog<\/h3>\n<h4>2.4.1 Op\u00e9rations \u00e0 r\u00e9aliser<\/h4>\n<p>Par d\u00e9faut, lorsque MailHog re\u00e7oit un message, ce dernier le stocke en local dans un r\u00e9pertoire de travail. Malheureusement, lorsque le pod est relanc\u00e9 ou red\u00e9marr\u00e9, la donn\u00e9e se perd.<\/p>\n<p>Afin de faire face \u00e0 ce probl\u00e8me, ajoutez un point de montage dans le contai- ner de MailHog.<\/p>\n<p>Pour cela, deux modifications seront r\u00e9alis\u00e9es dans l&rsquo;objet d\u00e9ploiement :<\/p>\n<p>Utilisation d&rsquo;un volume persistant.<\/p>\n<p>&#8211; Modification des options de lancement de MailHog.<\/p>\n<p>En plus de ces modifications dans le d\u00e9ploiement, vous devrez \u00e9galement d\u00e9- clarer un objet permettant de r\u00e9f\u00e9rencer le volume persistant.<\/p>\n<p>Cet objet fera le lien entre le volume persistant et la d\u00e9claration d&rsquo;utilisation.<\/p>\n<h4>2.4.2 D\u00e9claration de l&rsquo;objet PersistentVolumeClaim<\/h4>\n<p>&nbsp;<\/p>\n<p>La demande de volume persistant (PersistentVolumeClaim ou son raccourci pvc) r\u00e9clame un certain nombre d&rsquo;informations:<\/p>\n<p>Les champs apiVersion et kind.<\/p>\n<p>&#8211; Les m\u00e9tadonn\u00e9es (metadata).<\/p>\n<p>&#8211; Les sp\u00e9cifications de l&rsquo;objet :<\/p>\n<p>&#8211; le mode d&rsquo;acc\u00e8s,<\/p>\n<p>\u2013 la classe pr\u00e9cis\u00e9e pr\u00e9c\u00e9demment (manual),<\/p>\n<p>\u2013 la quantit\u00e9 de ressources demand\u00e9es,<\/p>\n<p>&#8211; le nom du volume persistant.<\/p>\n<p>Dans le cas d&rsquo;un objet PersistentVolumeClaim portant le nom de mailhog pour un volume de 10 Go, la d\u00e9claration sera la suivante :<\/p>\n<pre>apiVersion: v1\r\nkind: PersistentVolumeClaim\r\nmetadata:\r\nname: pvc-mailhog\r\nspec:\r\naccessModes:\r\n- ReadWriteOnce\r\nstorageClassName: manual\r\nresources:\r\nrequests:\r\nstorage: 10Gi\r\nvolumeName: pv-mailhog<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7133\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml.png\" alt=\"\" width=\"779\" height=\"426\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml.png 779w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml-300x164.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml-80x44.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml-768x420.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-yaml-705x386.png 705w\" sizes=\"(max-width: 779px) 100vw, 779px\" \/><\/a><\/p>\n<p>$ kubectl apply -f pvc-mailhog.yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>persistentvolumeclaim\/pvc-mailhog&nbsp;created<\/pre>\n<p>&nbsp;<\/p>\n<h4>2.4.3 \u00c9tat des objets de volume persistant<\/h4>\n<p>La consultation de ces objets se fait traditionnellement avec les m\u00e9thodes get ou describe.<\/p>\n<p>Ci-dessous la commande pour consulter la liste des volumes persistants<\/p>\n<p>(Persistent Volume ou pv):<\/p>\n<p>$ kubectl get persistentvolume<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\r\npv-mailhog 10Gi RWO Retain Bound default\/pvc-mailhog manual 4h8m<\/pre>\n<p>&nbsp;<\/p>\n<p>L&rsquo;ensemble de ces champs va donner les informations suivantes :<\/p>\n<p>&#8211; NAME: nom du volume persistant.<\/p>\n<p>&#8211; CAPACITY: taille du volume persistant.<\/p>\n<p>&#8211; ACCESS MODES: types d&rsquo;acc\u00e8s autoris\u00e9s.<\/p>\n<p>&#8211; RECLAIM POLICY: permet de sp\u00e9cifier le comportement \u00e0 adopter en cas de suppression de l&rsquo;objet PersistentVolumeClaim (garder le volume ou suppression automatique).<\/p>\n<p>&#8211; STATUS: si le volume est associ\u00e9 (Bound) ou d\u00e9tach\u00e9 (Released) vis-\u00e0-vis d&rsquo;un objet PersistentVolumeClaim.<\/p>\n<p>&#8211; CLAIM: nom de l&rsquo;objet PersistentVolumeClaim associ\u00e9.<\/p>\n<p>&#8211; STORAGECLASS: classe utilis\u00e9e par le volume.<\/p>\n<p>Le volume persistant pv-mailhog est bien li\u00e9 \u00e0 l&rsquo;objet Persistent&nbsp;Volume-<\/p>\n<p>&nbsp;<\/p>\n<h4>2.4.4 \u00c9tat de la demande de volume persistant<\/h4>\n<p>Comme pour les objets Persistent Volume, il est possible de consulter T\u00e9tat des demandes de volumes persistants (PersistentVolumeClaim ou pvc):<\/p>\n<p>$ kubectl get pvc<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\r\npvc-mailhog Bound pv-mailhog 10Gi RWO manual 4h10m<\/pre>\n<p>Ci-dessous une description des champs renvoy\u00e9s :<\/p>\n<p>NAME : nom du PersistentVolumeClaim.<\/p>\n<p>\u2013 STATUS : \u00e9tat vis-\u00e0-vis du Persistent Volume.<\/p>\n<p>&#8211; CAPACITY: taille du PVC.<\/p>\n<p>&#8211; ACCESS MODES: acc\u00e8s demand\u00e9 (un seul pod \u00e0 la fois, plusieurs, lecture seule).<\/p>\n<p>&#8211; STORAGECLASS: nom de la classe de stockage.<\/p>\n<p>&#8211; AGE: \u00e2ge du PVC.<\/p>\n<p>La valeur Bound au niveau du champ STATUS indique que le PVC est li\u00e9 au PV.<\/p>\n<h4>2.4.5 D\u00e9claration du point de montage<\/h4>\n<p>Par la suite, la d\u00e9claration de d\u00e9ploiement de l&rsquo;application MailHog sera re- prise dans le fichier deployment.yaml.<\/p>\n<p>Au niveau des modifications \u00e0 r\u00e9aliser, vous devrez ajouter un sous-champ vo- lumes au niveau du champ spec du pod (champ spec &#8211;&gt; template &#8211;&gt; spec volumes).<\/p>\n<p>Ce sous-champ va prendre les valeurs suivantes :<\/p>\n<p>&#8211; Un champ name pour \u00eatre r\u00e9f\u00e9renc\u00e9 depuis la liste des containers.<\/p>\n<p>&#8211; Un champ persistent Volume Claim avec le champ claimName poin- tant sur le nom de l&rsquo;objet PVC pr\u00e9c\u00e9demment cr\u00e9\u00e9 (pvc-mailhog).<\/p>\n<p>Le nom du volume prendra la valeur mailhog-maildir.<\/p>\n<p>Ci-dessous la d\u00e9claration correspondant \u00e0 ces indications:<\/p>\n<pre>volumes:\r\n  - name: mailhog-maildir\r\n&nbsp;&nbsp;  persistentVolumeClaim: { claimName: pvc-mailhog }<\/pre>\n<h4>2.4.6 Ajout d&rsquo;un point de montage sur le container<\/h4>\n<p>Au niveau du container associ\u00e9 \u00e0 MailHog, l&rsquo;ajout du champ volumeMounts va permettre de donner une liste de montages \u00e0 r\u00e9aliser. Chaque point de<\/p>\n<p>montage prend le contenu suivant :<\/p>\n<p>&#8211; Le champ mount Path suivi de l&#8217;emplacement du point de<\/p>\n<p>montage.<\/p>\n<p>&#8211; Le champ name permettant de pointer sur le volume d\u00e9fini plus haut.<\/p>\n<p>Ci-dessous le champ containers suite \u00e0 la prise en compte de ces modifications:<\/p>\n<p>&nbsp;<\/p>\n<pre>containers:\r\n  - image: mailhog\/mailhog\r\n    name: mailhog\r\n    image Pull Policy: IfNotPresent\r\n    volumeMounts:\r\n       - mountPath: \/maildir\r\n         name: mailhog-maildir<\/pre>\n<h4>2.4.7 Options de lancement de MailHog<\/h4>\n<p>Le point de montage est pr\u00eat. Il est malgr\u00e9 tout n\u00e9cessaire d&rsquo;indiquer \u00e0 MailHog que les donn\u00e9es devront \u00eatre \u00e9crites \u00e0 cet emplacement.<\/p>\n<p>Pour ce faire, l&rsquo;application MailHog supporte les options suivantes :<\/p>\n<p>-storage-maildir: indique de passer par un r\u00e9pertoire au format Maildir.<\/p>\n<p>-maildir-path=\/maildir: indique que l&rsquo;\u00e9criture devra se faire dans le r\u00e9pertoire\/maildir.<\/p>\n<p>Ce r\u00e9pertoire correspondant \u00e0 l&#8217;emplacement du point de montage, MailHog n&rsquo;\u00e9crira plus dans le container mais dans ce volume de donn\u00e9es externe.<\/p>\n<p>Ce passage de param\u00e8tres se fait au niveau de la d\u00e9claration du container avec le champ command. Ce champ prend en param\u00e8tre un tableau de cha\u00eene de caract\u00e8res.<\/p>\n<p>Ci-dessous le champ containers suite \u00e0 l&rsquo;ajout de ce champ:<\/p>\n<p>&nbsp;<\/p>\n<pre>containers:\r\n   - image: mailhog\/mailhog\r\n     name: mailhog\r\n     image PullPolicy: IfNot Present\r\n     volumeMounts:\r\n        - mountPath: \/maildir\r\n          name: mailhog-maildir\r\n     command:\r\n        - \"MailHog\"\r\n        - \"-storage-maildir\"\r\n        - \"-maildir-path=\/maildir\"<\/pre>\n<h6>&nbsp;<\/h6>\n<h4>2.4.8 D\u00e9claration enti\u00e8re suite aux modifications<\/h4>\n<p>&nbsp;<\/p>\n<p>L&rsquo;ensemble des modifications devrait vous amener au contenu suivant : Fichier mailhog\/mailhog-deployement.yaml<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  labels:\r\n    app: mailhog\r\n  name: mailhog\r\nspec:\r\n  replicas: 1\r\n  selector:\r\n    matchLabels:\r\n      app: mailhog\r\ntemplate:\r\n  metadata:\r\n    labels:\r\n      app: mailhog\r\n  spec:\r\n    containers:\r\n      - image: mailhog\/mailhog\r\n        name: mailhog\r\n        imagePullPolicy: IfNotPresent   \r\n        volumeMounts:\r\n          - mountPath: \/maildir\r\n            name: mailhog-maildir\r\n         command:\r\n            - \"MailHog\"\r\n            - \"-storage=maildir\"\r\n            - \"-maildir-path=\/maildir\"\r\n    volumes:\r\n      - name: mailhog-maildir\r\n        persistentVolumeClaim: { claimName: pvc-mailhog }<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mailhog-depoument-yaml.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7134\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mailhog-depoument-yaml.png\" alt=\"\" width=\"569\" height=\"646\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mailhog-depoument-yaml.png 569w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mailhog-depoument-yaml-264x300.png 264w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mailhog-depoument-yaml-70x80.png 70w\" sizes=\"(max-width: 569px) 100vw, 569px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<pre>&nbsp;<\/pre>\n<p>&nbsp;<\/p>\n<p>Pour des raisons de clart\u00e9, les tests de type readiness ou liveness de MailHog n&rsquo;ont pas \u00e9t\u00e9 report\u00e9s dans l&rsquo;exemple. Rien n&#8217;emp\u00eache de les conserver. Sauvegardez cette d\u00e9claration dans le fichier mailhog-deployment.yaml et appliquez la modification :<\/p>\n<p>$ kubectl apply -f mailhog-deployment.yaml<\/p>\n<pre>deployment.apps\/mailhog configured<\/pre>\n<p>Consultez l&rsquo;\u00e9tat des pods :<\/p>\n<p>$ kubectl get pods -l&nbsp; app=mailhog<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\n<span style=\"color: #ff0000;\"><strong>mailhog-69fb77b74b-mg9ns<\/strong><\/span> 1\/1 Running 0 4h20m<\/pre>\n<p>Le lancement de la description du contenu du pod indiquera l&rsquo;\u00e9tat des points<\/p>\n<p>$ kubectl describe pods <strong>mailhog-69fb77b74b-mg9ns<\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre>Name: mailhog-69fb77b74b-mg9ns\r\nNamespace: default\r\nPriority: 0\r\nNode: minikube\/192.168.49.2\r\nStart Time: Tue, 10 Sep 2024 10:36:37 +0200\r\nLabels: app=mailhog\r\npod-template-hash=69fb77b74b\r\nAnnotations: &lt;none&gt;\r\nStatus: Running\r\nIP: 10.244.0.29\r\nIPs:\r\nIP: 10.244.0.29\r\nControlled By: ReplicaSet\/mailhog-69fb77b74b\r\nContainers:\r\nmailhog:\r\nContainer ID: containerd:\/\/24e034fa23ce3d3e479f59b186e5255f022ca0b3cd72b4c743b7e6182a225889\r\nImage: mailhog\/mailhog\r\nImage ID: docker.io\/mailhog\/mailhog@sha256:8d76a3d4ffa32a3661311944007a415332c4bb855657f4f6c57996405 c009bea\r\nPort: &lt;none&gt;\r\nHost Port: &lt;none&gt;\r\nCommand:\r\nMailHog\r\n-storage=maildir\r\n-maildir-path=\/maildir\r\nState: Running\r\nStarted: Tue, 10 Sep 2024 10:36:38 +0200\r\nReady: True\r\nRestart Count: 0\r\nEnvironment: &lt;none&gt;\r\nMounts:\r\n\/maildir from mailhog-maildir (rw)\r\n\/var\/run\/secrets\/kubernetes.io\/serviceaccount from kube-api-access-h9tjt (ro)\r\nConditions:\r\nType Status\r\nInitialized True\r\nReady True\r\nContainersReady True\r\nPodScheduled True\r\nVolumes:\r\nmailhog-maildir:\r\nType: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)\r\nClaimName: pvc-mailhog\r\nReadOnly: false\r\nkube-api-access-h9tjt:\r\nType: Projected (a volume that contains injected data from multiple sources)\r\nTokenExpirationSeconds: 3607\r\nConfigMapName: kube-root-ca.crt\r\nConfigMapOptional: &lt;nil&gt;\r\nDownwardAPI: true\r\nQoS Class: BestEffort\r\nNode-Selectors: &lt;none&gt;\r\nTolerations: node.kubernetes.io\/not-ready:NoExecute op=Exists for 300s\r\nnode.kubernetes.io\/unreachable:NoExecute op=Exists for 300s\r\nEvents: &lt;none&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>Ci-dessous un extrait renvoy\u00e9 par cette commande indiquant l&rsquo;\u00e9tat des points<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7135\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog.png\" alt=\"\" width=\"902\" height=\"698\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog.png 902w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog-300x232.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog-80x62.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog-768x594.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/result-mailhog-705x546.png 705w\" sizes=\"(max-width: 902px) 100vw, 902px\" \/><\/a><\/p>\n<h3>2.5 Test de la persistance<\/h3>\n<h4>2.5.1 Installation de mhsendmail<\/h4>\n<p>Afin de tester la persistance, vous allez envoyer un mail \u00e0 l&rsquo;application Mail- Hog \u00e0 l&rsquo;aide du programme mhsendmail.<\/p>\n<p>R\u00e9cup\u00e9rez ce programme \u00e0 l&rsquo;adresse ci-dessous : https:\/\/github.com\/mailhog\/mhsendmail<\/p>\n<p>Son installation peut se r\u00e9aliser via les \u00e9tapes suivantes :<\/p>\n<p>&#8211; T\u00e9l\u00e9chargement et extraction de l&rsquo;archive d&rsquo;installation en version v0.2.0.<\/p>\n<p>&#8211; Ajout des droits d&rsquo;ex\u00e9cution \u00e0 l&rsquo;aide de la commande chmod.<\/p>\n<p>&#8211; D\u00e9p\u00f4t du fichier dans le r\u00e9pertoire \/usr\/local\/bin \u00e0 l&rsquo;aide de sudo cp. Ci-dessous les commandes \u00e0 lancer pour r\u00e9aliser ces actions:<\/p>\n<p>&#8211; T\u00e9l\u00e9chargement de mhsendmail:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>$ export MHURL=\u00a0\u00bbhttps:\/\/github.com\/mailhog\/mhsendmail\/releases\u00a0\u00bb <\/strong><\/p>\n<p><strong>$ wget $MHURL\/download\/v0.2.0\/mhsendmail_linux_amd64 -O mhsendmail<\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre>u70779858@Kubernetes-SRV:~\/mailhog$ wget $MHURL\/download\/v0.2.0\/mhsendmail_linux_amd64 -O mhsendmail\r\n--2024-09-03 15:19:33-- https:\/\/github.com\/mailhog\/mhsendmail\/releases\/download\/v0.2.0\/mhsendmail_linux_amd64\r\nR\u00e9solution de github.com (github.com)\u2026 140.82.121.3\r\nConnexion \u00e0 github.com (github.com)|140.82.121.3|:443\u2026 connect\u00e9.\r\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse\u2026 302 Found\r\nEmplacement&nbsp;: https:\/\/objects.githubusercontent.com\/github-production-release-asset-2e65be\/35970282\/e7a6b69c-e952-11e5-9c5c-78ecf5f26102?X-Amz-Algorithm=AWS 4-HMAC-SHA256&amp;X-Amz-Credential=releaseassetproduction%2F20240903%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20240903T131933Z&amp;X-Amz-Expires=300&amp;X-Amz-Signatu re=bbb55a0f5d27f6fce877a1efd14ce01cafda4d9994715528ef0c64ee3b3df3ae&amp;X-Amz-SignedHeaders=host&amp;actor_id=0&amp;key_id=0&amp;repo_id=35970282&amp;response-content-dispositi on=attachment%3B%20filename%3Dmhsendmail_linux_amd64&amp;response-content-type=application%2Foctet-stream [suivant]\r\n--2024-09-03 15:19:33-- https:\/\/objects.githubusercontent.com\/github-production-release-asset-2e65be\/35970282\/e7a6b69c-e952-11e5-9c5c-78ecf5f26102?X-Amz-Al gorithm=AWS4-HMAC-SHA256&amp;X-Amz-Credential=releaseassetproduction%2F20240903%2Fus-east-1%2Fs3%2Faws4_request&amp;X-Amz-Date=20240903T131933Z&amp;X-Amz-Expires=300&amp;X- Amz-Signature=bbb55a0f5d27f6fce877a1efd14ce01cafda4d9994715528ef0c64ee3b3df3ae&amp;X-Amz-SignedHeaders=host&amp;actor_id=0&amp;key_id=0&amp;repo_id=35970282&amp;response-conten t-disposition=attachment%3B%20filename%3Dmhsendmail_linux_amd64&amp;response-content-type=application%2Foctet-stream\r\nR\u00e9solution de objects.githubusercontent.com (objects.githubusercontent.com)\u2026 185.199.110.133, 185.199.111.133, 185.199.108.133, ...\r\nConnexion \u00e0 objects.githubusercontent.com (objects.githubusercontent.com)|185.199.110.133|:443\u2026 connect\u00e9.\r\nrequ\u00eate HTTP transmise, en attente de la r\u00e9ponse\u2026 200 OK\r\nTaille&nbsp;: 5878296 (5,6M) [application\/octet-stream]\r\nEnregistre : \u00abmhsendmail\u00bb\r\n\r\nmhsendmail 100%[============================================================================&gt;] 5,61M --.-KB\/s ds 0,07s\r\n\r\n2024-09-03 15:19:34 (78,0 MB\/s) - \u00abmhsendmail\u00bb enregistr\u00e9 [5878296\/5878296]<\/pre>\n<p>&nbsp;<\/p>\n<p>$ chmod +x mhsendmail<\/p>\n<p>$ sudo cp mhsendmail \/usr\/local\/bin\/.<\/p>\n<h4>2.5.2 Ouverture de la communication avec le port SMTP<\/h4>\n<p>Afin de pouvoir communiquer avec le serveur SMTP de MailHog, il est n\u00e9ces- saire d&rsquo;ouvrir le port avec la commande kubectl avec les options suivantes :<\/p>\n<p>&#8211; Le mot-cl\u00e9 port-forward.<\/p>\n<p>&#8211; Le nom du service sur lequel se connecter pr\u00e9c\u00e9d\u00e9 par service\/.<\/p>\n<p>Le port \u00e0 ouvrir pour acc\u00e9der au service SMTP de MailHog (1025).<\/p>\n<p>Ci-dessous la commande correspondante :<\/p>\n<p>&#8211;<\/p>\n<p>$ kubectl port-forward service\/mailhog 1025<\/p>\n<p>La commande devrait renvoyer le message suivant en gardant la main :<\/p>\n<pre>u70779858@Kubernetes-SRV:~\/mailhog$ k port-forward service\/mailhog 1025\r\nForwarding from 127.0.0.1:1025 -&gt; 1025\r\nForwarding from [::1]:1025 -&gt; 1025<\/pre>\n<h4>2.5.3 Envoi d&rsquo;un mail<\/h4>\n<p>Le port est ouvert et mhsendmail est install\u00e9. Il est maintenant temps d&rsquo;envoyer un mail sur MailHog.<\/p>\n<p>Pr\u00e9parez tout d&rsquo;abord le contenu du mail. Ce dernier doit contenir certains champs. Ci-dessous quelques champs int\u00e9ressants \u00e0 renseigner:<\/p>\n<p>&#8211; Un champ From avec l&rsquo;exp\u00e9diteur.<\/p>\n<p>&#8211; Un champ To avec le destinataire.<\/p>\n<p>&#8211; Un champ Subject avec le sujet de l&rsquo;e-mail.<\/p>\n<p>&#8211; Enfin, une ligne vide suivie du contenu du message.<\/p>\n<p>Chaque champ sera r\u00e9f\u00e9renc\u00e9 par son nom suivi de deux points (:) ainsi que sa valeur.<\/p>\n<p>Afin d&rsquo;envoyer un mail \u00e0 bat@man.org de la part de super@man.org po organiser le pot de d\u00e9part de Wonder Woman, le message pourrait ressembler au contenu suivant : <strong>email.txt<\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre>From: Clark Kent&lt;manheng.luong@gmail.com&gt;\r\nTo: Bruce Wayne&lt;manheng2.luong@gmail.com&gt;\r\nSubject: Pot de d\u00e9part Wonder Woman&nbsp;\r\n\r\nSalut&nbsp;Bruce,\r\n\r\nJ'ai ouvert une cagnotte au bureau pour le d\u00e9part de Diana. N'h\u00e9site pas \u00e0 passer au bureau.\r\n\r\nHengo<\/pre>\n<p>Pour la suite, le contenu de ce message sera stock\u00e9 dans le fichier email.txt. Pour sp\u00e9cifier l&rsquo;adresse du serveur SMTP, la commande mhsendmail supporte l&rsquo;option &#8211;smtp-addr. Le passage du message se fait quant \u00e0 lui \u00e0 l&rsquo;aide d&rsquo;un pipe Unix. La lecture du contenu du fichier se fera \u00e0 l&rsquo;aide de la commande cat.<\/p>\n<p>En reprenant toutes ces indications, l&rsquo;envoi du mail se fera avec la commande suivante :<\/p>\n<p>&nbsp;$ cat email.txt | mhsendmail &#8211;smtp-addr=127.0.0.1:1025<\/p>\n<p>Ci-dessous le message renvoy\u00e9 par cette commande :<\/p>\n<p>error sending mail<\/p>\n<p>2019\/04\/08 18:14:02 452 Unable to store message<\/p>\n<p>Il semblerait que le serveur SMTP n&rsquo;ait pas pu recevoir le message en raison d&rsquo;un probl\u00e8me de stockage.<\/p>\n<h4>2.5.4 Droits du r\u00e9pertoire de persistance des donn\u00e9es<\/h4>\n<p>Le message d&rsquo;erreur re\u00e7u vient du fait que le r\u00e9pertoire mont\u00e9 dans le contai- ner ne dispose pas des droits n\u00e9cessaires.<\/p>\n<p>La correction du probl\u00e8me peut se faire en attribuant des droits plus larges sur le r\u00e9pertoire \/tmp\/pv-mailhog. Pour cela, dans le cas de Minikube, vous devrez suivre la proc\u00e9dure suivante :<\/p>\n<p>&#8211; Connexion au serveur de Minikube avec la commande minikube ssh.<\/p>\n<p>&#8211; Attribution des droits 777 au r\u00e9pertoire avec la commande chmod pr\u00e9c\u00e9d\u00e9e par la commande sudo.<\/p>\n<p>Ci-dessous la suite de commandes \u00e0 lancer:<\/p>\n<p>$ minikube ssh<\/p>\n<p>$ sudo chmod -R 777 \/maildir<\/p>\n<ul>\n<li><strong>Remarque<\/strong><\/li>\n<\/ul>\n<p>L&rsquo;attribution de droits de ce type est bien s\u00fbr fortement d\u00e9conseill\u00e9e. Vous aborderez plus loin des notions permettant de vous passer de ce type de contournement.<\/p>\n<p>La relance de la commande d&rsquo;envoi de mail devrait maintenant se passer sans probl\u00e8me.<\/p>\n<p>$ cat email.txt | mhsendmail &#8211;smtp-addr=127.0.0.1:1025<\/p>\n<p>&nbsp;<\/p>\n<h4>2.5.5 Consultation de l&rsquo;interface MailHog<\/h4>\n<p>Pour se connecter \u00e0 l&rsquo;application, la r\u00e8gle Ingress et le service associ\u00e9 \u00e0 MailHog doivent \u00eatre toujours l\u00e0.<\/p>\n<p>L&rsquo;adresse de l&rsquo;objet Ingress peut \u00eatre consult\u00e9e \u00e0 l&rsquo;aide de kubectl avec la commande suivante :<\/p>\n<p>$ kubectl get ingress mailhog<\/p>\n<p>Cette commande doit alors renvoyer le contenu suivant :<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME CLASS HOSTS ADDRESS PORTS AGE\r\nmailhog nginx <span style=\"color: #ff0000;\"><strong>mailhog.192.168.49.2.nip.io<\/strong><\/span> 192.168.49.2 80 15d<\/pre>\n<p>\u25a1 Rentrez l&rsquo;adresse contenue dans le champ HOSTS dans un navigateur afin de consulter l&rsquo;interface web de MailHog.&nbsp;<\/p>\n<ul>\n<li>Ouvrir une session via MobaXterm : lancer le navigateur firefox<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7136\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox.png\" alt=\"\" width=\"1045\" height=\"518\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox.png 1045w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox-300x149.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox-1030x511.png 1030w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox-80x40.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox-768x381.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox-705x349.png 705w\" sizes=\"(max-width: 1045px) 100vw, 1045px\" \/><\/a><\/p>\n<ul>\n<li>Lancer le navigateur firefox :<\/li>\n<\/ul>\n<p>$ firefox<\/p>\n<p>Sur la gauche, le lien Inbox permet de consulter la liste des messages re\u00e7us.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1.png\">Interface MailHog: affichage du contenu d&rsquo;un e-mail envoy\u00e9 de la part de Superman<img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7137\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1.png\" alt=\"\" width=\"952\" height=\"553\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1.png 952w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1-300x174.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1-80x46.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1-768x446.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/firefox1-705x410.png 705w\" sizes=\"(max-width: 952px) 100vw, 952px\" \/><\/a><\/p>\n<p>Interface MailHog: affichage du contenu d&rsquo;un e-mail envoy\u00e9 de la part de Superman<\/p>\n<h4>2.5.6 Suppression des pods<\/h4>\n<p>Afin de s&rsquo;assurer que le m\u00e9canisme fonctionne bien, vous allez supprimer le pod avec la commande kubectl en utilisant les options suivantes :<\/p>\n<p>$ kubectl delete pods -l&nbsp; app=mailhog<\/p>\n<p>La commande doit alors renvoyer le message suivant :<\/p>\n<pre>pod \"mailhog-69fb77b74b-mg9ns\" deleted<\/pre>\n<h4>2.5.7 V\u00e9rification du fonctionnement de la persistance<\/h4>\n<p>&#x2611;Une fois le pod supprim\u00e9, consultez la liste des pods de MailHog:<\/p>\n<p>$ kubectl get pods -1 app-mailhog&nbsp;<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>Vous pouvez \u00e9galement ajouter l&rsquo;option &#8211;wait (ou son raccourci -w) pour attendre que le pod soit d\u00e9marr\u00e9.<\/p>\n<p>Ci-dessous le r\u00e9sultat attendu :<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmailhog-69fb77b74b-76kcs 1\/1 Running 0 97s\r\n\r\n<\/pre>\n<p>Sur l&rsquo;interface web de MailHog, rafra\u00eechissez le contenu de la page avec la touche [F5].<\/p>\n<p>Le message de Clark Kent doit alors \u00eatre pr\u00e9sent indiquant que la persistance a bien fonctionn\u00e9.<\/p>\n<h5>2.5.7.1 V\u00e9rification suite \u00e0 la suppression du POD<\/h5>\n<ul>\n<li>Relancer l&rsquo;envoie de email.txt sur la 1ere Session<\/li>\n<\/ul>\n<p>$ cat email.txt |mhsendmail &#8211;smtp-addr=127.0.0.1:1025<\/p>\n<pre>error sending mail\r\n2024\/09\/10 15:59:36 EOF<\/pre>\n<ul>\n<li>Erreur de la 1ere session pour le port-forward du service\/mailhog<\/li>\n<\/ul>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7138\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1.png\" alt=\"\" width=\"907\" height=\"680\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1.png 907w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1-300x225.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1-80x60.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1-768x576.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/email1-705x529.png 705w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/a><\/p>\n<h6>Solution :<\/h6>\n<ul>\n<li>1\u00e8re session : Relancer la commande port-forward<\/li>\n<\/ul>\n<p>$ kubectl port-forward service\/mailhog 1025<\/p>\n<ul>\n<li>2\u00e8me session : Relancer l&rsquo;envoie de email.txt<\/li>\n<\/ul>\n<p>$ cat email.txt |mhsendmail &#8211;smtp-addr=127.0.0.1:1025<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7139\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK.png\" alt=\"\" width=\"901\" height=\"672\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK.png 901w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK-300x224.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK-80x60.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK-768x573.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/emailOK-705x526.png 705w\" sizes=\"(max-width: 901px) 100vw, 901px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h4>2.5.7.2 V\u00e9rification du contenu de Persistent Volume<\/h4>\n<ul>\n<li>Se connecter sur le pod<\/li>\n<\/ul>\n<p>$ minikube ssh<\/p>\n<p>$ cd \/maildir<\/p>\n<pre>-rw-r----- 1 docker 1000 342<span style=\"color: #ff0000;\"> <strong>Sep 10 08:37<\/strong> <\/span>'2BjKqJTM3KOGkoHKa0cgd_YlJO0HEsYFPIz8BvXcnG0=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:20 'DaIYisMGR-NisnA-MHPk8pRL8fBOSazw2AJcWQnH16A=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 <span style=\"color: #ff0000;\">Sep 10 08:37<\/span> 'G9gPpmofBXzbbrXkXblzn1I9bFJbPPOAEKm-2ziaLAQ=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:35 'UZYmKWlbiCv72wYIeh8Ofn4uRfBbZb4b1w-oDmubXvY=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 <strong>Sep 10 14:14<\/strong> 'Uh_jSBPewXs6eE5-qOD5vENrYcOJsR-QwyRqWAUfMsU=@mailhog.example'\r\n-rwxrwxrwx 1 root root 0 Sep 10 08:16 aaa*\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:35 'hlje0v1XGyci0t5262Lh9hxnWkOSnqsMZfD7jSD5j7A=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:20 'nNIL7FXuiIkItjeKMqPHxPTSBhH8973imEJEN-TEFhg=@mailhog.example'\r\n-rw-r--r-- 1 docker docker 0 Sep 10 08:20 qqq\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:37 'xl2Cp9RDGV5J_kTmp8PgUUmjI-2cuNMppHNOQ3E99jo=@mailhog.example'\r\n-rw-r----- 1 docker 1000 342 Sep 10 08:20 'y7NhbHA0hBDRiozlfi0HboKpRyDxguoWZZyvON1-jMI=@mailhog.example'<\/pre>\n<p>&nbsp;<\/p>\n<h3>3. Classes de stockage<\/h3>\n<h4>3.1 Origine du besoin<\/h4>\n<p>La section pr\u00e9c\u00e9dente a permis d&rsquo;aborder le travail n\u00e9cessaire \u00e0 la mise en place d&rsquo;un volume persistant:<\/p>\n<p>&#8211; Une d\u00e9claration pour indiquer que de l&rsquo;espace disque est disponible. &#8211; Une d\u00e9claration pour pouvoir s&rsquo;accaparer un espace disque.<\/p>\n<p>&#8211; Une <span style=\"color: #ff0000;\">action manuelle pour positionner les droits sur les r\u00e9pertoires<\/span>. Heureusement pour l&rsquo;administrateur, ce travail de d\u00e9claration n&rsquo;est saire. Il est possible de passer par un gestionnaire automatique de volume persistant : les objets <span style=\"color: #ff0000;\">StorageClass (ou son raccourci sc).<\/span><\/p>\n<p>Ces objets vont se charger d&rsquo;intercepter les demandes de volumes persistants (PersistentVolumeClaim) et de r\u00e9aliser automatiquement les actions suivantes.<\/p>\n<p>&#8211; Cr\u00e9ation de l&rsquo;objet PersistentVolume.<\/p>\n<p>&#8211; Attribution des&nbsp;droits&nbsp;ad-hoc.<\/p>\n<p>Autre point, un cluster Kubernetes peut faire appel \u00e0 plusieurs classes de stockage offrant plusieurs niveaux de services, comme par exemple :<\/p>\n<p>&#8211; une classe ssd pour des disques rapides de type SSD,<\/p>\n<p>&#8211; une classe hdd pour des disques durs classiques de type HDD,<\/p>\n<p>&#8211; une classe nfs pour pouvoir partager un espace disque entre plusieurs pods.<\/p>\n<p>Charge \u00e0 vous ensuite de cr\u00e9er le type de disque n\u00e9cessaire en fonction des besoins des utilisateurs.<\/p>\n<p>Ainsi, une application r\u00e9clamant des disques rapides pourra demander des disques SSD, tandis qu&rsquo;une autre prendra des disques traditionnels afin de r\u00e9- duire les co\u00fbts de stockage.<\/p>\n<h4>3.2 Liste des classes de stockage<\/h4>\n<p>Sur Minikube, une classe de stockage est pr\u00e9sente \u00e0 l&rsquo;installation.<\/p>\n<p>Pour r\u00e9cup\u00e9rer cette d\u00e9claration, lancez la commande kubectl avec les options suivantes :<\/p>\n<p>Le verbe get.<\/p>\n<p>&#8211; Le type \u00e0 r\u00e9cup\u00e9rer (storageclass ou son raccourci sc).<\/p>\n<p>Ci-dessous la commande \u00e0 lancer:<\/p>\n<p>$ kubectl get storageclass (sc)<\/p>\n<p>Et le r\u00e9sultat attendu :<\/p>\n<pre>NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE\r\nstandard (default) k8s.io\/minikube-hostpath Delete Immediate false 43d\r\n<\/pre>\n<p>Une classe de stockage porte le nom standard et cette derni\u00e8re est d\u00e9finie par d\u00e9faut. Autre point, le m\u00e9canisme d&rsquo;approvisionnement porte le nom de k8s.io\/minikube-hostpath<\/p>\n<h4>3.3 D\u00e9tail d&rsquo;une classe de stockage<\/h4>\n<p>Comme tout autre objet pr\u00e9sent dans Kubernetes, il est possible de d\u00e9crire un objet \u00e0 l&rsquo;aide de la commande kubectl suivie des options suivantes :<\/p>\n<p>&#8211; Le verbe describe.<\/p>\n<p>&#8211; Le type d&rsquo;objet \u00e0 consulter (storageclass ou sc).<\/p>\n<p>\u00b7 Le nom de l&rsquo;objet \u00e0 consulter (standard).<\/p>\n<p>Ci-dessous la commande \u00e0 lancer (faisant appel au raccourci sc pour StorageClass):<\/p>\n<p>$ kubectl describe sc standard<\/p>\n<p>Et le r\u00e9sultat renvoy\u00e9 :<\/p>\n<pre>Name: standard\r\nIsDefaultClass: Yes\r\nAnnotations: kubectl.kubernetes.io\/last-applied-configuration={\"apiVersion\":\"storage.k8s.io\/v1\",\"kind\":\"StorageClass\",\"m etadata\":{\"annotations\":{\"storageclass.kubernetes.io\/is-default-class\":\"true\"},\"labels\":{\"addonmanager.kubernetes.io\/mode\":\" EnsureExists\"},\"name\":\"standard\"},\"provisioner\":\"k8s.io\/minikube-hostpath\"}\r\n,storageclass.kubernetes.io\/is-default-class=true\r\nProvisioner: k8s.io\/minikube-hostpath\r\nParameters: &lt;none&gt;\r\nAllowVolumeExpansion: &lt;unset&gt;\r\nMountOptions: &lt;none&gt;\r\nReclaimPolicy: Delete\r\nVolumeBindingMode: Immediate\r\nEvents: &lt;none&gt;<\/pre>\n<h4>3.4 Classe de stockage par d\u00e9faut<\/h4>\n<p>Comme tout autre objet dans Kubernetes, les classes de stockage peuvent por- ter des annotations ou des labels.<\/p>\n<p>Ici, la classe standard porte l&rsquo;annotation storageclass.beta.kuber- netes.io\/is-default-class-true en faisant ainsi la classe par d\u00e9faut. Si un objet PersistentVolumeClaim ne pr\u00e9cise rien, cette derni\u00e8re sera utilis\u00e9e.<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>Il ne peut y avoir \u00e0 un instant T qu&rsquo;une seule classe portant cette annotation.<\/p>\n<h3>3.5 Les diff\u00e9rentes classes de stockage<\/h3>\n<h4>3.5.1 Les diff\u00e9rentes familles<\/h4>\n<p>Actuellement, il existe trois types de gestionnaires de volume:<\/p>\n<p><span style=\"color: #993300;\"><strong>&#8211; Les gestionnaires int\u00e9gr\u00e9s au code de Kubernetes.<\/strong><\/span><\/p>\n<p><span style=\"color: #993300;\"><strong>\u2013 Les gestionnaires s&rsquo;appuyant sur FlexVolume.<\/strong><\/span><\/p>\n<p><span style=\"color: #993300;\"><strong>&#8211; Les gestionnaires s&rsquo;appuyant sur l&rsquo;interface CSI.<\/strong><\/span><\/p>\n<p>Actuellement, le type CSI (Container Storage Interface) est en version stable (depuis la version 1.13 et en b\u00eata depuis la version 1.10). C&rsquo;est la m\u00e9thode recommand\u00e9e pour \u00e9crire de nouveaux pilotes.<\/p>\n<p>Ce type CSI est un standard permettant d&rsquo;\u00e9crire des pilotes de gestion de volume pour des syst\u00e8mes d&rsquo;orchestration de containers (COS pour Container Orchestration Systems).<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>L&rsquo;autre standard (FlexVolume) existe depuis la version 1.2 de Kubernetes, mais n&rsquo;\u00e9voluera plus. Il s&rsquo;appuie sur un m\u00e9canisme d&rsquo;ex\u00e9cution de commandes. Ces commandes doivent \u00eatre install\u00e9es sur les machines constituant le cluster Kubernetes.<\/p>\n<h4>3.5.2 Origine de ces familles<\/h4>\n<p>Au d\u00e9but du projet, les pilotes de volume faisaient partie int\u00e9grante du code source de Kubernetes. Malheureusement, ce type d&rsquo;organisation entra\u00eene certaines contraintes :<\/p>\n<p>&#8211; Mise \u00e0 jour impossible d&rsquo;un plugin sans changer la version de Kubernetes.<\/p>\n<p>&#8211; Les mainteneurs de Kubernetes \u00e9taient responsables d&rsquo;un code difficile \u00e0 tester<\/p>\n<p>&#8211; Un bug sur un gestionnaire de disque pouvait faire crasher&nbsp;Kubernetes.<\/p>\n<p>&#8211; Les gestionnaires d&rsquo;espaces disque avaient les m\u00eames droits que les compo- sants principaux de Kubernetes (pouvant entra\u00eener des probl\u00e8mes de s\u00e9curit\u00e9).<\/p>\n<p>&#8211; Le d\u00e9veloppement d&rsquo;un pilote devait forc\u00e9ment \u00eatre int\u00e9gr\u00e9 comme une brique open source.<\/p>\n<p>Partant de ce constat, la communaut\u00e9 autour de Kubernetes a fait le choix de sortir les gestionnaires de volume de la branche principale du code source. Ces gestionnaires sont maintenant en dehors du code de Kubernetes.<\/p>\n<p>En anglais, ces deux types de gestionnaires sont r\u00e9f\u00e9renc\u00e9s par le terme <span style=\"color: #ff0000;\"><strong>in-tree<\/strong><\/span> lorsqu&rsquo;ils sont pr\u00e9sents avec le code de Kubernetes, et ceux en dehors par le terme <span style=\"color: #ff0000;\">out-of-tree.<\/span><\/p>\n<p>Pour en savoir plus, consultez le lien suivant (anglais) : https:\/\/github.com\/ kubernetes\/community\/blob\/master\/sig-storage\/volume-plugin-faq.md<\/p>\n<h4>3.6 Caract\u00e9ristiques des classes de stockage<\/h4>\n<h5>3.6.1 Modes d&rsquo;acc\u00e8s<\/h5>\n<p>Un volume persistant peut \u00eatre acc\u00e9d\u00e9 \u00e0 l&rsquo;aide de plusieurs modes:<\/p>\n<p><span style=\"color: #ff0000;\"><strong>&#8211; ReadWriteOnce : montage de l&rsquo;espace disque sur un pod \u00e0 la fois.<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>&#8211; ReadOnlyMany: lecture seule sur plusieurs pods \u00e0 la fois.<\/strong><\/span><\/p>\n<p><span style=\"color: #ff0000;\"><strong>&#8211; ReadWriteMany: montage en lecture-\u00e9criture dans plusieurs pods \u00e0 la fois.<\/strong><\/span><\/p>\n<p>Au niveau des sorties de la commande kubectl, ces modes sont abr\u00e9g\u00e9s de la mani\u00e8re suivante :<\/p>\n<p>&#8211; ReadWriteOnce : RWO<\/p>\n<p>&#8211; ReadOnlyMany: RXO<\/p>\n<p>&#8211; ReadWriteMany:&nbsp;RWX&nbsp;<\/p>\n<h4>3.6.2 Caract\u00e9ristiques de certains pilotes<\/h4>\n<p>Kubernetes offre de nombreux pilotes par d\u00e9faut. Ci-dessous un extrait des ca- pacit\u00e9s de quelques pilotes courants :<\/p>\n<p>&nbsp;<\/p>\n<pre>Pilote AWSElasticBlockStore\r\n\r\nAzureFile\r\n\r\nAzureDisk\r\n\r\nCephFS\r\n\r\nCinder\r\n\r\nFiber Channel\r\n\r\nFlexVolume\r\n\r\nFlocker\r\n\r\nGCEPersistentDisk\r\n\r\nGlusterfs\r\n\r\nHostPath\r\n\r\niSCSI\r\n\r\nPhoton Persistent Disk\r\n\r\nQuobyte\r\n\r\nNFS\r\n\r\nRBD\r\n\r\nVsphere Volume\r\n\r\nPortworxVolume\r\n\r\nScaleIO\r\n\r\nMode d'acc\u00e8s\r\n\r\nRWO\r\n\r\nRWO, RXO et RWX\r\n\r\nRWO\r\n\r\nRWO, RXO et RWX\r\n\r\nRWO\r\n\r\nRWO et RXO\r\n\r\nRWO et RXO\r\n\r\nRWO\r\n\r\nRWO et RXO\r\n\r\nRWO, RXO et RWX RWO RWO et RXO\r\n\r\nRWO RWO, RXO et RWX\r\n\r\nRWO, RXO et RWX\r\n\r\nRWO et RXO\r\n\r\nRWO\r\n\r\nRWO et RWX\r\n\r\nRWO et RXO\r\n\r\nNom du pilote\r\n\r\nkubernetes.io\/aws-ebs\r\n\r\nkubernetes.io\/azure-file\r\n\r\nkubernetes.io\/azure-disk\r\n\r\nceph.com\/cephfs\r\n\r\nkubernetes.io\/cinder\r\n\r\nkubernetes.io\/fc\r\n\r\nexternal\/flex-simple\r\n\r\nkubernetes.io\/flocker\r\n\r\nkubernetes.io\/gce-pd\r\n\r\ngluster.org\/glusterfs-simple\r\n\r\nkubernetes.io\/host-path\r\n\r\niscsi-targetd\r\n\r\nkubernetes.io\/photon-pd\r\n\r\nkubernetes.io\/quobyte\r\n\r\nexample.com\/nfs\r\n\r\nkubernetes.io\/rbd\r\n\r\nvolume\r\n\r\nkubernetes.io\/scaleio\r\n\r\n209\r\n\r\nkubernetes.io\/vsphere-volume\r\n\r\nkubernetes.io\/portworx-<\/pre>\n<p>La deuxi\u00e8me colonne donne les capacit\u00e9s du pilote et la troisi\u00e8me la valeur que devra prendre le champ provisioner lors de&nbsp;sa&nbsp;d\u00e9claration.<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>Les pilotes historiques de type in-tree font actuellement l&rsquo;objet d&rsquo;un portage sur le standard CSI. Il s&rsquo;agit encore de travaux pr\u00e9liminaires qui sont toujours en version beta. \u00c0 l&rsquo;avenir, il ne restera que les pilotes out-of-tree.<\/p>\n<p>Ainsi, un volume cr\u00e9\u00e9 avec le pilote Vsphere Volume aura les caract\u00e9ristiques<\/p>\n<p>&#8211; Il ne pourra pas \u00eatre partag\u00e9 entre plusieurs pods.<\/p>\n<p>&#8211; Le champ provisioner aura la valeur kubernetes.io\/vsphere-<\/p>\n<p>Pour plus de d\u00e9tails, consultez les adresses suivantes (anglais):<\/p>\n<p>Classes de stockage de Kubernetes:<\/p>\n<p>https:\/\/kubernetes.io\/docs\/concepts\/storage\/storage-classes<\/p>\n<p>https:\/\/github.com\/kubernetes-incubator\/external-storage<\/p>\n<h4>3.6.3 Liste des pilotes charg\u00e9s<\/h4>\n<p>Pour obtenir la liste des pilotes charg\u00e9s dans un n\u0153ud Kubernetes, consultez la sortie du d\u00e9mon Kubelet.<\/p>\n<p>Sur une machine faisant appel \u00e0 systemd, vous pourrez obtenir cette informa- tion \u00e0 l&rsquo;aide de la commande journalctl suivie des options suivantes :<\/p>\n<p>&#8211; L&rsquo;option -u.<\/p>\n<p>&#8211; Le nom du service \u00e0 consulter (exemple : kubelet).<\/p>\n<p>Le d\u00e9mon Kubelet est verbeux. Afin de r\u00e9duire la quantit\u00e9 d&rsquo;informations remont\u00e9e, faites appel \u00e0 la commande grep. Dans le cas des pilotes charg\u00e9s automatiquement, les lignes int\u00e9ressantes contiendront la cha\u00eene de carac- t\u00e8res plugins.go.<\/p>\n<p>En combinant ces deux instructions, r\u00e9cup\u00e9rez la liste des pilotes de stockage \u00e0 l&rsquo;aide de la commande suivante :<\/p>\n<p>&nbsp;<\/p>\n<p>$ journalctl -u kubelet | grep \u00ab\u00a0plugins.go\u00a0\u00bb<\/p>\n<p>&nbsp;<\/p>\n<p>Ci-dessous un extrait de la sortie dans le cas d&rsquo;un noeud de cluster Kubernetes h\u00e9berg\u00e9 dans le cloud :<\/p>\n<p>plugins.go:159] Loaded network plugin \u00ab\u00a0kubenet\u00a0\u00bb<\/p>\n<p>plugins.go: 508] Loaded volume plugin \u00ab\u00a0kubernetes.io\/aws-ebs\u00a0\u00bb plugins.go:508] Loaded volume plugin \u00ab\u00a0kubernetes.io\/empty-dir\u00a0\u00bb plugins.go:508] Loaded volume plugin \u00ab\u00a0kubernetes.io\/gce-pd\u00a0\u00bb<\/p>\n<p>plugins.go: 508] Loaded volume plugin \u00ab\u00a0kubernetes.io\/storageos\u00a0\u00bb plugins.go: 508] Loaded volume plugin \u00ab\u00a0kubernetes.io\/csi\u00a0\u00bb<\/p>\n<p>Dans le cas de Minikube, Kubernetes ne charge aucun pilote. Ci-dessous la sortie que vous devriez obtenir :<\/p>\n<p>&#8230; plugins.go:103] No cloud provider specified.<\/p>\n<h3>3.7 D\u00e9claration d&rsquo;une classe de stockage<\/h3>\n<h4>3.7.1&nbsp; Structure de la d\u00e9claration<\/h4>\n<p>Tout comme pour un d\u00e9ploiement, la d\u00e9claration d&rsquo;une classe de stockage se fait \u00e0 l&rsquo;aide d&rsquo;un fichier au format YAML. Le fichier devra contenir les champs suivants :<\/p>\n<p>&#8211; apiVersion: doit prendre la valeur storage.k8s.io\/v1.<\/p>\n<p>&#8211; kind : doit prendre la valeur StorageClass.<\/p>\n<p>&#8211; metadata: doit contenir un champ name (hdd, sdd, nfs, etc.).<\/p>\n<p>&#8211; parameters: param\u00e8tres optionnels (type, encrypted).<\/p>\n<p>&#8211; provisioner: nom du pilote de gestion de volume.<\/p>\n<p>&#8211; reclaimPolicy: politique \u00e0 appliquer par d\u00e9faut sur les objets PersistentVolume en cas de suppression de l&rsquo;objet PersistentVo-<\/p>\n<p>lumeClaim associ\u00e9.<\/p>\n<p>&#8211; volumeBindingMode: politique pour la cr\u00e9ation des volumes (par d\u00e9faut&nbsp;<\/p>\n<p>imm\u00e9diat).<\/p>\n<p>&nbsp;<\/p>\n<h4>3.7.2 Exemple de d\u00e9claration<\/h4>\n<p>Dans l&rsquo;exemple qui va suivre, vous allez cr\u00e9er une classe de stockage respectant les indications suivantes :<\/p>\n<p>&#8211; Le stockage se fera \u00e0 l&rsquo;aide du service de stockage de Minikube (k8s.io\/ minikube-hostpath).<\/p>\n<p>&#8211; La classe portera le nom hdd.<\/p>\n<p>&#8211; La suppression de l&rsquo;objet PVC entra\u00eenera celle du PV.<\/p>\n<p>&#8211; La politique de cr\u00e9ation sera imm\u00e9diate.<\/p>\n<p>&#8211;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>Si vous faites tourner cet exemple en dehors de Minikube, il sera n\u00e9cessaire de changer la valeur du champ provisioner (par exemple: kubernetes.io\/ host-path).<\/p>\n<p>La d\u00e9claration ci-dessous correspond \u00e0 ces indications:<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: storage.k8s.io\/v1\r\n\r\nkind: StorageClass\r\n\r\nmetadata:\r\n\r\nname: hdd\r\n\r\nprovisioner: k8s.io\/minikube-hostpath reclaimPolicy: Delete\r\n\r\nvolumeBindingMode: Immediate<\/pre>\n<p>&nbsp;<\/p>\n<p>Sauvegardez cette d\u00e9claration dans le fichier <span style=\"color: #ff0000;\"><strong>storage-class.yaml.<\/strong><\/span><\/p>\n<ul>\n<li>Appliquez cette d\u00e9finition \u00e0 l&rsquo;aide de la commande suivante :<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>$ kubectl apply -f storage-class.yaml<\/p>\n<p>&nbsp;<\/p>\n<p>Ci-dessous le r\u00e9sultat renvoy\u00e9 au premier lancement: storageclass.storage.k8s.io\/hdd&nbsp;created<\/p>\n<p>&nbsp;<\/p>\n<h4>3.8 Test de cr\u00e9ation automatique d&rsquo;un volume persistant<\/h4>\n<p>Toutes ces d\u00e9clarations peuvent sembler de prime abord complexes. N\u00e9anmoins, sans ce m\u00e9canisme, l&rsquo;utilisateur doit r\u00e9aliser les op\u00e9rations<\/p>\n<p>suivantes :<\/p>\n<p>&#8211; Cr\u00e9ation du volume disque (dans une baie, cr\u00e9ation de r\u00e9pertoire, etc.) &#8211; Attribution des droits (chmod)<\/p>\n<p>&#8211; Cr\u00e9ation d&rsquo;un objet PV faisant la r\u00e9f\u00e9rence au volume ou \u00e0 l&#8217;emplacement du r\u00e9pertoire<\/p>\n<p>&#8211; Cr\u00e9ation d&rsquo;un objet PVC r\u00e9f\u00e9ren\u00e7ant le PV<\/p>\n<p>Suite \u00e0 l&rsquo;ajout de la classe de stockage, l&rsquo;utilisateur n&rsquo;aura plus qu&rsquo;\u00e0 cr\u00e9er un objet PVC.<\/p>\n<p>Il sera vu \u00e9galement par la suite que dans certains cas (objet StatefulSet), cette d\u00e9claration ne se fait plus directement mais au travers d&rsquo;un template afin d&rsquo;allouer automatiquement de la volum\u00e9trie.<\/p>\n<p>Pour ce test, l&rsquo;exemple avec l&rsquo;application MailHog sera repris. Le fichier de d\u00e9- ploiement n&rsquo;aura pas besoin d&rsquo;\u00eatre chang\u00e9.<\/p>\n<p>Au niveau de la d\u00e9claration du volume persistant, modifiez l&rsquo;\u00e9l\u00e9ment storageClassName pour le faire pointer sur le nom de la classe de stockage qui vient d&rsquo;\u00eatre cr\u00e9\u00e9e (hdd).<\/p>\n<h5>Ci-dessous le contenu du fichier <span style=\"color: #ff0000;\"><strong>pvc-mailhog.yaml et pv-mailhog.yam<\/strong><\/span>l suite \u00e0 cette modification :<\/h5>\n<p>&nbsp;<\/p>\n<p>Ci-dessous le fichier pc-mailhog.yaml :<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>ci-dessous le fichier pvc-mailhog.yaml :<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7145\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new.png\" alt=\"\" width=\"817\" height=\"386\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new.png 817w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new-300x142.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new-80x38.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new-768x363.png 768w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc-new-705x333.png 705w\" sizes=\"(max-width: 817px) 100vw, 817px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Appliquez la modification:<\/li>\n<\/ul>\n<p>$ kubectl apply -f pvc-maihog.yaml<\/p>\n<p>$ kubectl apply -f pv-maihog.yam<\/p>\n<p>&nbsp;<\/p>\n<p>Ci-dessous le r\u00e9sultat qui devrait \u00eatre renvoy\u00e9 :<\/p>\n<p>&nbsp;<\/p>\n<pre>The PersistentVolumeClaim \"pvc-mailhog\" is invalid: spec: Forbid- den: spec is immutable after creation except resources.requests for bound claims\r\n\r\ncore. PersistentVolumeClaimSpec{\r\n\r\nmations.\r\n\r\nsuivante :\r\n\r\nAccessModes: Selector:\r\n\r\nResources:\r\n\r\nVolume Name:\r\n\r\nVolume Name:\r\n\r\nVolumeMode:\r\n\r\nDataSource:\r\n\r\nDataSourceRef:\r\n\r\n- Le verbe delete.\r\n\r\n{\"ReadWriteOnce\"},\r\n\r\nnil, {...},\r\n\r\n11 11\r\n\r\n'<\/pre>\n<p>&nbsp;<\/p>\n<p>Ce message s&rsquo;explique assez facilement : Kubernetes vous interdit de changer certains champs.<\/p>\n<ul>\n<li>Remarque<\/li>\n<\/ul>\n<p>Un volume persistant n&rsquo;a pas vocation \u00e0 \u00eatre chang\u00e9 en cours de vie. En effet, un changement de classe de stockage pourrait entra\u00eener une perte d&rsquo;infor-<\/p>\n<p>Pour contourner le probl\u00e8me, vous allez supprimer le d\u00e9ploiement et la demande de volume persistant de MailHog. La suppression se fait \u00e0 l&rsquo;aide de la commande kubectl suivie des options suivantes :<\/p>\n<p>&#8211; Le verbe delete<\/p>\n<p>&#8211; L&rsquo;option -f suivie des fichiers de d\u00e9finition d&rsquo;objets \u00e0 supprimer. Dans le cas o\u00f9 le d\u00e9ploiement serait d\u00e9fini dans le fichier deployment.yaml et la demande de volume dans le fichier pvc.yaml, la commande \u00e0 lancer sera la suivante :<\/p>\n<p>&nbsp;<\/p>\n<p>$ kubectl delete -f pv-mailhog.yaml -f pvc-mailhog.yaml -f mailhog-deployment.yaml<\/p>\n<p>La commande renverra alors le r\u00e9sultat suivant:<\/p>\n<p>persistentvolumeclaim \u00ab\u00a0pvc-mailhog\u00a0\u00bb deleted deployment.extensions \u00ab\u00a0mailhog\u00a0\u00bb deleted<\/p>\n<p>&#x2611;Pour la cr\u00e9ation du volume persistant, faites appel \u00e0 cette commande:<\/p>\n<p>$ kubectl apply -f&nbsp; pv-mailhog.yaml -f pvc-mailhog.yaml -f mailhog-deployment.yaml<\/p>\n<p>Ci-dessous le r\u00e9sultat renvoy\u00e9 :<\/p>\n<p>persistentvolumeclaim\/pvc-mailhog created. deployment.extensions\/mailhog created<\/p>\n<p>Certains objets sont immutables : une fois cr\u00e9\u00e9s, ils ne peuvent pas \u00eatre modifi\u00e9s. La seule fa\u00e7on de les modifier est donc de proc\u00e9der \u00e0 leur suppression avant de relancer leur cr\u00e9ation. Autre point d&rsquo;attention, un objet PVC ne peut \u00eatre supprim\u00e9 tant qu&rsquo;il est utilis\u00e9 par un pod. Afin de pouvoir le supprimer, il est donc indispensable de supprimer l&rsquo;objet d\u00e9ploiement&nbsp;de&nbsp;MailHog.<\/p>\n<p>&nbsp;<\/p>\n<h1 style=\"text-align: right;\">Chapitre 7<\/h1>\n<h1 style=\"text-align: right;\">H\u00e9bergement d&rsquo;application<\/h1>\n<h1 style=\"text-align: right;\">en Cluster<\/h1>\n<h2 style=\"text-align: left;\">1. Objectifs du chapitre et pr\u00e9requis en cluster<\/h2>\n<p>Ce chapitre va aborder un besoin sp\u00e9cifique au fonctionnement de Kubernetes: l&rsquo;h\u00e9bergement d&rsquo;un groupe de pods fonctionnant en cluster. Ce ype d&rsquo;h\u00e9bergement se retrouve souvent lors de la mise en place de base de donn\u00e9es ou d&rsquo;un ensemble de machines fonctionnant en cluster pour offrir de La haute disponibilit\u00e9.<\/p>\n<p>La gestion de la persistance de donn\u00e9es sera abord\u00e9e puisqu&rsquo;elle diff\u00e8re l\u00e9g\u00e8re- ment du m\u00e9canisme pr\u00e9c\u00e9demment abord\u00e9.<\/p>\n<p>La synchronisation des donn\u00e9es entre pods sera quant \u00e0 elle abord\u00e9e dans le<\/p>\n<p>chapitre suivant.<\/p>\n<h2>2. Pr\u00e9requis d&rsquo;installation MariaDB sur le serveur<\/h2>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>&nbsp;<\/h2>\n<h2>&nbsp;<\/h2>\n<h2>2. D\u00e9ploiement d&rsquo;une base de donn\u00e9es MariaDB<\/h2>\n<h3>2.1 Origine du besoin<\/h3>\n<p>Le lancement d&rsquo;une base de donn\u00e9es dans Kubernetes ne constitue pas en soi une difficult\u00e9: il existe des images pour la plupart des bases de donn\u00e9es open Source&nbsp;du&nbsp;march\u00e9.<\/p>\n<p>La principale difficult\u00e9 va venir de deux aspects:<\/p>\n<p>La persistance de la donn\u00e9e.<\/p>\n<p>&#8211; La mise en place de la r\u00e9silience.<\/p>\n<p>Par la suite, l&rsquo;exercice va consister \u00e0 d\u00e9ployer une base de donn\u00e9es de type MariaDB et mettre en place une r\u00e9plication.<\/p>\n<h3>2.2 D\u00e9ploiement<\/h3>\n<h4>2.2.1 Choix de l&rsquo;image Docker<\/h4>\n<p>Sur le site Docker Hub (<span style=\"color: #ff6600;\"><strong>https:\/\/hub.docker.com)<\/strong><\/span>, la base de donn\u00e9es est disponible dans l&rsquo;image officielle mariadb (<span style=\"color: #ff6600;\"><strong>https:\/\/hub.docker.com\/_\/mariadb<\/strong><\/span>). Une premi\u00e8re installation va \u00eatre r\u00e9alis\u00e9e afin de se familiariser avec cette derni\u00e8re.<\/p>\n<h4>2.2.1.1 Comment charger image mariadb latest por docker<\/h4>\n<h5>2.2.1.1.1 Proc\u00e9dure par ChatGPT IA<\/h5>\n<p>A: Pour charger l&rsquo;image de MariaDB la plus r\u00e9cente dans Docker, vous pouvez suivre les \u00e9tapes ci-dessous :<br \/>\n1. *Installer Docker* : Assurez-vous que Docker est install\u00e9 sur votre machine. Vous pouvez v\u00e9rifier cela en ex\u00e9cutant la commande suivante dans votre terminal :<br \/>\nbash<br \/>\ndocker &#8211;version<\/p>\n<p>2. *Tirer l&rsquo;image MariaDB* : Utilisez la commande suivante pour t\u00e9l\u00e9charger la derni\u00e8re version de l&rsquo;image MariaDB depuis Docker Hub :<br \/>\nbash<br \/>\n<strong>docker pull mariadb:latest<\/strong><\/p>\n<p>Cela t\u00e9l\u00e9chargera l&rsquo;image la plus r\u00e9cente de MariaDB.<br \/>\n3. *Cr\u00e9er un conteneur depuis l&rsquo;image* : Une fois l&rsquo;image t\u00e9l\u00e9charg\u00e9e, vous pouvez cr\u00e9er un conteneur MariaDB en ex\u00e9cutant la commande suivante :<br \/>\nbash<br \/>\n<strong>docker run &#8211;name nom_du_conteneur -e MYSQL_ROOT_PASSWORD=mon_mot_de_passe -d mariadb:latest<\/strong><\/p>\n<p>Remplacez nom_du_conteneur par le nom que vous souhaitez donner \u00e0 votre conteneur et mon_mot_de_passe par le mot de passe que vous souhaitez utiliser pour l&rsquo;utilisateur root de MariaDB.<br \/>\n4. *V\u00e9rifier que le conteneur fonctionne* : Pour v\u00e9rifier que votre conteneur est en cours d&rsquo;ex\u00e9cution, utilisez la commande :<br \/>\nbash<br \/>\ndocker ps<\/p>\n<p>5. *Se connecter \u00e0 MariaDB* : Vous pouvez vous connecter \u00e0 MariaDB en utilisant la commande suivante :<br \/>\nbash<br \/>\ndocker exec -it nom_du_conteneur mysql -u root -p<\/p>\n<p>Entrez le mot de passe que vous avez configur\u00e9 \u00e0 l&rsquo;\u00e9tape 3.<br \/>\nAvec ces \u00e9tapes, vous devriez \u00eatre en mesure de charger et de d\u00e9marrer l&rsquo;image MariaDB la plus r\u00e9cente sur Docker. Si vous rencontrez des probl\u00e8mes ou avez besoin d&rsquo;informations suppl\u00e9mentaires, n&rsquo;h\u00e9sitez pas \u00e0 demander.<br \/>\nhttps:\/\/apps.apple.com\/app\/apple-store\/id6447419372?pt=121708643&#038;ct=question-share&#038;mt=8<\/p>\n<h5>2.2.1.1.2 Ianstallation image last t\u00e9l\u00e9charg\u00e9e<\/h5>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~\/mariadb$ <span style=\"color: #ff0000;\"><strong>docker pull mariadb:latest<\/strong><\/span><\/p>\n<pre>latest: Pulling from library\/mariadb\r\ndafa2b0c44d2: Pull complete\r\n2d5e0d69d765: Pull complete\r\n5145df719521: Pull complete\r\nffe11d25f6ee: Pull complete\r\nf0eb027ac47e: Pull complete\r\n586260156254: Pull complete\r\n62c80f8d2eea: Pull complete\r\n36be09cfdba3: Pull complete\r\nDigest: sha256:4066f2d4805fef72a83cf4a62689a0aadb6e83a8c8a82b64431edd4b94f684f8\r\nStatus: Downloaded newer image for mariadb:latest\r\ndocker.io\/library\/mariadb:latest<\/pre>\n<p>u70779858@Kubernetes-SRV:~\/mariadb$<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7155\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb.png\" alt=\"\" width=\"726\" height=\"328\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb.png 726w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb-300x136.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb-80x36.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb-705x319.png 705w\" sizes=\"(max-width: 726px) 100vw, 726px\" \/><\/a><\/p>\n<h4>3- Cr\u00e9er un container depuis l&rsquo;image<\/h4>\n<p>$ <strong>docker run &#8211;name MyMariaDB -e MYSQL_ROOT_PASSWORD=mon_mot_de_passe -d mariadb:latest<\/strong><\/p>\n<p>4- V\u00e9rifier que le conteneur fonctionne<\/p>\n<p>u70779858@Kubernetes-SRV:~\/mariadb$ <strong>docker ps<\/strong><\/p>\n<pre>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\r\n52e3a99847cc mariadb:latest \"docker-entrypoint.s\u2026\" 2 minutes ago Up About a minute 3306\/tcp MyMariaDB\r\n9f0e62fa257f mariadb:latest \"docker-entrypoint.s\u2026\" 5 minutes ago Up 4 minutes 3306\/tcp nom_du_conteneur\r\n0f23edd5f7b4 gcr.io\/k8s-minikube\/kicbase:v0.0.44 \"\/usr\/local\/bin\/entr\u2026\" 7 weeks ago Up 7 hours 127.0.0.1:32768-&gt;22\/tcp, 127.0.0.1:32769-&gt;237.0.0.1:32770-&gt;5000\/tcp, 127.0.0.1:32771-&gt;8443\/tcp, 127.0.0.1:32772-&gt;32443\/tcp minikube<\/pre>\n<p>&nbsp;<\/p>\n<p>u70779858@Kubernetes-SRV:~\/mariadb$ docker ps<br \/>\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<br \/>\n52e3a99847cc mariadb:latest \u00ab\u00a0docker-entrypoint.s\u2026\u00a0\u00bb 2 minutes ago Up About a minute 3306\/tcp MyMariaDB<br \/>\n9f0e62fa257f mariadb:latest \u00ab\u00a0docker-entrypoint.s\u2026\u00a0\u00bb 5 minutes ago Up 4 minutes 3306\/tcp nom_du_conteneur<br \/>\n0f23edd5f7b4 gcr.io\/k8s-minikube\/kicbase:v0.0.44 \u00ab\u00a0\/usr\/local\/bin\/entr\u2026\u00a0\u00bb 7 weeks ago Up 7 hours 127.0.0.1:32768-&gt;22\/tcp, 127.0.0.1:32769-&gt;2376\/tcp, 127.0.0.1:32770-&gt;5000\/tcp, 127.0.0.1:32771-&gt;8443\/tcp, 127.0.0.1:32772-&gt;32443\/tcp minikube<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h4>2.2.2 Version initiale du fichier de d\u00e9ploiement<\/h4>\n<p>Comme vu pr\u00e9c\u00e9demment, kubectl permet de cr\u00e9er une \u00e9bauche de fichier de d\u00e9ploiement.<\/p>\n<p>Pour cela, passez-lui les options suivantes :<\/p>\n<p>&#8211; Le verbe create suivi du type (deployment).<\/p>\n<p>&#8211; Un nom pour le d\u00e9ploiement (mariadb).<\/p>\n<p>&#8211; L&rsquo;option image suivie du nom d&rsquo;image \u00e0 utiliser (mariadb).<\/p>\n<p>&#8211; L&rsquo;option &#8211;dry-run pour ne pas cr\u00e9er directement le d\u00e9ploiement. &#8211; L&rsquo;option &#8211;output yaml pour obtenir le r\u00e9sultat au format YAMLL Redirigez \u00e9galement le r\u00e9sultat de la commande dans le fichier mariadb- deployment.yaml.<\/p>\n<p>Ci-dessous la commande correspondante :<\/p>\n<p>$ kubectl create deployment mariadb\\n&#8211;image-mariadb &#8211;dry-run=server &#8211;output yaml &gt; M<strong>ariadb-deployment.yaml<\/strong><\/p>\n<p>Fichier : M<strong>ariadb-deployment.yaml<\/strong><\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\ngeneration: 1\r\nlabels:\r\napp: mariadb\r\nname: mariadb\r\nnamespace: default\r\nspec:\r\nprogressDeadlineSeconds: 600\r\nreplicas: 1\r\nrevisionHistoryLimit: 10\r\nselector:\r\nmatchLabels:\r\napp: mariadb\r\nstrategy:\r\nrollingUpdate:\r\nmaxSurge: 25%\r\nmaxUnavailable: 25%\r\ntype: RollingUpdate\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mariadb\r\nspec:\r\ncontainers:\r\n- image: mariadb:latest\r\nimagePullPolicy: Always\r\nname: mariadb\r\nresources: {}\r\nterminationMessagePath: \/dev\/termination-log\r\nterminationMessagePolicy: File\r\ndnsPolicy: ClusterFirst\r\nrestartPolicy: Always\r\nschedulerName: default-scheduler\r\nsecurityContext: {}\r\nterminationGracePeriodSeconds: 30<\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7161\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2.png\" alt=\"\" width=\"638\" height=\"727\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2.png 638w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2-263x300.png 263w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2-70x80.png 70w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb2-619x705.png 619w\" sizes=\"(max-width: 638px) 100vw, 638px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h3>2.2.3 Gestion de la r\u00e9entrance<\/h3>\n<p>&nbsp;<\/p>\n<p>Afin de g\u00e9rer la r\u00e9entrance, les champs inutiles (vides, nuls ou \u00e0 une valeur par d\u00e9faut) vont \u00eatre supprim\u00e9s.<\/p>\n<p>Ci-dessous la liste des champs \u00e0 supprimer:<\/p>\n<p>&#8211; metadata &#8211;&gt; creationTimestamp<\/p>\n<p>&#8211; spec &#8211;&gt; replicas<\/p>\n<p>&#8211; spec &#8211;&gt; strategy<\/p>\n<p>&#8211; spec &#8211;&gt; template &#8211;&gt; metadata &#8211;&gt; creationTimestamp<\/p>\n<p>&#8211; spec &#8211;&gt; template &#8211;&gt; spec &#8211;&gt; containers &#8211;&gt; resources<\/p>\n<p>&#8211; status<\/p>\n<p>&nbsp;<\/p>\n<p>Ci-dessous le contenu du fichier Mariadb-deployment.yaml apr\u00e8s ces modifications et renomm\u00e9 en Mariadb-deployment2.yaml&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\ngeneration: 1\r\nlabels:\r\napp: mariadb\r\nname: mariadb\r\nnamespace: default\r\nspec:\r\nprogressDeadlineSeconds: 600\r\nreplicas: 1\r\nrevisionHistoryLimit: 10\r\nselector:\r\nmatchLabels:\r\napp: mariadb\r\nstrategy:\r\nrollingUpdate:\r\nmaxSurge: 25%\r\nmaxUnavailable: 25%\r\ntype: RollingUpdate\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mariadb\r\nspec:\r\ncontainers:\r\n- image: mariadb:latest\r\nimagePullPolicy: Always\r\nname: mariadb\r\nresources: {}\r\nterminationMessagePath: \/dev\/termination-log\r\nterminationMessagePolicy: File\r\nenv:\r\n- name: MYSQL_ROOT_PASSWORD\r\nvalue: my-secret-pw\r\ndnsPolicy: ClusterFirst\r\nrestartPolicy: Always\r\nschedulerName: default-scheduler\r\nsecurityContext: {}\r\nterminationGracePeriodSeconds: 30<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7162\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3.png\" alt=\"\" width=\"640\" height=\"723\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3.png 640w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3-266x300.png 266w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3-71x80.png 71w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb3-624x705.png 624w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>2.3 Volume persistant<\/h3>\n<h4>2.3.1 Demande de volume persistant<\/h4>\n<p>Afin de conserver les donn\u00e9es de la base,un objet PersistentVolume et un objet PersistentVolume- Claim vont \u00eatre cr\u00e9\u00e9s. Ce dernier r\u00e9pondra aux crit\u00e8res suivants : PV et PVC<\/p>\n<p>&#8211; Le champ metadata &#8211;&gt; name aura la valeur mariadb-data.<\/p>\n<p>&#8211; Sa taille sera fix\u00e9e \u00e0 10Go.<\/p>\n<p>Ci-dessous la d\u00e9claration correspondante :<\/p>\n<pre>apiVersion: v1\r\nkind: PersistentVolume\r\nmetadata:\r\nname: mariadb-pv\r\nspec:\r\naccessModes:\r\n- ReadWriteOnce\r\ncapacity:\r\nstorage: 10Gi\r\nhostPath:\r\npath: \/data\/mariadb<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7163\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv2.png\" alt=\"\" width=\"640\" height=\"424\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv2.png 640w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv2-300x199.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pv2-80x53.png 80w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>PersistentVolume Claim :<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: v1\r\nkind: PersistentVolumeClaim\r\nmetadata:\r\nname: mariadb-pvc\r\nspec:\r\naccessModes:\r\n- ReadWriteOnce\r\nresources:\r\nrequests:\r\nstorage: 10Gi<\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc2.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7164\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc2.png\" alt=\"\" width=\"698\" height=\"424\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc2.png 698w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc2-300x182.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/pvc2-80x49.png 80w\" sizes=\"(max-width: 698px) 100vw, 698px\" \/><\/a><\/p>\n<p>Sauvegardez le contenu de cette d\u00e9claration dans le fichier <strong>Mariadb-pv.yaml<\/strong> et <strong>Mariadb-pvc.yaml&nbsp;<\/strong> let lancez la cr\u00e9ation de cet objet :<\/p>\n<p>$ kubectl apply -f Mariadb-pv.yaml<\/p>\n<p>$ kubectl apply -f Mariadb-pvc.yaml<\/p>\n<p>La commande doit alors renvoyer le message suivant :<\/p>\n<p>&nbsp;<\/p>\n<pre>persistentvolume\/mariadb-data created<\/pre>\n<p>&nbsp;<\/p>\n<h4>2.3.2 \u00c9tat de la demande de volume persistant Consultez ensuite l&rsquo;\u00e9tat de l&rsquo;objet pvc :<\/h4>\n<p>$ kubectl get pv mariadb-data<\/p>\n<p>$ kubectl get pvc mariadb-data<\/p>\n<p>Ci-dessous un exemple de r\u00e9sultat indiquant que le volume est pr\u00eat :<\/p>\n<pre>NAME\r\n\r\nSTATUS VOLUME\r\n\r\nmariadb-data Bound\r\n\r\nCAPACITY ACCESS MODES\r\n\r\npvc-x-xxx-XX-X 10 Gi&nbsp;\r\n\r\nRWO<\/pre>\n<p>&nbsp;<\/p>\n<h3>2.3.3 Ajout d&rsquo;une persistance sur le container de MariaDB<\/h3>\n<p>Le volume persistant est pr\u00eat. Reste \u00e0 indiquer au container de MariaDB d&rsquo;uti- liser cet objet.<\/p>\n<p>&#x2611;Dans le fichier de d\u00e9ploiement de MariaDB, ajoutez les champs suivants :<\/p>\n<p>&#8211; volumes au niveau du champ spec &#8211;&gt; template- &#8211;&gt; spec.<\/p>\n<p>&#8211; volume Mounts au niveau du champ spec &#8211;&gt; template. &#8211;&gt; containers.<\/p>\n<p>Le champ volumes contiendra l&rsquo;enregistrement suivant :<\/p>\n<p>&#8211; Un champ name suivi de la valeur mariadb-data.<\/p>\n<p>&#8211; Un enregistrement persistentVolumeClaim contenant le champ claimName \u00e0 la valeur maria-data<\/p>\n<p>&nbsp;<\/p>\n<pre>volumes:\r\n\r\n&nbsp;&nbsp; - name: mariadb-data\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; persistentVolumeClaim: { claimName: mariadb-data }<\/pre>\n<p>Le champ volumeMounts aura le contenu suivant :<\/p>\n<p>&#8211; Un champ mount Path \u00e0 la valeur \/var\/lib\/mysql.<\/p>\n<p>&#8211; Un champ name \u00e0 la valeur mariadb-data.<\/p>\n<p>Remarque :<\/p>\n<p>Le chemin \/var\/lib\/mysql correspond au chemin standard o\u00f9 sont stock\u00e9s les fichiers de la base de donn\u00e9es dans le cas de MariaDB ou MySQL.<\/p>\n<p>Ci-dessous la d\u00e9claration correspondante :<\/p>\n<pre>volumeMounts:\r\n  - mountPath: \/var\/lib\/mysql\r\n    nom: mariadb-data<\/pre>\n<p>En reprenant toutes ce indications, le contenu du fichier de d\u00e9ploiement de&nbsp; MariaDB devrait \u00eatre le suivant : <strong>Mariadb-deployment3.yaml<\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\ngeneration: 1\r\nlabels:\r\napp: mariadb\r\nname: mariadb\r\nnamespace: default\r\nspec:\r\nprogressDeadlineSeconds: 600\r\nreplicas: 1\r\nrevisionHistoryLimit: 10\r\nselector:\r\nmatchLabels:\r\napp: mariadb\r\nstrategy:\r\nrollingUpdate:\r\nmaxSurge: 25%\r\nmaxUnavailable: 25%\r\ntype: RollingUpdate\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mariadb\r\nspec:\r\ncontainers:\r\n- image: mariadb:latest\r\nimagePullPolicy: Always\r\nname: mariadb\r\nresources: {}\r\nterminationMessagePath: \/dev\/termination-log\r\nterminationMessagePolicy: File\r\nenv:\r\n- name: MYSQL_ROOT_PASSWORD\r\nvalue: my-secret-pw\r\nports:\r\n- containerPort: 3306\r\nvolumeMounts:\r\n- name: mariadb-data\r\nmountPath: \/var\/lib\/mysql\r\nvolumes:\r\n- name: mariadb-data\r\npersistentVolumeClaim:\r\nclaimName: mariadb-pvc\r\ndnsPolicy: ClusterFirst\r\nrestartPolicy: Always\r\nschedulerName: default-scheduler\r\nsecurityContext: {}\r\nterminationGracePeriodSeconds: 30<\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7165\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4.png\" alt=\"\" width=\"692\" height=\"697\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4.png 692w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4-298x300.png 298w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4-80x80.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4-36x36.png 36w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb4-180x180.png 180w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb5.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7166\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb5.png\" alt=\"\" width=\"692\" height=\"170\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb5.png 692w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb5-300x74.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb5-80x20.png 80w\" sizes=\"(max-width: 692px) 100vw, 692px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Appliquez maintenant la d\u00e9finition de ce fichier \u00e0 l&rsquo;aide de la commande<\/p>\n<p>$ kubectl apply -f Mariadb-deployment3.yaml<\/p>\n<p>La commande doit alors renvoyer la sortie suivante :<\/p>\n<p>&nbsp;<\/p>\n<pre>deployment.apps\/mariadb created<\/pre>\n<h4>2.3.4 Consultation de l&rsquo;\u00e9tat du d\u00e9ploiement<\/h4>\n<p>Consultez l&rsquo;\u00e9tat du d\u00e9ploiement \u00e0 l&rsquo;aide de la commande suivante :<\/p>\n<p>$ kubectl get -f app-mariadb<\/p>\n<p>Afin de comprendre pourquoi le pod red\u00e9marre tout le temps, consultez le journal d&rsquo;activit\u00e9 \u00e0 l&rsquo;aide de la commande suivante :<\/p>\n<p>\u25a0 $ kubectl logs -l app=mariadb<\/p>\n<p>&nbsp;<\/p>\n<h3>4 Configuration de la base de donn\u00e9es<\/h3>\n<p>Le message d&rsquo;erreur indique que MariaDB (lors du premier d\u00e9marrage) a besoin de conna\u00eetre le mot de passe de l&rsquo;administrateur.<\/p>\n<p>Traditionnellement, dans le monde des containers, ces informations se transmettent \u00e0 l&rsquo;aide de variables d&rsquo;environnement.<\/p>\n<p>Afin de sp\u00e9cifier le mot de passe, la d\u00e9finition du container mariadb va \u00eatre \u00e9tendue avec le champ env. Ce champ env devra contenir un enregistrement disposant des informations suivantes :<\/p>\n<p>&#8211; Le champ name suivi de la valeur MYSQL ROOT PASSWORD. &#8211; Le champ value suivi de la valeur mot-de-passe-root. Ci-dessous la d\u00e9claration correspondante de ce champ:<\/p>\n<p>env:<\/p>\n<p>name: MYSQL ROOT PASSWORD<\/p>\n<p>value: mot-de-passe-root<\/p>\n<p>Ci-dessous la d\u00e9claration compl\u00e8te int\u00e9grant cette modification:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb6.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7167\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb6.png\" alt=\"\" width=\"622\" height=\"268\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb6.png 622w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb6-300x129.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/mariadb6-80x34.png 80w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>\u25baSauvegardez la modification dans le fichier mariadb-deployment.yaml et appliquez la modification :<\/p>\n<p>$ kubectl apply -f mariadb-deployment.yaml<\/p>\n<p>La commande doit alors renvoyer le message suivant :<\/p>\n<p>deployment.apps\/mariadb configured<\/p>\n<h3>2.5 Consultation de l&rsquo;\u00e9tat du pod<\/h3>\n<h4>2.5.1 Liste des pods<\/h4>\n<p>\u25a0 Consultez l&rsquo;\u00e9tat du pod de MariaDB \u00e0 l&rsquo;aide de la commande suivante :<\/p>\n<p>$ kubectl get pods -l app=mariadb<\/p>\n<p>La commande doit alors renvoyer la sortie suivante:<\/p>\n<pre>mariadb-d9d64786c-cgt8b\r\n\r\nREADY 1\/1\r\n\r\nSTATUS Running\r\n\r\nRESTARTS<\/pre>\n<p>Ici, le container associ\u00e9 \u00e0 MariaDB fonctionne correctement.&nbsp;<\/p>\n<h3>25.2 Connexion au container<\/h3>\n<p>Afin de tester le fonctionnement de la base de donn\u00e9es, vous allez devoir lan- cer un shell dans le container de base de donn\u00e9es :<\/p>\n<p>S kubectl exec -it deployment\/mariadb &#8212; bash<\/p>\n<p>Afin de vous assurer que tout fonctionne, lancez la commande mysqlad- min suivie des options suivantes :<\/p>\n<p>&#8211; Le mot-cl\u00e9 status.<\/p>\n<p>\u2013 L&rsquo;option -p suivie de la variable d&rsquo;environnement contenant le mot de passe (-p$MYSQL_ROOT_PASSWORD).<\/p>\n<p>Ci-dessous la commande correspondante :<\/p>\n<p>|| \u015d mysqladmin status -p$MYSQL_ROOT_PASSWORD<\/p>\n<p>Ci-dessous un exemple de ce qui pourrait \u00eatre renvoy\u00e9 :<\/p>\n<p>\u25a0 Uptime: 630 Threads: 7 &#8230; Queries per second avg: 0.001 Cette commande sera utilis\u00e9e pour mettre en place la surveillance de l&rsquo;\u00e9tat du pod (liveness et readiness).<\/p>\n<h4>2.5.3 Cr\u00e9ation de l&rsquo;entr\u00e9e de service<\/h4>\n<p>Pour la suite de l&rsquo;exercice, il est n\u00e9cessaire de disposer d&rsquo;une entr\u00e9e de service. Ci-dessous un exemple de d\u00e9claration permettant de g\u00e9rer la connexion vers la base de donn\u00e9es :<\/p>\n<pre>apiVersion: v1\r\nkind: Service\r\nmetadata:\r\nname: mariadb\r\nspec:\r\nports:\r\n- port: 3306\r\ntargetPort: 3306\r\nselector:\r\napp: mariadb<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7168\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service.png\" alt=\"\" width=\"762\" height=\"285\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service.png 762w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service-300x112.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service-80x30.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/service-705x264.png 705w\" sizes=\"(max-width: 762px) 100vw, 762px\" \/><\/a><\/p>\n<p>Sauvegardez la d\u00e9finition dans le fichier <strong>Mariadb-service.yaml<\/strong> puis appliquez-la aupr\u00e8s de l&rsquo;API de Kubernetes:<\/p>\n<p>$ kubectl apply -f service.yaml<\/p>\n<p>Le service est maintenant disponible pour la suite de l&rsquo;exercice.<\/p>\n<h4>2.6 Surveillance de la base de donn\u00e9es<\/h4>\n<h5>2.6.1 D\u00e9finition des commandes de surveillance<\/h5>\n<p>Comme vu pr\u00e9c\u00e9demment, il est possible de d\u00e9finir une surveillance sur un container en d\u00e9finissant les champs startup Probe, liveness Probe et<\/p>\n<p>readiness Probe.<\/p>\n<p>Ces champs seront identiques et contiendront tous la structure exec compo- s\u00e9e d&rsquo;un sous-champ command.<\/p>\n<p>Le champ command sera un tableau contenant la commande \u00e0 ex\u00e9cuter.<\/p>\n<p>Remarque<\/p>\n<p>La commande mysqladmin ne sera pas directement transpos\u00e9e dans le tableau. En effet, sous cette forme, l&rsquo;appel \u00e0 la variable d&rsquo;environnement $MYSQL_ROOT_PASSWORD n&rsquo;est pas interpr\u00e9t\u00e9.<\/p>\n<p>Afin d&rsquo;interpr\u00e9ter le contenu de la variable, il est n\u00e9cessaire de passer par un shell sh. Pour interpr\u00e9ter cette commande, ajoutez l&rsquo;option -c suivie de la commande mysqladmin et de ses options.<\/p>\n<p>&#x2611;En reprenant ces indications, ajoutez les champs suivants au container:<\/p>\n<pre>startupProbe: &amp;probe\r\n\r\nexec:\r\n\r\ncommand:\r\n\r\n\"sh\"\r\n\r\n- \"-c\"\r\n\r\n<span style=\"color: #ff0000;\"><strong>\"mysqladmin <\/strong>status -p $MYSQL_ROOT_PASSWORD\"<\/span>\r\n\r\nlivenessProbe: *probe\r\n\r\nreadiness Probe: *probe\r\n\r\nENI - All&nbsp;rights&nbsp;reserved<\/pre>\n<h1><span style=\"color: #ff0000;\">MysqlAdmin n&rsquo;est pas inclus dans image <\/span><\/h1>\n<p>&nbsp;<\/p>\n<p>Ci-dessous le contenu de l&rsquo;ensemble du fichier suite \u00e0 cette modification:<\/p>\n<pre>apiVersion: apps\/v1\r\n\r\nkind: Deployment\r\n\r\nmetadata:\r\n\r\nlabels:\r\n\r\napp: mariadb\r\n\r\nname: mariadb\r\n\r\nspec:\r\n\r\nselector:\r\n\r\nmatchLabels:\r\n\r\napp: mariadb\r\n\r\ntemplate:\r\n\r\nmetadata:\r\n\r\nlabels:\r\n\r\napp: mariadb\r\n\r\nspec:\r\n\r\nvolumes:\r\n\r\n-\r\n\r\nname: mariadb-data\r\n\r\npersistentVolumeClaim: { claimName: mariadb-data }\r\n\r\ncontainers:\r\n\r\nimage: mariadb\r\n\r\nname: mariadb\r\n\r\nvolumeMounts:\r\n\r\nenv:\r\n\r\nmountPath: \/var\/lib\/mysql\r\n\r\nname:\r\n\r\nexec:\r\n\r\ncommand:\r\n\r\n\"sh\"\r\n\r\n- \"-c\"\r\n\r\nmariadb-data\r\n\r\nname: MYSQL_ROOT_PASSWORD value: mot-de-passe-root startup Probe: &amp;probe\r\n\r\n\"mysqladmin status -p$MYSQL_ROOT_PASSWORD\"\r\n\r\nliveness Probe: *probe\r\n\r\nreadiness Probe: *probe<\/pre>\n<p>Sauvegardez cette d\u00e9finition dans le fichier mariadb-deployment.yaml&nbsp;<\/p>\n<h3>2.6.2 Application de la modification<\/h3>\n<p>\u25a0Appliquez la modification \u00e0 l&rsquo;aide de la commande suivante :<\/p>\n<p>$ kubectl apply -f mariadb-deployment.yaml<\/p>\n<p>La commande doit alors renvoyer la sortie suivante :<\/p>\n<p>| deployment.apps\/mariadb configured<\/p>\n<p>2.6.3 V\u00e9rification du d\u00e9ploiement<\/p>\n<p>\u25baAfin de s&rsquo;assurer que la modification est bien prise en compte, consultez les pods portant le label app-mariadb:<\/p>\n<p>$ kubectl get pods -1 app=mariadb<\/p>\n<p>La commande devrait renvoyer le r\u00e9sultat suivant :<\/p>\n<pre>NAME\r\n\r\nmariadb-57667fb6f8-vrf6p\r\n\r\n<span style=\"color: #ff0000;\"><strong>mariadb-754c8b696d-pnmq9<\/strong><\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>$ kubectl logs mariadb-754c8b696d-pnmq9<\/p>\n<p>&nbsp;<\/p>\n<p>Le nouveau pod a d\u00e9marr\u00e9, mais n&rsquo;est pas pr\u00eat. Ce dernier a m\u00eame \u00e9t\u00e9 suppri- m\u00e9 et red\u00e9marr\u00e9 par le moteur Kubernetes.<\/p>\n<p>Consultez les \u00e9v\u00e9nements remont\u00e9s par le moteur Kubernetes:<\/p>\n<p>$ kubectl describe pods mariadb-754c8b696d-pnmq9<\/p>\n<p>La section Events contient certains messages d&rsquo;alerte (niveau Warning). Ci- dessous un exemple de contenu indiquant une erreur de lancement: Readiness probe failed; mysqladmin: connect to server at<\/p>\n<p>1 (5s ago) 38s<\/p>\n<p>error: &lsquo;Can&rsquo;t connect to local MySQL server through socket<\/p>\n<p>&lsquo;\/var\/run\/mysqld\/mysqld.sock&rsquo; (2)&rsquo;<\/p>\n<p>Check that mysqld is running and that the socket: &lsquo;\/var\/run\/mysqld\/mysqld.sock&rsquo; exists!<\/p>\n<p>Afin de consulter le journal d&rsquo;activit\u00e9 du pod, lancez&nbsp;la&nbsp;commande<\/p>\n<p>Ci-dessous un exemple d&rsquo;erreur remont\u00e9 par MariaDB :<\/p>\n<p>&nbsp;<\/p>\n<pre>. [ERROR] InnoDB: Unable to lock .\/ibdatal error: 11\r\n[Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.\r\n. [ERROR] InnoDB: Unable to lock .\/ibdatal error: 11\r\n. [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.<\/pre>\n<p>Le container n&rsquo;arrive pas \u00e0 d\u00e9marrer en raison de la pr\u00e9sence d&rsquo;un lock dans les fichiers de base de donn\u00e9es.<\/p>\n<p>Ce lock s&rsquo;explique parfaitement en raison du fait qu&rsquo;un pod est d\u00e9j\u00e0 d\u00e9marr\u00e9 et que ce dernier utilise d\u00e9j\u00e0 les fichiers pr\u00e9sents.<\/p>\n<h3>2.7 M\u00e9canisme de d\u00e9ploiement<\/h3>\n<p>Par d\u00e9faut, si rien n&rsquo;est sp\u00e9cifi\u00e9, Kubernetes utilise un d\u00e9ploiement par roule- ment. Le principe de ce m\u00e9canisme est le suivant :<\/p>\n<p>&#8211; Un nouveau pod est d\u00e9marr\u00e9 en parall\u00e8le de l&rsquo;ancien.<\/p>\n<p>&#8211; Lorsque le nouveau pod est pr\u00eat, l&rsquo;ancien pod est supprim\u00e9.<\/p>\n<p>Dans le cas o\u00f9 plusieurs pods seraient d\u00e9marr\u00e9s, Kubernetes r\u00e9alisera l&rsquo;op\u00e9ra- tion pod par pod jusqu&rsquo;\u00e0 remplacer compl\u00e8tement les anciens pods.<\/p>\n<p>La plupart du temps, ce type de comportement est le bon puisque les temps d&rsquo;indisponibilit\u00e9 sont ainsi r\u00e9duits. Dans le cas pr\u00e9sent, cette strat\u00e9gie consti- tue un probl\u00e8me.<\/p>\n<p>Le probl\u00e8me vient du fait qu&rsquo;une base de donn\u00e9es ne peut pas partager ses<\/p>\n<p>Le changement de la cin\u00e9matique de d\u00e9ploiement se fait en modifiant le champ deployment &#8211;&gt; spec &#8211;&gt; strategy&nbsp;&#8211;&gt;&nbsp;type.<\/p>\n<p>Ci-dessous le valeurs possibles:<\/p>\n<p>-RollingUpdate : remplacement par vageur de pods existants (m\u00e9canisme par d\u00e9fault)<\/p>\n<ul>\n<li>Recreate : suppression des anciens pods avant recr\u00e9ation.<\/li>\n<\/ul>\n<p>Ci-dessous un extrait de la d\u00e9claration du d\u00e9pliement apr\u00e8s ce changement de strat\u00e9gies.<\/p>\n<p>&nbsp;<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\ngeneration: 1\r\nlabels:\r\napp: mariadb\r\nname: mariadb\r\nspec:\r\nstrategy:\r\ntype: Recreate\r\nselector:\r\nmatchLabels:\r\napp: mariadb\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mariadb<\/pre>\n<p>$ kubectl apply -f Mariadb&#8230;yaml<\/p>\n<p>$ kubectl get pods -l app=mariadb &#8211;watch<\/p>\n<p>Le nouveau container de la base de donn\u00e9es a bien d\u00e9marr\u00e9.<\/p>\n<h2>3. Mise en place d&rsquo;un StatefulSet<\/h2>\n<h3>3.1 Augmentation du nombre de pods associ\u00e9s au d\u00e9ploiement<\/h3>\n<p>&nbsp;<\/p>\n<p>En informatique l&rsquo;augmentation du nombre de lancements d&rsquo;une m\u00eame application permet de r\u00e9gler 2 types de probl\u00e8mes:<\/p>\n<p>-Augmentation de la r\u00e9silience d&rsquo;un syst\u00e8me.<\/p>\n<p>&#8211; Augmentation de la capacit\u00e9 de traitement d&rsquo;un syst\u00e8me<\/p>\n<p>Kubernetes offrre un m\u00e9canisme permettant de la mont\u00e9e en charge automatique au niveau des d\u00e9ploiements.<\/p>\n<p>Pour changer le nombre de pods associ\u00e9s \u00e0 un d\u00e9ploiement, vous pouvez vous appuyersur la commande kubectl suivie des options suivantes:<\/p>\n<p>&#8211; Le verbe scale.<\/p>\n<p>&#8211; Le type d&rsquo;objet \u00e0 modifier (deployment)<\/p>\n<p>&#8211; Le nom de l&rsquo;objet \u00e0 modifier (mariadb)<\/p>\n<p>&#8211; Le nombre de replicas souhait\u00e9 (&#8211;replicas=2)<\/p>\n<p>Pour passer de 1 \u00e0 2 pods, l&rsquo;op\u00e9ration pourra se faire avec la commande suivante:<\/p>\n<p>$ kubectl scale deployment mariadb &#8211;replicas=2<\/p>\n<p>Consultez l&rsquo;\u00e9tat des pods de mariadb:<\/p>\n<p>$ kubectl get pods -1 app=mariadb &#8211;watch<\/p>\n<p>Ci-dessous les premi\u00e8res lignes renvoy\u00e9es par cette commande :<\/p>\n<pre>NAME\r\n\r\nmariadb-6c758c6984-4pnjw\r\n\r\nmariadb-6c758c6984-czsbw\r\n\r\nmariadb-6c758c6984-4pnjw\r\n\r\nmariadb-6c758c6984-4pnjw\r\n\r\nmariadb-6c758c6984-4pnjw\r\n\r\npas\r\n\r\nREADY\r\n\r\n0\/1\r\n\r\n1\/1\r\n\r\n0\/1\r\n\r\nSTATUS\r\n\r\nRunning\r\n\r\nRESTARTS AGE\r\n\r\nContainerCreating 0\r\n\r\n0\r\n\r\nAu bout de quelques secondes, la ligne suivante doit appara\u00eetre :\r\n\r\n0\/1 0\/1\r\n\r\nRunning\r\n\r\nRunning\r\n\r\nRunning\r\n\r\nLe nouveau pod n'arrive \u00e0 d\u00e9marrer.\r\n\r\n0\r\n\r\n1\r\n\r\n2\r\n\r\n1s\r\n\r\n3m\r\n\r\n4s\r\n\r\nAu bout d'environ 1 minute, les lignes suivantes doivent appara\u00eetre (une nou- velle toutes les minutes) :\r\n\r\n65s\r\n\r\n2m4s<\/pre>\n<p>Afin de comprendre ce qu&rsquo;il se passe, consultez l&rsquo;\u00e9tat du pod:<\/p>\n<p>$ kubectl describe pods mariadb-6c758c6984-4pnjw<\/p>\n<p>La section Events devrait contenir le message rencontr\u00e9 pr\u00e9c\u00e9demment :<\/p>\n<p>Readiness probe failed: mysqladmin: connect to server at &lsquo;localhost&rsquo; failed<\/p>\n<p>error: &lsquo;Can&rsquo;t connect to local MySQL server through socket &lsquo;\/var\/run\/mysqld\/mysqld.sock&rsquo; (2)&rsquo;<\/p>\n<p>Afin d&rsquo;affiner le diagnostic, consultez le journal du pod:<\/p>\n<p>$ kubectl logs mariadb-6c758c6984-4pnjw<\/p>\n<p>Ci-dessous un extrait des erreurs renvoy\u00e9es :<\/p>\n<p>[ERROR] InnoDB: Unable to lock .\/ibdatal error: 11<\/p>\n<p>. [Note] InnoDB: Check that you do not already have another mysqld<\/p>\n<p>process using the same InnoDB data&nbsp;or&nbsp;log&nbsp;files.<\/p>\n<h3>3.2 Pr\u00e9sentation du type StatefulSet<\/h3>\n<h4>3.2.1 Caract\u00e9ristiques<\/h4>\n<p>Le diagnostic est pos\u00e9 : le m\u00e9canisme de d\u00e9ploiement n&rsquo;est pas adapt\u00e9 pour g\u00e9rer un ensemble de pods de base de donn\u00e9es. Pour cela, Kubernetes offre un autre m\u00e9canisme : les objets de type StatefulSet.<\/p>\n<p>Un objet StatefulSet (ou son raccourci sts) dispose des caract\u00e9ristiques<\/p>\n<p>suivantes:<\/p>\n<p>&#8211; Pr\u00e9dictibilit\u00e9 du nom des pods.<\/p>\n<p>&#8211; Assignation du stockage persistant pod par pod.<\/p>\n<p>&#8211; Cr\u00e9ation des pods dans un ordre donn\u00e9.<\/p>\n<p>&#8211; Mise \u00e0 jour des pods dans un ordre donn\u00e9.<\/p>\n<p>Remarque<\/p>\n<p>Si l&rsquo;application \u00e0 d\u00e9ployer n&rsquo;a pas besoin de ces caract\u00e9ristiques, il est recom- mand\u00e9 de passer par un m\u00e9canisme de d\u00e9ploiement classique.<\/p>\n<h4>3.2.2 Limitations<\/h4>\n<p>Ce type n&rsquo;\u00e9tait pas disponible avant la version 1.5 de Kubernetes et est rest\u00e9 en version b\u00eata jusqu&rsquo;\u00e0 la version 1.9.<\/p>\n<p>Il est fortement recommand\u00e9 de disposer d&rsquo;un m\u00e9canisme de cr\u00e9ation auto- matique des volumes persistants. Dans le cas contraire, l&rsquo;administrateur devra r\u00e9aliser toutes les d\u00e9clarations d&rsquo;objet de type PersistentVolume manuellement.<\/p>\n<p>Derniers points, les volumes persistants cr\u00e9\u00e9s par le StatefulSet ne seront pas purg\u00e9s automatiquement lors de la r\u00e9duction du nombre de pods. Charge \u00e0 l&rsquo;administrateur de faire les purges&nbsp;n\u00e9cessaires.<\/p>\n<p>Encore une fois, le probl\u00e8me est tout \u00e0 fait normal puisqu&rsquo;une base de donn\u00e9es s&rsquo;attend \u00e0 avoir un acc\u00e8s exclusif \u00e0 ses fichiers.<\/p>\n<h3>3.3 D\u00e9claration du premier objet StatefulSet<\/h3>\n<h4>3.3.1 Purge de l&rsquo;ancien d\u00e9ploiement<\/h4>\n<p>Avant d&rsquo;aller plus loin, purgez l&rsquo;ancien d\u00e9ploiement de MariaDB:<\/p>\n<p>$ kubectl delete deployment mariadb<\/p>\n<p>La commande doit renvoyer le message suivant :<\/p>\n<p>deployment.apps \u00ab\u00a0mariadb\u00a0\u00bb deleted<\/p>\n<p>V\u00e9rifiez qu&rsquo;aucun pod portant le label app=mariadb ne reste :<\/p>\n<p>$ kubectl get pods -1 app=mariadb<\/p>\n<p>Relancez la commande jusqu&rsquo;\u00e0 obtenir le message suivant:<\/p>\n<p>No resources found in default namespace.<\/p>\n<h4>3.3.2 Modifications \u00e0 r\u00e9aliser<\/h4>\n<p>Reprenez le fichier mariadb-deployment.yaml et sauvegardez-le sous le nom de mariadb-statefulset.yaml.<\/p>\n<p>Afin de transformer la d\u00e9claration de d\u00e9ploiement en StatefulSet, vous devrez r\u00e9aliser plusieurs op\u00e9rations:<\/p>\n<p>&#8211; Changement du champ kind pour la valeur StatefulSet.<\/p>\n<p>&#8211; Ajout d&rsquo;un nom de service associ\u00e9 aux pods (champ serviceName \u00e0 la<\/p>\n<p>valeur mariadb).<\/p>\n<p>Ajout d&rsquo;un champ volumeClaimTemplates.<\/p>\n<p>Le champ volumeClaimTemplates sera un tableau d&rsquo;\u00e9l\u00e9ments. Chaque \u00e9l\u00e9ment reprendra les caract\u00e9ristiques d&rsquo;un volume persistant, \u00e0 savoir: &#8211; un champ metadata avec un champ name (\u00e0 la valeur mariadb-data),<\/p>\n<p>&#8211; un champ spec reprenant les caract\u00e9ristiques suivantes :<\/p>\n<p>&#8211; le mode d&rsquo;acc\u00e8s souhait\u00e9 (ReadWrite Once),<\/p>\n<p>&#8211; la taille&nbsp;du&nbsp;stockage.<\/p>\n<p>En reprenant ces informations, la d\u00e9claration devrait correspondre au contenu<\/p>\n<p>suivant:<\/p>\n<pre>apiVersion: apps\/v1\r\nkind: StatefulSet\r\nmetadata:\r\nname: mariadb\r\nspec:\r\nserviceName: \"mariadb\"\r\nreplicas: 1 # Ajustez selon vos besoins\r\nselector:\r\nmatchLabels:\r\napp: mariadb\r\ntemplate:\r\nmetadata:\r\nlabels:\r\napp: mariadb\r\nspec:\r\ncontainers:\r\n- name: mariadb\r\nimage: mariadb:latest # Remplacez par la version souhait\u00e9e\r\nports:\r\n- containerPort: 3306\r\nenv:\r\n- name: MYSQL_ROOT_PASSWORD\r\nvalue: \"my-secret-pw\" # Remplacez par le mot de passe souhait\u00e9\r\nvolumeMounts:\r\n- name: mariadb-storage\r\nmountPath: \/var\/lib\/mysql\r\nvolumeClaimTemplates:\r\n- metadata:\r\nname: mariadb-storage\r\nspec:\r\naccessModes: [ \"ReadWriteOnce\" ]\r\nresources:\r\nrequests:\r\nstorage: 1Gi # Ajustez la taille selon vos besoins<\/pre>\n<p><a href=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-7169\" src=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet.png\" alt=\"\" width=\"755\" height=\"726\" srcset=\"https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet.png 755w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet-300x288.png 300w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet-80x77.png 80w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet-36x36.png 36w, https:\/\/hengowebsite.luong.fr\/wp-content\/uploads\/2024\/09\/SafefulSet-705x678.png 705w\" sizes=\"(max-width: 755px) 100vw, 755px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<h4>3.3.3 Cr\u00e9ation du StatefulSet<\/h4>\n<p>Sauvegardez cette d\u00e9finition dans le fichier mariadb-statefulset.yaml et<\/p>\n<p>appliquez-la :<\/p>\n<p>$ kubectl apply -f&nbsp; Mariadb-statefulset.yaml<\/p>\n<p>$ kubectl get pods<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\nmariadb-0 1\/1 Running 1 5d23h\r\nmariadb-1 1\/1 Running 1 5d23h<\/pre>\n<h4>3.3.4 Etat des volumes persistents<\/h4>\n<p>$ kubectl get pvc<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\r\nmariadb-storage-mariadb-0 Bound pvc-96b25c57-42b9-4b86-9af3-e88532020e78 1Gi RWO standard 5d23h\r\nmariadb-storage-mariadb-1 Bound pvc-ecf0e6c1-4186-483e-a5ae-6ad942c5176a 1Gi RWO standard 5<\/pre>\n<p>$ kubectl get pv<\/p>\n<p>&nbsp;<\/p>\n<pre>NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE\r\nmariadb-pv 10Gi RWO Retain Available 6d2h\r\npvc-96b25c57-42b9-4b86-9af3-e88532020e78 1Gi RWO Delete Bound default\/mariadb-storage-mariadb-0 standard 5d23h\r\npvc-ecf0e6c1-4186-483e-a5ae-6ad942c5176a 1Gi RWO Delete Bound default\/mariadb-storage-mariadb-1 standard 5d23h<\/pre>\n<p>&nbsp;<\/p>\n<h4>3.3.5 Suppression des anciens objets PV\/PVC<\/h4>\n<p>L&rsquo;ancien volume persistent ne nous servira plus. Supprimez -le \u00e0 l&rsquo;aide de la commande suivants:<\/p>\n<p>$ kubectl delete pvc\/pvc-mariadb<\/p>\n<h3>3.4 Scalabilit\u00e9 de l&rsquo;objet StatefulSet<\/h3>\n<p>&nbsp;<\/p>\n<p>Tout comme pour un d\u00e9ploiement, Kubernetes peut augmenter le nombre de pods associ\u00e9s \u00e0 un objet StatefulSet.<\/p>\n<p>La commande kubectl a besoin pour cela des options suivantes :<\/p>\n<p>&#8211; Le type d&rsquo;objet (statefulset ou le raccourci sts).<\/p>\n<p>Le nom de l&rsquo;objet StatefulSet (mariadb).<\/p>\n<p>Le nombre de r\u00e9plicats \u00e0 obtenir (avec l&rsquo;option -replicas).<\/p>\n<p>Afin de d\u00e9marrer deux pods dans le ReplicaSet de MariaDB, lancez la com-<\/p>\n<p>$ kubectl scale sts mariadb &#8211;replicas=2<\/p>\n<p>Ci-dessous le r\u00e9sultat que devrait<\/p>\n<p>statefulset.apps\/mariadb&nbsp;scaled<\/p>\n<h3>3.5 Pods et volumes persistants d&rsquo;un objet StatefulSet<\/h3>\n<p>La consultation des demandes de volumes persistants se fait \u00e0 l&rsquo;aide de la com-<\/p>\n<p>mande suivante :<\/p>\n<p>$ kubectl get pvc -1 app=mariadb<\/p>\n<p>Pour la consultation des pods, la commande est la suivante :<\/p>\n<p>$ kubectl get pods -1 app=mariadb<\/p>\n<p>Le verbe get de la commande kubectl supporte la consultation de deux types d&rsquo;objets en m\u00eame temps.<\/p>\n<p>\u25baPour cela, s\u00e9parez les types par des virgules et conservez la s\u00e9lection \u00e0 l&rsquo;aide de labels.<\/p>\n<p>Pour consulter les pods et les PVC portant le label app-mariadb en m\u00eam temps, utilisez la commande suivante :<\/p>\n<p>$ kubectl get pods, pvc -1 app=mariadb<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\npod\/mariadb-0 1\/1 Running 1 6d\r\npod\/mariadb-1 1\/1 Running 1 5d23h\r\n\r\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\r\npersistentvolumeclaim\/mariadb-storage-mariadb-0 Bound pvc-96b25c57-42b9-4b86-9af3-e88532020e78 1Gi RWO standard 6d\r\npersistentvolumeclaim\/mariadb-storage-mariadb-1 Bound pvc-ecf0e6c1-4186-483e-a5ae-6ad942c5176a 1Gi RWO standard 5d23h\r\n\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Chaque objet sera pr\u00e9c\u00e9d\u00e9 par son type suivi d&rsquo;un slash (\/). Ici, chaque pod dispose de son propre volume&nbsp;persistant.<\/p>\n<p>&nbsp;<\/p>\n<h3>3.6 R\u00e9duction de la taille du StatefulSet<\/h3>\n<p>La diminution du nombre de pods d&rsquo;un objet StatefulSet se fait avec Toption scale de la commande kubect1. La seule chose \u00e0 changer sera la va- leur de l&rsquo;option &#8211;replicas.<\/p>\n<p>Pour passer de deux pods \u00e0 un seul sur le StatefulSet de MariaDB, lancez la commande suivante :<\/p>\n<p>$ kubectl scale sts mariadb &#8211;replicas=1<\/p>\n<pre>statefulset.apps\/mariadb scaled<\/pre>\n<p>&nbsp;<\/p>\n<p>Lancez la commande de consultation pr\u00e9c\u00e9dente afin de conna\u00eetre l&rsquo;\u00e9tat des pods et des demandes de volumes persistants.<\/p>\n<p>Ci-dessous l&rsquo;\u00e9tat renvoy\u00e9 par la commande :<\/p>\n<p>Le pod mariadb-1 a disparu. En revanche, la demande de volume persistant associ\u00e9e est toujours pr\u00e9sente.<\/p>\n<p>Ce comportement est int\u00e9ressant puisqu&rsquo;il permettra de conserver les donn\u00e9es d&rsquo;un pod faisant partie d&rsquo;un ensemble StatefulSet.<\/p>\n<p>Attention toutefois lors du d\u00e9marrage d&rsquo;un pod, il sera peut-\u00eatre n\u00e9cessaire de esynchroniser le contenu des bases avant de mettre \u00e0 disposition&nbsp;le&nbsp;pod.<\/p>\n<h3>4. Base et compte de test<\/h3>\n<h4>4.1 Variables d&rsquo;environnement du container<\/h4>\n<p>Pour la suite de l&rsquo;exercice, afin de tester la r\u00e9plication, une base et un compte<\/p>\n<p>de test vont \u00eatre cr\u00e9\u00e9s.<\/p>\n<p>L&rsquo;image Docker de MariaDB supporte ce type d&rsquo;op\u00e9rations. Pour les r\u00e9aliser. elle s&rsquo;appuie sur le contenu des variables suivantes :<\/p>\n<p>&#8211; MYSQL DATABASE: nom de la base de donn\u00e9es.<\/p>\n<p>&#8211; MYSQL_USER: nom de l&rsquo;utilisateur de base de donn\u00e9es.<\/p>\n<p>\u2013 MYSQL_PASSWORD : mot de passe de l&rsquo;utilisateur.<\/p>\n<p>Ces variables se d\u00e9clarent au niveau du champ env du container mariadb. Ci-dessous l&rsquo;extrait de configuration \u00e0 ajouter :<\/p>\n<p>env:<\/p>\n<p>&#8211; name: MYSQL_ROOT_PASSWORD<\/p>\n<p>value: mot-de-passe-root<\/p>\n<p>name: MYSQL_DATABASE<\/p>\n<p>value: test<\/p>\n<p>name: MYSQL_USER<\/p>\n<p>value: test<\/p>\n<p>name: MYSQL_PASSWORD<\/p>\n<p>value: test<\/p>\n<p>4.2 ConfigMap et secret<\/p>\n<p>4.2.1 Pourquoi y faire appel?<\/p>\n<p>Le nombre de variables est encore petit. Toutefois, il devient int\u00e9ressant de commencer \u00e0 stocker ces \u00e9l\u00e9ments dans des emplacements plus appropri\u00e9s :<\/p>\n<p>les ConfigMaps&nbsp;et&nbsp;les&nbsp;secrets.<\/p>\n<h3>241<\/h3>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Hebergement d&rsquo;application en cluster_<\/p>\n<p>Chapitre 7<\/p>\n<p>4.2.2 Structure d&rsquo;un objet ConfigMap<\/p>\n<p>Les objets ConfigMap (ou cm) sont des objets assez simples. Ci-dessous la<\/p>\n<p>structure minimum :<\/p>\n<p>&#8211; Le champ apiVersion et kind.<\/p>\n<p>l&rsquo;objet ConfigMap).<\/p>\n<p>MYSQL DATABASE: test<\/p>\n<p>MYSQL_USER:<\/p>\n<p>$ kubectl apply -f configmap.yaml<\/p>\n<p>La commande doit alors renvoyer le message suivant:<\/p>\n<p>configmap\/mariadb created<\/p>\n<p>4.2.3 D\u00e9claration d&rsquo;un objet Secret<\/p>\n<p>241<\/p>\n<p>&#8211; le champ metadata constitu\u00e9 du champ name (contenant le nom de<\/p>\n<p>&#8211; Le champ data avec les variables d&rsquo;environnement \u00e0 d\u00e9clarer.<\/p>\n<p>Pour l&rsquo;exercice, l&rsquo;objet ConfigMap portera le nom mariadb. Il stockera les informations suivantes :<\/p>\n<p>&#8211; Le nom de la base de donn\u00e9es (champ MYSQL_DATABASE).<\/p>\n<p>&#8211; Le nom de l&rsquo;utilisateur (champ MYSQL_USER).<\/p>\n<p>En reprenant ces diff\u00e9rentes indications, la d\u00e9claration devrait \u00eatre la<\/p>\n<p>suivante :<\/p>\n<p>apiVersion: vl<\/p>\n<p>kind: ConfigMap metadata:<\/p>\n<p>name: mariadb<\/p>\n<p>data:<\/p>\n<p>test<\/p>\n<p>Stockez cette d\u00e9claration dans le fichier configmap.yaml et appliquez-la :<\/p>\n<p>La structure d&rsquo;un objet Secret est la m\u00eame qu&rsquo;un objet ConfigMap. La seule diff\u00e9rence sera sur le contenu des variables du champ data: ces valeurs devront \u00eatre stock\u00e9es au&nbsp;format&nbsp;base&nbsp;64.<\/p>\n<h3>242<\/h3>\n<p>&nbsp;<\/p>\n<p>Kubernetes<\/p>\n<p>Plateforme de d\u00e9ploiement de vos applications conteneuris\u00e9es Pour obtenir les valeurs en base 64, vous pourrez faire appel \u00e0 la commande base64 sous Linux. Le passage de la valeur \u00e0 traiter se fait \u00e0 l&rsquo;aide d&rsquo;un pipe<\/p>\n<p>pr\u00e9c\u00e9d\u00e9 par la commande printf ou echo<\/p>\n<p>base 64.<\/p>\n<p>Remarque<\/p>\n<p>-n suivie du texte \u00e0 passer en<\/p>\n<p>Il est important de ne pas utiliser la commande echo seule. En effet, cette commande renvoie toujours un retour chariot ( ) en plus de la cha\u00eene de co- ract\u00e8res. Ce retour chariot est pris comme les autres caract\u00e8res de la cha\u00eene, ce qui peut parfois amener \u00e0 certains comportements inattendus.<\/p>\n<p>\u25a0 Pour transformer la cha\u00eene de caract\u00e8res \u00ab test \u00bb en base 64, lancez la com- mande suivante :<\/p>\n<p>$ echo -n test | base64<\/p>\n<p>Cette commande doit alors renvoyer le r\u00e9sultat suivant :<\/p>\n<p>dGVzdA==<\/p>\n<p>C&rsquo;est cette valeur qui sera utilis\u00e9e dans le champ MYSQL_PASSWORD. La valeur en base 64 de la cha\u00eene \u00ab mot-de-passe-root \u00bb sera la suivante :<\/p>\n<p>bW90LWRlLXBhc3N1LXJvb3Q=<\/p>\n<p>Cette valeur sera stock\u00e9e dans le champ MYSQL_ROOT_PASSWORD. En reprenant ces indications, vous obtiendrez le r\u00e9sultat suivant:<\/p>\n<p>apiVersion: vl<\/p>\n<p>kind: Secret<\/p>\n<p>metadata:<\/p>\n<p>name: mariadb<\/p>\n<p>data:<\/p>\n<p>MYSQL_ROOT_PASSWORD: \u00ab\u00a0bW90LWRlLXBhc3N1LXJvb3Q=\u00a0\u00bb<\/p>\n<p>MYSQL PASSWORD:<\/p>\n<p>Une technique alternative est de passer par le champ stringData. Lors qu&rsquo;une valeur s&rsquo;y trouve, Kubernetes se charge automatiquement<\/p>\n<p>\u00ab\u00a0dGVzdA==\u00a0\u00bb<\/p>\n<p>conversion dans le champ data.&nbsp;<\/p>\n<p>de&nbsp;faire&nbsp;la<\/p>\n<h3><strong>243<\/strong><\/h3>\n<p>&nbsp;<\/p>\n<p>H\u00e9bergement d&rsquo;application en cluster-<\/p>\n<p>Chapitre 7<\/p>\n<p>Ci-dessous la d\u00e9claration correspondante :<\/p>\n<p>apiVersion: vl<\/p>\n<p>kind: Secret metadata:<\/p>\n<p>name: mariadb<\/p>\n<p>stringData:<\/p>\n<p>MYSQL ROOT PASSWORD: \u00ab\u00a0mot-de-passe-root\u00a0\u00bb<\/p>\n<p>MYSQL_PASSWORD:<\/p>\n<p>\u00ab\u00a0test\u00a0\u00bb<\/p>\n<p>243<\/p>\n<p>\u25a0 Stockez cette d\u00e9claration dans le fichier secret.yaml et appliquez celui-ci :<\/p>\n<p>$ kubectl apply -f secret.yaml<\/p>\n<p>Cette commande doit alors<\/p>\n<p>secret\/mariadb created<\/p>\n<p>renvoyer le message suivant :<\/p>\n<p>.4 Rattachement au container<\/p>\n<p>Les deux objets sont pr\u00eats. Le r\u00e9f\u00e9rencement se fera depuis la structure du container \u00e0 l&rsquo;aide du champ envFrom. Ce champ est un tableau de structures. Ces structures sont des objets config MapRef ou secretRef. Les deux types de structures contiennent le champ name avec le nom de l&rsquo;objet \u00e0 r\u00e9f\u00e9-<\/p>\n<p>rencer.<\/p>\n<p>Pour r\u00e9f\u00e9rencer l&rsquo;objet ConfigMap mariadb et l&rsquo;objet Secret mariadb, la d\u00e9claration du champ envFrom prendra la forme suivante :<\/p>\n<p>envFrom:<\/p>\n<p>config MapRef: { name: mariadb }<\/p>\n<p>secretRef:<\/p>\n<p>{ name: mariadb }<\/p>\n<p>En reprenant l&rsquo;ancienne d\u00e9claration, la structure de l&rsquo;objet StatefulSet<\/p>\n<p>sera la suivante :<\/p>\n<p>apiVersion: apps\/v1<\/p>\n<p>kind: StatefulSet<\/p>\n<p>metadata:<\/p>\n<p>name: mariadb<\/p>\n<p>labels:<\/p>\n<p>app: mariadb<\/p>\n<p>spec:<\/p>\n<p>serviceName:&nbsp;mariadb<\/p>\n<h3>244.<\/h3>\n<p>Kubernetes<\/p>\n<p>Plateforme de d\u00e9ploiement de vos applications conteneuris\u00e9es<\/p>\n<p>selector:<\/p>\n<p>matchLabels:<\/p>\n<p>app: mariadb<\/p>\n<p>template:<\/p>\n<p>metadata:<\/p>\n<p>labels:<\/p>\n<p>app: mariadb<\/p>\n<p>spec:<\/p>\n<p>quez-le :<\/p>\n<p>containers:<\/p>\n<p>image: mariadb<\/p>\n<p>name: mariadb<\/p>\n<p>spec:<\/p>\n<p>volumeMounts:<\/p>\n<p>mount Path: \/var\/lib\/mysql<\/p>\n<p>name:<\/p>\n<p>envFrom:<\/p>\n<p>mariadb-data<\/p>\n<p>configMapRef: { name: mariadb }<\/p>\n<p>secretRef:<\/p>\n<p>exec:<\/p>\n<p>command:<\/p>\n<p>\u00ab\u00a0sh\u00a0\u00bb<\/p>\n<p>\u00ab\u00a0-C\u00a0\u00bb<\/p>\n<p>resources:<\/p>\n<p>requests:<\/p>\n<p>storage: 100Mi<\/p>\n<p>{ name: mariadb }<\/p>\n<p>startup Probe: &amp;probe<\/p>\n<p>\u00ab\u00a0mysqladmin status -p$MYSQL_ROOT_PASSWORD\u00a0\u00bb<\/p>\n<p>liveness Probe: *probe<\/p>\n<p>readiness Probe: *probe<\/p>\n<p>volumeClaimTemplates:<\/p>\n<p>metadata:<\/p>\n<p>name: mariadb-data<\/p>\n<p>accessModes: [ \u00ab\u00a0ReadWrite Once\u00a0\u00bb ]<\/p>\n<p>Sauvegardez ce contenu dans le fichier mariadb-statefulset.yaml et appli<\/p>\n<p>$ kubectl apply -f mariadb-statefulset.yaml<\/p>\n<p>Ci-dessous le message renvoy\u00e9 :<\/p>\n<p>statefulset, apps\/mariadb configured<\/p>\n<p>La base est maintenant configur\u00e9e automatiquement \u00e0 l&rsquo;aide de ces \u00e9l\u00e9ments de configuration externes. Ce d\u00e9coupage simplifiera les modifications ult\u00e9rieures sur les variables d&rsquo;environnement.<\/p>\n<p>&nbsp;<\/p>\n<h1 style=\"text-align: right;\">Chapitre 9<\/h1>\n<h1 style=\"text-align: right;\">Gestion du chapitre et pr\u00e9requis<\/h1>\n<h1 style=\"text-align: right;\">de Kubernetes<\/h1>\n<h2>1. Objectifs du chapitre et du pr\u00e9requis<\/h2>\n<p>Les chapitres pr\u00e9c\u00e9dents ont abord\u00e9 les diff\u00e9rents types d&rsquo;objets initiales dans kubernetes de d\u00e9ploiement au volume persistent.<\/p>\n<p>Ce chapitre sera consacr\u00e9 \u00e0 l&rsquo;\u00e9tude des \u00e9l\u00e9ments syst\u00e8me d&rsquo;un cluster Kubernetes parmi lesquels l&rsquo;espace de noms kube-system.<\/p>\n<h2>2. Espace des noms kube-system<\/h2>\n<h3>2.1 Pods pr\u00e9sents dans l&rsquo;espace de noms kube-system<\/h3>\n<p>Le classement des \u00e9l\u00e9ments dans Kubernetes se fait \u00e0 l&rsquo;aide des espaces des noms (namespace). Dans le cas des \u00e9l\u00e9ments syst\u00e8mes du cluster, ces derniers sont h\u00e9berg\u00e9s dans l&rsquo;espace des noms kube-system.<\/p>\n<blockquote><p>&gt; R\u00e9cup\u00e9ration des pods de l&rsquo;espace de noms kube-system:<\/p><\/blockquote>\n<p>$ kubectl -n kube-system get pods<\/p>\n<pre>NAME READY STATUS RESTARTS AGE\r\ncoredns-6d4b75cb6d-cp7st 1\/1 Running 16 59d\r\netcd-minikube 1\/1 Running 333 59d\r\nkindnet-gfc94 1\/1 Running 174 59d\r\nkube-apiserver-minikube 1\/1 Running 329 59d\r\nkube-controller-manager-minikube 1\/1 Running 328 (3m37s ago) 59d\r\nkube-proxy-248nb 1\/1 Running 8 59d\r\nkube-scheduler-minikube 1\/1 Running 322 59d\r\nmetrics-server-8cf8b7f65-9b5v2 1\/1 Running 444 58d\r\nstorage-provisioner 1\/1 Running 1628 (2m1s ago) 59d<\/pre>\n<p>Cette sortie regroupe des \u00e9l\u00e9ments du cluster. Ony trouve :<\/p>\n<ul>\n<li>Un gestionnaire des noms NOMS interne (coredns)<\/li>\n<li>un serveur etcd<\/li>\n<li>le pilote de r\u00e9seau kindnet,<\/li>\n<li>le serveur d&rsquo;API,<\/li>\n<li>le controler manager,<\/li>\n<li>le proxy de l&rsquo;API Kubernetes,<\/li>\n<li>le gestionnaire des t\u00e2ches\/orchestrateur de Kubernetes.<\/li>\n<li>le gestionnaire de m\u00e9triques de suivi de consomation des \u00e9l\u00e9ments du cluster (metrics server, optionnel),<\/li>\n<li>le gestionnaire de persistance des donn\u00e9es (optionnel).<\/li>\n<\/ul>\n<h3>2.2 CoreDNS<\/h3>\n<p>CoreDNS est un serveur interne de Kubernetes. Il permet de g\u00e9rer les r\u00e9solutions de nom des services d\u00e9finies dans le cluster.<\/p>\n<p>A noter que, par d\u00e9faut, il remplace Kube-dns depuis la version 1.11. Certains clusters plus r\u00e9cents peuvent toujours y faire appel. Toutefois, cette diff\u00e9rence ne devrait pas \u00eatre perceptible pour la plupart des utilisateurs.<\/p>\n<p>2.3 etcd<\/p>\n<p>etcd est une autre brique importante. Il s&rsquo;agit d&rsquo;une base de donn\u00e9es de type NoSQL. Elle permet le stokage des donn\u00e9es au format cl\u00e9\/valeur. C&rsquo;est elle qui va servir \u00e0 la persistence des \u00e9l\u00e9ments dans le cluster Kubernetes.<\/p>\n<p>Dans Kubernetes, cet \u00e9l\u00e9ment peut \u00eatre h\u00e9berg\u00e9 comme un pod ou un service externe. Cette diff\u00e9rence se fait en fonction du mode d&rsquo;installation du cluster.<\/p>\n<p>Dans le cas de Minikube, le serveur tourne comme un pod.<\/p>\n<blockquote><p>&gt; Remarque<\/p><\/blockquote>\n<p>A noter que les clusters cr\u00e9\u00e9s avec k3s font apple \u00e0 SQLite pour stocker les informations du cluster.<\/p>\n<p>2.4 Le gestionnaire de r\u00e9seau Kindnet.<\/p>\n<p>Ce composant g\u00e8re la communication r\u00e9seau entre les pods dans Minikube. (pilote CNI pour Container Network Interface). Il s&rsquo;agit d&rsquo;un composant d\u00e9velopp\u00e9 initialement pour le projet Kind (Kubernetes in Docker).<\/p>\n<p>2.5 Le gestionnaire d&rsquo;extensions de Minikube<\/p>\n<p>Ce pod n&rsquo;est pr\u00e9sent que dans le cas de Minikube. Ce dernern<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avant-propos Qu&rsquo;est-ce qu&rsquo;un container? Au Niveau du syst\u00e8me d&rsquo;exploitation, un container va regrouper un groupe de ressources mis \u00e0 disposition d&rsquo;un ensemble de process. un syst\u00e8me de fichiers, des allocations de ressources syst\u00e8me (CPU, m\u00e9moire , capacit\u00e9 d&rsquo;entr\u00e9e\/sortie) un espace d&rsquo;isolation de process une ou plusieurs interfaces r\u00e9seau etc &#8230; Pourquoi utiliser des containers Pour [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ngg_post_thumbnail":0},"_links":{"self":[{"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/pages\/7001"}],"collection":[{"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7001"}],"version-history":[{"count":91,"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/pages\/7001\/revisions"}],"predecessor-version":[{"id":7218,"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=\/wp\/v2\/pages\/7001\/revisions\/7218"}],"wp:attachment":[{"href":"https:\/\/hengowebsite.luong.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7001"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}