<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Le blog d'alter way</title><link href="https://blogppr.alterway.fr/" rel="alternate"></link><link href="https://blogppr.alterway.fr/feeds/all.atom.xml" rel="self"></link><id>https://blogppr.alterway.fr/</id><updated>2025-07-17T10:00:00+02:00</updated><entry><title>Améliorer la Developer Experience avec Backstage : le pari réussi de Safran et AWS</title><link href="https://blogppr.alterway.fr/ameliorer-la-developer-experience-avec-backstage-le-pari-reussi-de-safran-et-aws.html" rel="alternate"></link><published>2025-07-17T10:00:00+02:00</published><updated>2025-07-17T10:00:00+02:00</updated><author><name>Asmaa Maakel</name></author><id>tag:blogppr.alterway.fr,2025-07-17:/ameliorer-la-developer-experience-avec-backstage-le-pari-reussi-de-safran-et-aws.html</id><summary type="html">&lt;p&gt;Retour d’expérience d'AWS et Safran sur la Developer Experience avec Backstage à l'AWS Summit 2025&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Améliorer la Developer Experience avec Backstage : le pari réussi de Safran et AWS&lt;/h1&gt;
&lt;p&gt;Créer une &lt;strong&gt;plateforme de développement interne&lt;/strong&gt; capable de &lt;strong&gt;booster la productivité&lt;/strong&gt;, &lt;strong&gt;simplifier l'onboarding&lt;/strong&gt; et &lt;strong&gt;unifier l'accès aux outils techniques&lt;/strong&gt; est devenu un enjeu stratégique. Lors de l’AWS Summit, &lt;strong&gt;Safran&lt;/strong&gt; et &lt;strong&gt;AWS&lt;/strong&gt; ont partagé une mise en œuvre concrète autour de &lt;strong&gt;Backstage&lt;/strong&gt;, la solution open source développée par &lt;strong&gt;Spotify&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Pourquoi miser sur le Platform Engineering ?&lt;/h2&gt;
&lt;p&gt;Dans les organisations tech modernes, les développeurs sont confrontés à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des &lt;strong&gt;stacks techniques&lt;/strong&gt; de plus en plus complexes&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;multitude d’outils&lt;/strong&gt; CI/CD, cloud, sécurité, monitoring, etc.&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;courbe d’apprentissage&lt;/strong&gt; souvent décourageante pour les nouveaux arrivants&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le &lt;strong&gt;Platform Engineering&lt;/strong&gt; vise à répondre à ces problématiques en créant une &lt;strong&gt;plateforme interne&lt;/strong&gt; (&lt;em&gt;IDP – Internal Developer Platform&lt;/em&gt;) centralisée, cohérente, et automatisée.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Objectif&lt;/strong&gt; : offrir aux développeurs plus d'&lt;strong&gt;autonomie&lt;/strong&gt;, tout en gardant un &lt;strong&gt;cadre sécurisé&lt;/strong&gt;, &lt;strong&gt;standardisé&lt;/strong&gt; et &lt;strong&gt;gouverné&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une bonne IDP réduit les &lt;strong&gt;frictions&lt;/strong&gt;, &lt;strong&gt;accélère les mises en production&lt;/strong&gt;, et favorise la &lt;strong&gt;satisfaction des équipes tech&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Backstage, la fondation open source signée Spotify&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Backstage&lt;/strong&gt; est un &lt;strong&gt;portail de développement interne&lt;/strong&gt;, extensible et modulaire. Il permet aux entreprises de créer une &lt;strong&gt;interface unifiée&lt;/strong&gt; pour gérer leurs composants logiciels.&lt;/p&gt;
&lt;h3&gt;Ce que Backstage apporte :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Software Catalog&lt;/strong&gt; : visibilité sur tous les services, APIs, composants, microservices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaffolder&lt;/strong&gt; : génération de projets via des &lt;strong&gt;templates prédéfinis&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TechDocs&lt;/strong&gt; : &lt;strong&gt;documentation générée&lt;/strong&gt; à partir du code (Markdown + CI)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins&lt;/strong&gt; : intégrations avec Jenkins, GitLab, ArgoCD, Prometheus, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backstage agit comme un &lt;strong&gt;tableau de bord complet&lt;/strong&gt; pour les développeurs, où tout est à portée de clic.&lt;/p&gt;
&lt;h2&gt;Harmonix : l'accélérateur AWS&lt;/h2&gt;
&lt;p&gt;Pour déployer Backstage rapidement et de manière sécurisée sur AWS, les équipes ont créé &lt;strong&gt;Harmonix&lt;/strong&gt;, une &lt;strong&gt;surcouche d’intégration cloud-native&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Harmonix inclut :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Infrastructure as Code&lt;/strong&gt; avec &lt;strong&gt;AWS CDK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentification intégrée&lt;/strong&gt;, &lt;strong&gt;RBAC&lt;/strong&gt;, et &lt;strong&gt;logs d’audit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugins AWS&lt;/strong&gt; (CodePipeline, ECS, IAM, CloudWatch)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiement préconfiguré&lt;/strong&gt;, prêt à l'emploi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;En résumé&lt;/strong&gt; : Harmonix fournit une &lt;strong&gt;base solide&lt;/strong&gt; pour implémenter Backstage à grande échelle, sans repartir de zéro.&lt;/p&gt;
&lt;h2&gt;Le retour d’expérience de Safran&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Safran&lt;/strong&gt;, acteur majeur de l’aéronautique, devait répondre à une problématique courante dans les grandes organisations : &lt;strong&gt;comment standardiser le delivery logiciel&lt;/strong&gt; sur plusieurs entités tout en laissant de l'&lt;strong&gt;autonomie&lt;/strong&gt; aux équipes locales.&lt;/p&gt;
&lt;p&gt;Ils ont déployé &lt;strong&gt;Backstage&lt;/strong&gt;, enrichi d’&lt;strong&gt;Harmonix&lt;/strong&gt;, avec des résultats concrets.&lt;/p&gt;
&lt;p&gt;L’objectif était de &lt;strong&gt;centraliser la création de services&lt;/strong&gt;, &lt;strong&gt;réduire la dépendance&lt;/strong&gt; aux équipes plateforme, &lt;strong&gt;uniformiser les pratiques DevOps&lt;/strong&gt;, et &lt;strong&gt;accélérer l’onboarding&lt;/strong&gt; des nouveaux développeurs.&lt;/p&gt;
&lt;p&gt;Cela s’est concrétisé par la &lt;strong&gt;création de templates standardisés&lt;/strong&gt; pour les microservices, l’&lt;strong&gt;intégration fluide avec les outils existants&lt;/strong&gt; (GitLab, Jenkins, SonarQube), un &lt;strong&gt;accès direct aux pipelines, logs et documentation&lt;/strong&gt;, ainsi qu’un &lt;strong&gt;catalogue de composants&lt;/strong&gt; pour mieux visualiser l’état de l’écosystème interne.&lt;/p&gt;
&lt;h3&gt;Résultats observés :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Un &lt;strong&gt;onboarding réduit de plusieurs jours à quelques heures&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;chute significative des tickets&lt;/strong&gt; vers l’équipe plateforme&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;visibilité complète&lt;/strong&gt; sur les services en place&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;adoption rapide&lt;/strong&gt; dans plusieurs unités du groupe&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Une plateforme pensée pour l’autonomie&lt;/h2&gt;
&lt;p&gt;Lors de la démonstration live, les intervenants ont illustré un cas d’usage typique :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Création d’un service via un &lt;strong&gt;template&lt;/strong&gt; dans Backstage  &lt;/li&gt;
&lt;li&gt;Génération automatique de la &lt;strong&gt;CI/CD&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;Documentation créée et &lt;strong&gt;accessible immédiatement&lt;/strong&gt;  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring intégré&lt;/strong&gt; via Prometheus et Grafana&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ce &lt;strong&gt;workflow fluide&lt;/strong&gt; permet à un développeur de &lt;strong&gt;livrer un service complet en toute autonomie&lt;/strong&gt;, dans un environnement &lt;strong&gt;sécurisé et standardisé&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Les défis rencontrés&lt;/h2&gt;
&lt;p&gt;Même si la mise en œuvre a été un succès, elle n’a pas été exempte de &lt;strong&gt;défis&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une certaine &lt;strong&gt;résistance au changement&lt;/strong&gt; de la part des équipes&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;dette technique&lt;/strong&gt; rendant certains projets difficilement standardisables&lt;/li&gt;
&lt;li&gt;La nécessité de &lt;strong&gt;développer des connecteurs spécifiques&lt;/strong&gt; pour certains outils internes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ces obstacles ont été levés grâce à une &lt;strong&gt;approche progressive&lt;/strong&gt;, une &lt;strong&gt;gouvernance claire&lt;/strong&gt;, et un &lt;strong&gt;soutien fort du management&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Ce qui attend Safran et AWS&lt;/h2&gt;
&lt;p&gt;Safran prévoit désormais de &lt;strong&gt;généraliser l’utilisation de Backstage&lt;/strong&gt; à tout le groupe, en y ajoutant des modules de &lt;strong&gt;test automatisé&lt;/strong&gt;, de &lt;strong&gt;sécurité&lt;/strong&gt;, et en construisant des &lt;strong&gt;plugins internes&lt;/strong&gt; pour répondre à des besoins métiers spécifiques.&lt;/p&gt;
&lt;p&gt;AWS, de son côté, continue d’améliorer Harmonix pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supporter des déploiements hybrides&lt;/strong&gt; (on-prem + cloud)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Renforcer la sécurité&lt;/strong&gt; et l’&lt;strong&gt;observabilité&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Améliorer l'expérience développeur&lt;/strong&gt; grâce à de nouveaux plugins&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion : de l’expérience développeur à l’impact business&lt;/h2&gt;
&lt;p&gt;Ce retour d’expérience montre à quel point &lt;strong&gt;l’expérience développeur est devenue un facteur de performance&lt;/strong&gt; pour les organisations tech. &lt;strong&gt;Backstage&lt;/strong&gt;, avec &lt;strong&gt;Harmonix&lt;/strong&gt;, permet de structurer un environnement de développement &lt;strong&gt;moderne&lt;/strong&gt;, &lt;strong&gt;accessible&lt;/strong&gt;, &lt;strong&gt;cohérent&lt;/strong&gt; et &lt;strong&gt;sécurisé&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En investissant dans une &lt;strong&gt;IDP bien conçue&lt;/strong&gt;, les entreprises peuvent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accélérer leur cycle de livraison&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standardiser les bonnes pratiques&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mieux gérer leur patrimoine logiciel&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attirer et fidéliser les talents tech&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L’avenir du DevOps passe par des &lt;strong&gt;plateformes pensées pour les développeurs&lt;/strong&gt;. &lt;strong&gt;Backstage est l’outil qui leur donne enfin les moyens d’agir.&lt;/strong&gt;&lt;/p&gt;</content><category term="Amazon Web Services"></category></entry><entry><title>Industrialiser le RAG pour booster l’IA générative : l’approche pragmatique en 2025</title><link href="https://blogppr.alterway.fr/industrialiser-le-rag-pour-booster-lia-generative-lapproche-pragmatique-en-2025.html" rel="alternate"></link><published>2025-07-01T18:00:00+02:00</published><updated>2025-07-01T18:00:00+02:00</updated><author><name>Asmaa Maakel</name></author><id>tag:blogppr.alterway.fr,2025-07-01:/industrialiser-le-rag-pour-booster-lia-generative-lapproche-pragmatique-en-2025.html</id><summary type="html">&lt;p&gt;Retour d’expérience de BUreau Veritas et focus sur le RAG à l'AWS Summit 2025&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Industrialiser le RAG pour booster l’IA générative : l’approche pragmatique en 2025&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Explorée en profondeur lors du AWS Summit Paris 2025, cette approche basée sur le RAG (Retrieval-Augmented Generation) s’impose comme une réponse concrète aux limites actuelles de l’IA générative en entreprise.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Un constat alarmant, une promesse ambitieuse&lt;/h2&gt;
&lt;p&gt;Le constat est clair : selon Gartner, 60 % des projets d’intelligence artificielle échouent, essentiellement par manque de données appropriées. Pour inverser cette tendance, de plus en plus d’organisations misent sur une architecture de RAG — Retrieval-Augmented Generation — industrialisée et sécurisée.&lt;/p&gt;
&lt;p&gt;À l’ère de l’IA générative, plusieurs enjeux freinent les entreprises : comment s’assurer de la fiabilité des réponses ? Quel modèle choisir ? Comment rester conforme aux exigences de sécurité et de confidentialité ? Quel budget prévoir ? Le RAG, dans ce contexte, s’impose comme un compromis stratégique.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;RAG : le bon compromis pour une IA efficace&lt;/h2&gt;
&lt;p&gt;Il existe plusieurs manières de personnaliser un modèle de langage. Le prompt engineering est rapide, mais souvent limité. À l’autre extrême, le fine-tuning est puissant mais complexe, long et coûteux.&lt;/p&gt;
&lt;p&gt;Le RAG repose sur un principe simple : plutôt que de modifier le modèle, on lui fournit le bon contexte au moment de la requête, en allant chercher l’information dans une base documentaire interne. Pas besoin de réentraînement. Pas besoin de déplacer les données sensibles. Et surtout, des résultats pertinents dès la première itération.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Comment fonctionne un système RAG&lt;/h2&gt;
&lt;p&gt;Tout commence par la collecte des contenus internes : documents, bases de connaissances, FAQs, pages intranet, etc. Ces fichiers sont nettoyés, découpés et transformés en vecteurs numériques grâce à un modèle d’embedding. Ces vecteurs sont ensuite stockés dans une base dédiée, comme OpenSearch ou Pinecone.&lt;/p&gt;
&lt;p&gt;Quand un utilisateur pose une question, le système recherche les passages les plus proches sémantiquement dans cette base. Ces extraits sont alors transmis comme contexte au LLM, qui génère une réponse plus précise, ancrée dans la documentation de l’entreprise.&lt;/p&gt;
&lt;p&gt;Ce mécanisme garantit fraîcheur, pertinence et traçabilité des réponses. Il devient aussi possible d’adapter finement les résultats selon les métiers, les droits d’accès ou la langue.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Réduire les hallucinations, sécuriser les échanges, limiter les coûts&lt;/h2&gt;
&lt;p&gt;Les hallucinations sont souvent dues à un manque de contexte. En apportant les bons documents au moment de la requête, le RAG réduit fortement ce risque. Chaque réponse peut être justifiée, sourcée, et auditée si besoin.&lt;/p&gt;
&lt;p&gt;Sur le plan de la sécurité, les données ne quittent jamais leur périmètre. Grâce à des services comme Bedrock ou SageMaker, tout reste cloisonné dans l’environnement AWS, sans exposition externe ni transfert inutile. Le respect du RGPD est ainsi facilité.&lt;/p&gt;
&lt;p&gt;Côté budget, l’absence de fine-tuning fait une grande différence. Le coût de calcul est optimisé, et le système peut évoluer progressivement sans repasser par des phases d’entraînement lourdes à chaque changement.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Une architecture modulaire et réutilisable&lt;/h2&gt;
&lt;p&gt;L’implémentation repose sur des composants bien connus et robustes. S3 permet de stocker les documents bruts. Lambda gère les traitements automatisés. OpenSearch ou Kendra assurent l’indexation et la recherche. Bedrock ou SageMaker génèrent les réponses. Enfin, Cognito et API Gateway sécurisent les accès selon les rôles.&lt;/p&gt;
&lt;p&gt;Cette architecture est modulaire. Elle peut être adaptée à différents secteurs, tailles d’entreprise ou contraintes réglementaires, sans compromis sur la performance ni la sécurité.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Exemple concret : un assistant IA métier chez Bureau Veritas&lt;/h2&gt;
&lt;p&gt;Chez Bureau Veritas, un assistant interne basé sur le RAG a été développé pour répondre aux questions techniques des collaborateurs. Avec plus de 90 000 documents à disposition, les experts étaient sursollicités. Il fallait automatiser sans perdre la qualité des réponses.&lt;/p&gt;
&lt;p&gt;Le chatbot &lt;em&gt;Jules&lt;/em&gt; a permis de répondre à cette problématique. En s’appuyant sur les briques AWS, il traite des requêtes complexes, en toute autonomie. Plus de 3 000 collaborateurs l’utilisent régulièrement, avec un taux de satisfaction supérieur à 80 %. Le temps de réponse moyen a été divisé par 10.&lt;/p&gt;
&lt;p&gt;Ce type d’outil montre qu’une IA bien connectée à la donnée peut vraiment transformer l’expérience utilisateur interne.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mettre à l’échelle en gardant le contrôle&lt;/h2&gt;
&lt;p&gt;Dès que l’IA commence à être utilisée au quotidien, il devient essentiel de suivre sa performance. Quelques indicateurs clés sont à surveiller : la pertinence des documents retrouvés, la qualité perçue des réponses, les temps de latence, ou encore les retours utilisateurs.&lt;/p&gt;
&lt;p&gt;Mais il ne suffit pas de mesurer. Il faut aussi encadrer. La gestion des droits d’accès, la traçabilité des interactions, les mécanismes d’alerte en cas de comportement anormal font partie intégrante d’un RAG sérieux et responsable.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Évaluer et améliorer en continu&lt;/h2&gt;
&lt;p&gt;Un bon système RAG n’est jamais figé. Il évolue avec les usages et les données. Plusieurs leviers permettent de l’optimiser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;des mesures automatiques (BLEU, ROUGE, F1),&lt;/li&gt;
&lt;li&gt;des retours utilisateurs intégrés dans la boucle,&lt;/li&gt;
&lt;li&gt;des tests A/B pour comparer différents modèles ou prompts,&lt;/li&gt;
&lt;li&gt;et surtout, un enrichissement continu de la base documentaire.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est crucial : plus les documents sont clairs, bien découpés et structurés, meilleure sera la qualité des réponses générées.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Passer du test à la production&lt;/h2&gt;
&lt;p&gt;Il est tentant de rester sur une preuve de concept. Mais les outils sont là, les retours d’expérience sont solides, et les gains sont réels. Le passage en production n’a jamais été aussi accessible.&lt;/p&gt;
&lt;p&gt;Le RAG offre un compromis unique entre rapidité de mise en œuvre, sécurité, précision et maîtrise des coûts. Il permet d’activer les gisements de connaissances internes avec une IA réellement utile.&lt;/p&gt;
&lt;p&gt;Les données internes sont souvent le levier le plus sous-estimé des entreprises. Avec le bon outillage, elles deviennent un avantage concurrentiel tangible.&lt;/p&gt;</content><category term="Amazon Web Services"></category></entry><entry><title>VMWare --&gt; Open Source</title><link href="https://blogppr.alterway.fr/vmware-open-source.html" rel="alternate"></link><published>2025-05-22T10:00:00+02:00</published><updated>2025-05-22T10:00:00+02:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-05-22:/vmware-open-source.html</id><summary type="html">&lt;p&gt;Migration de VMware vers les Solutions Open Source de Virtualisation et de Conteneurisation&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Migration de VMware vers les Solutions Open Source de Virtualisation et de Conteneurisation&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;1. Introduction et Contexte&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le paysage de l'infrastructure informatique d'entreprise connaît une période de transformation accélérée, largement catalysée par des changements significatifs dans l'écosystème des solutions de virtualisation dominantes. Pendant des années, VMware s'est imposé comme le leader incontesté, définissant les standards de la virtualisation de serveurs. Cependant, une confluence de facteurs récents pousse un nombre croissant d'organisations à réévaluer leur dépendance à VMware et à explorer activement des alternatives, notamment celles issues du monde open source. Ce rapport vise à analyser en profondeur les enjeux, les stratégies et les implications d'une telle migration, qu'elle s'oriente vers des solutions de virtualisation open source traditionnelles ou vers des plateformes de conteneurisation modernes basées sur Kubernetes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.1. Le Point de Bascule : Pourquoi Quitter VMware?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs facteurs convergents expliquent l'intérêt grandissant pour des alternatives à VMware, mais l'acquisition de l'entreprise par Broadcom fin 2023 a agi comme un catalyseur majeur, voire un véritable point de bascule pour de nombreuses organisations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact de l'Acquisition par Broadcom&lt;/strong&gt; : Les changements stratégiques et tarifaires imposés par Broadcom constituent la raison la plus fréquemment citée pour envisager une migration.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hausse Drastique des Coûts&lt;/strong&gt; : Des augmentations de prix spectaculaires ont été rapportées par de grands comptes et des partenaires. Par exemple, AT&amp;amp;T aurait fait face à une proposition d'augmentation de 1050% &lt;sup&gt;1&lt;/sup&gt;, tandis que Veeam signalait une hausse de 300% sur les produits VMware utilisés.&lt;sup&gt;2&lt;/sup&gt; D'autres clients ont constaté des augmentations allant de 140% à 600%.&lt;sup&gt;2&lt;/sup&gt; Pour un serveur typique, l'impact peut représenter plus qu'un triplement des coûts sur trois ans.&lt;sup&gt;3&lt;/sup&gt; Ces hausses rendent la poursuite de l'utilisation de VMware économiquement difficile, voire insoutenable, pour de nombreuses entreprises, en particulier les PME et certaines entités commerciales.&lt;sup&gt;2&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refonte du Modèle de Licences&lt;/strong&gt; : Broadcom a mis fin aux licences perpétuelles et à leurs renouvellements de support, imposant une transition vers un modèle d'abonnement basé sur le nombre de cœurs physiques.&lt;sup&gt;1&lt;/sup&gt; Cette transition est obligatoire pour conserver le support et les mises à jour une fois les contrats existants expirés.&lt;sup&gt;2&lt;/sup&gt; De plus, le minimum de cœurs requis par licence a été augmenté significativement (passant de 16 à 72 cœurs dans certains cas &lt;sup&gt;1&lt;/sup&gt;), et l'édition gratuite populaire vSphere Hypervisor (ESXi) a été supprimée.&lt;sup&gt;5&lt;/sup&gt; Ce changement structurel affecte la prévisibilité budgétaire et augmente le coût global, même pour des infrastructures stables, forçant les entreprises à payer pour des capacités qu'elles n'utilisent pas forcément.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incertitude Stratégique&lt;/strong&gt; : Au-delà des coûts, l'acquisition a semé le doute quant à l'avenir de l'innovation au sein de la gamme VMware.&lt;sup&gt;1&lt;/sup&gt; Certains craignent un appauvrissement technologique &lt;sup&gt;6&lt;/sup&gt; et une potentielle dilution du focus sur VMware au sein du vaste portefeuille de Broadcom, qui pourrait voir la plateforme davantage comme une "vache à lait" que comme un axe d'investissement stratégique.&lt;sup&gt;4&lt;/sup&gt; Cette incertitude pèse sur la confiance des clients et leur volonté d'investir à long terme dans la plateforme.&lt;sup&gt;4&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'ampleur de ces changements post-acquisition agit comme un choc externe puissant. Il ne s'agit plus simplement d'optimiser les coûts existants, mais d'une remise en question fondamentale d'un choix d'infrastructure souvent profondément ancré. Cette situation contraint les DSI et les architectes à envisager des alternatives potentiellement transformatrices, allant au-delà d'un simple remplacement fonctionnel.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Verrouillage Fournisseur (Vendor Lock-in)&lt;/strong&gt; : La dépendance historique à l'écosystème VMware est une préoccupation de longue date pour de nombreuses entreprises.&lt;sup&gt;7&lt;/sup&gt; Bien que riche, cet écosystème peut limiter la flexibilité, compliquer l'intégration avec des solutions tierces ou des environnements multi-cloud, et rendre les migrations coûteuses et complexes.&lt;sup&gt;1&lt;/sup&gt; L'acquisition par Broadcom a ravivé ces craintes et renforcé le désir d'indépendance technologique.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coût Total de Possession (TCO) Antérieur&lt;/strong&gt; : Même avant les bouleversements liés à Broadcom, le TCO des solutions VMware, incluant licences, support et matériel certifié, était un facteur de coût important pour les entreprises.&lt;sup&gt;9&lt;/sup&gt; Les récents changements n'ont fait qu'exacerber cette réalité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recherche de Flexibilité et d'Agilité&lt;/strong&gt; : Parallèlement aux pressions exercées par VMware, les entreprises cherchent de plus en plus à adopter des architectures informatiques plus modernes, flexibles et agiles, souvent associées aux paradigmes du cloud (public ou privé) et aux technologies open source.&lt;sup&gt;1&lt;/sup&gt; La rigidité perçue de l'écosystème VMware peut freiner cette évolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.2. L'Appel de l'Open Source : Une Opportunité Stratégique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Face à ce contexte, les solutions open source émergent non seulement comme des alternatives viables, mais aussi comme des opportunités stratégiques pour repenser et moderniser l'infrastructure IT.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Au-delà de l'Alternative Économique&lt;/strong&gt; : Si la réduction des coûts est un attrait majeur &lt;sup&gt;1&lt;/sup&gt;, l'open source représente bien plus qu'une simple réponse budgétaire. C'est une voie vers la modernisation de l'infrastructure, l'amélioration de l'agilité opérationnelle, l'accélération de l'innovation et une optimisation plus fine des ressources.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Indépendance Technologique et Souveraineté&lt;/strong&gt; : L'adoption de l'open source permet aux entreprises de regagner le contrôle sur leur pile technologique, d'éviter le verrouillage fournisseur et de choisir librement les composants les mieux adaptés à leurs besoins spécifiques.&lt;sup&gt;1&lt;/sup&gt; Cette indépendance est cruciale dans un environnement technologique en constante évolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adaptation au Cloud-Native&lt;/strong&gt; : L'écosystème open source est le berceau de nombreuses technologies fondamentales du cloud-native, telles que les conteneurs (Docker), l'orchestration (Kubernetes), et les outils d'automatisation (Ansible, Terraform).&lt;sup&gt;1&lt;/sup&gt; Migrer vers des solutions open source facilite l'adoption de ces paradigmes et la transition vers des architectures distribuées et scalables.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qualité et Innovation Communautaire&lt;/strong&gt; : Contrairement aux idées reçues, les logiciels open source majeurs bénéficient souvent de processus de développement rigoureux impliquant des milliers de contributeurs, ce qui peut conduire à une haute qualité et sécurité.&lt;sup&gt;9&lt;/sup&gt; Le rythme d'innovation, alimenté par une communauté mondiale, peut dépasser celui des éditeurs propriétaires, permettant aux entreprises de rester à la pointe de la technologie.&lt;sup&gt;5&lt;/sup&gt; La collaboration via les forums, conférences et bases de connaissances est également un atout majeur.&lt;sup&gt;9&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modèle Économique Alternatif&lt;/strong&gt; : L'open source propose souvent un modèle économique basé sur des souscriptions pour le support et la maintenance, plutôt que sur des licences logicielles coûteuses.&lt;sup&gt;1&lt;/sup&gt; Ce modèle peut offrir un ROI rapide et des coûts récurrents plus prévisibles et souvent inférieurs.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est important de noter que la motivation pour migrer n'est pas uniquement une réaction négative aux changements chez VMware (facteurs "push"), mais aussi une attraction positive vers les bénéfices stratégiques perçus de l'open source (facteurs "pull").&lt;sup&gt;1&lt;/sup&gt; Même si la situation tarifaire de VMware venait à se stabiliser, la tendance de fond vers l'open source, portée par les objectifs de modernisation, d'agilité et d'alignement cloud-native, pourrait persister.&lt;sup&gt;6&lt;/sup&gt; La migration devient ainsi une opportunité de repositionnement stratégique pour l'infrastructure IT.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Panorama des Alternatives Open Source à VMware&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le marché offre une diversité de solutions open source pouvant remplacer tout ou partie de la pile VMware. Ces alternatives se répartissent principalement en deux catégories : les solutions de virtualisation "classiques" (centrées sur la VM) et les plateformes de conteneurisation basées sur Kubernetes (centrées sur le conteneur, mais pouvant aussi gérer des VMs). Le choix d'une alternative ne se résume donc pas à un simple remplacement fonctionnel de VMware par un équivalent open source. Il implique une réflexion sur l'architecture cible souhaitée, le niveau d'intégration désiré et les compétences disponibles au sein de l'organisation. Le spectre des options va des hyperviseurs purs, nécessitant une intégration manuelle des outils de gestion, aux plateformes entièrement intégrées, voire aux plateformes orientées conteneurs capables d'héberger également des machines virtuelles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.1. Solutions de Virtualisation Open Source ("VM-centric")&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces solutions se concentrent sur la fourniture et la gestion d'hyperviseurs pour exécuter des machines virtuelles, de manière similaire à VMware vSphere/ESXi.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KVM (Kernel-based Virtual Machine)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : KVM n'est pas un hyperviseur autonome au sens traditionnel, mais une fonctionnalité du noyau Linux qui transforme ce dernier en un hyperviseur de type 1 (bare-metal).&lt;sup&gt;12&lt;/sup&gt; Il tire parti des capacités intrinsèques de Linux pour la gestion de la mémoire, l'ordonnancement des processus et la sécurité (SELinux, sVirt).&lt;sup&gt;12&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités Clés&lt;/strong&gt; : Performances souvent citées comme proches du natif &lt;sup&gt;15&lt;/sup&gt;, support de la migration à chaud (live migration) &lt;sup&gt;13&lt;/sup&gt;, compatibilité avec une large gamme de matériel certifié Linux &lt;sup&gt;17&lt;/sup&gt;, et support étendu du stockage (tout ce qui est supporté par Linux : disques locaux, NAS, SAN via iSCSI/FC, multipath I/O).&lt;sup&gt;14&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : KVM est la fondation technologique de nombreuses autres solutions de virtualisation et de cloud open source, incluant Proxmox VE, OpenStack, oVirt, et Red Hat OpenShift Virtualization.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Open source, gratuit, performances élevées, stabilité héritée du noyau Linux, intégration native dans l'écosystème Linux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : En tant que composant de base, KVM seul nécessite l'ajout et la configuration d'outils de gestion, d'orchestration, de réseau et de stockage pour fournir une solution complète, ce qui peut être complexe.&lt;sup&gt;13&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxmox VE (Virtual Environment)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Plateforme de virtualisation open source complète, basée sur Debian Linux, qui intègre l'hyperviseur KVM pour les machines virtuelles et LXC pour les conteneurs Linux légers.&lt;sup&gt;7&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités Clés&lt;/strong&gt; : Gestion centralisée via une interface web conviviale &lt;sup&gt;12&lt;/sup&gt;, clustering haute disponibilité (HA) sans nœud maître dédié &lt;sup&gt;1&lt;/sup&gt;, migration à chaud des VMs et conteneurs &lt;sup&gt;5&lt;/sup&gt;, snapshots, sauvegarde intégrée (vzdump) et solution de sauvegarde dédiée (Proxmox Backup Server) avec restauration à chaud.&lt;sup&gt;19&lt;/sup&gt; Supporte une large gamme de stockages, y compris des solutions software-defined comme Ceph et ZFS pour l'hyperconvergence (HCI), ainsi que les stockages réseau traditionnels (NFS, iSCSI, CIFS) et locaux (LVM, ZFS).&lt;sup&gt;11&lt;/sup&gt; Fonctionnalités réseau incluant pontage, VLANs et Open vSwitch &lt;sup&gt;27&lt;/sup&gt;, ainsi qu'un pare-feu intégré au niveau du cluster.&lt;sup&gt;27&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Très populaire auprès des PME, des environnements de test/développement, des "homelabs", mais aussi utilisé en production dans des organisations de taille significative.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Solution tout-en-un facile à installer et à gérer via l'interface web, entièrement open source (licence AGPLv3) sans coût de licence &lt;sup&gt;1&lt;/sup&gt;, performances solides (particulièrement en stockage par rapport à ESXi selon certaines études &lt;sup&gt;19&lt;/sup&gt;), communauté active.&lt;sup&gt;14&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Bien que l'interface soit conviviale, une bonne compréhension de Linux/KVM est utile pour le dépannage avancé.&lt;sup&gt;5&lt;/sup&gt; Le support entreprise (optionnel et payant) est disponible mais peut être perçu comme moins étendu que celui de VMware.&lt;sup&gt;5&lt;/sup&gt; Certaines fonctionnalités très avancées de VMware (ex: DRS très sophistiqué, snapshots sur tous types de stockage sans limitation &lt;sup&gt;30&lt;/sup&gt;) peuvent avoir des équivalents moins matures ou nécessiter une configuration spécifique.&lt;sup&gt;19&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xen Project&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Hyperviseur open source de type 1, mature et éprouvé, utilisé dans de nombreux environnements de production à grande échelle, notamment dans le cloud public (AWS historique) et comme base pour des produits commerciaux comme Citrix Hypervisor.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités Clés&lt;/strong&gt; : Performances efficaces sur diverses architectures (x86, ARM) &lt;sup&gt;5&lt;/sup&gt;, support de la migration à chaud &lt;sup&gt;13&lt;/sup&gt;, fonctionnalités de sécurité robustes (isolation forte entre VMs, support du live patching).&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Solution fiable pour des déploiements à grande échelle nécessitant un contrôle fin sur la couche de virtualisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Maturité, fiabilité prouvée, flexibilité architecturale, gratuit et open source.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Peut avoir une courbe d'apprentissage plus abrupte que d'autres solutions.&lt;sup&gt;5&lt;/sup&gt; L'hyperviseur Xen de base manque d'outils de gestion intégrés conviviaux par rapport à Proxmox ou vCenter, nécessitant souvent l'utilisation de solutions tierces (comme Xen Orchestra pour XCP-ng) ou une gestion en ligne de commande.&lt;sup&gt;5&lt;/sup&gt; Support limité pour certaines fonctionnalités dans la version gratuite (ex: USB &lt;sup&gt;13&lt;/sup&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;oVirt&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Plateforme de gestion de virtualisation open source de niveau entreprise, basée sur l'hyperviseur KVM. C'est le projet communautaire sur lequel est basé Red Hat Virtualization (RHV).&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités Clés&lt;/strong&gt; : Interface de gestion centralisée pour les clusters, le stockage et les VMs. Supporte la haute disponibilité, la migration à chaud, des fonctionnalités réseau avancées et s'intègre avec des outils d'automatisation comme Ansible.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Alternative robuste à VMware vSphere pour les organisations familières avec KVM et recherchant des fonctionnalités d'entreprise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Riche en fonctionnalités de niveau entreprise, soutenu par une forte communauté et le support potentiel de Red Hat (via RHV).&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : La configuration et le déploiement peuvent être complexes, surtout pour les nouveaux utilisateurs.&lt;sup&gt;5&lt;/sup&gt; L'expérience utilisateur peut être perçue comme moins fluide que celle de vSphere.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenStack&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Projet open source massif fournissant une plateforme complète d'Infrastructure as a Service (IaaS) pour construire et gérer des clouds privés (et publics).&lt;sup&gt;5&lt;/sup&gt; Il est composé de nombreux services modulaires (Nova pour le calcul, Neutron pour le réseau, Cinder pour le stockage bloc, Swift pour l'objet, Keystone pour l'identité, Horizon pour le tableau de bord, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités Clés&lt;/strong&gt; : Extrêmement flexible et scalable, permet une gestion fine des ressources à très grande échelle, supporte divers hyperviseurs (KVM étant le plus courant), technologies de stockage (Ceph &lt;sup&gt;5&lt;/sup&gt;) et de réseau (SDN). API robustes pour l'automatisation et l'orchestration.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Solution de choix pour les grandes entreprises ou les fournisseurs de services souhaitant construire un cloud privé avec un contrôle total, mais souvent surdimensionnée pour de simples besoins de virtualisation de serveurs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Scalabilité massive, flexibilité architecturale extrême, évite le verrouillage fournisseur, forte communauté et écosystème.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Très complexe à déployer, gérer et maintenir.&lt;sup&gt;5&lt;/sup&gt; Nécessite une expertise pointue en cloud, réseau, stockage et automatisation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autres Solutions Notables&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenNebula&lt;/strong&gt; : Alternative à OpenStack, souvent considérée comme plus légère et plus simple à déployer, particulièrement pour les PME ou les déploiements hybrides.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XCP-ng&lt;/strong&gt; : Fork communautaire de Citrix XenServer, offrant une alternative open source avec des fonctionnalités d'entreprise et une gestion via Xen Orchestra.&lt;sup&gt;12&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Harvester&lt;/strong&gt; : Solution d'hyperconvergence (HCI) open source de SUSE, basée sur KVM/KubeVirt, Longhorn pour le stockage et intégrée à Rancher pour une gestion unifiée des VMs et des conteneurs.&lt;sup&gt;30&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tableau 2.1 : Comparaison des Fonctionnalités Clés : Hyperviseurs Open Source vs. VMware vSphere&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Fonctionnalité&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;VMware vSphere (avec vCenter)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;KVM (base)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Proxmox VE&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Xen Project&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;oVirt&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;OpenStack&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Type Hyperviseur&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Type 1 (ESXi)
   &lt;/td&gt;
   &lt;td&gt;Type 1 (via noyau Linux)
   &lt;/td&gt;
   &lt;td&gt;Type 1 (KVM via Linux Debian)
   &lt;/td&gt;
   &lt;td&gt;Type 1
   &lt;/td&gt;
   &lt;td&gt;Type 1 (KVM via Linux)
   &lt;/td&gt;
   &lt;td&gt;Gère divers hyperviseurs (KVM, etc.)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Licence&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Propriétaire (Abonnement)
   &lt;/td&gt;
   &lt;td&gt;Open Source (GPL/LGPL)
   &lt;/td&gt;
   &lt;td&gt;Open Source (AGPLv3)
   &lt;/td&gt;
   &lt;td&gt;Open Source (GPLv2)
   &lt;/td&gt;
   &lt;td&gt;Open Source (Apache 2.0)
   &lt;/td&gt;
   &lt;td&gt;Open Source (Apache 2.0)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Haute Disponibilité&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (vSphere HA)
   &lt;/td&gt;
   &lt;td&gt;Non (nécessite outils externes)
   &lt;/td&gt;
   &lt;td&gt;Oui (intégré, &gt;= 3 nœuds)
   &lt;/td&gt;
   &lt;td&gt;Oui (via outils/distros tiers)
   &lt;/td&gt;
   &lt;td&gt;Oui (intégré)
   &lt;/td&gt;
   &lt;td&gt;Oui (au niveau des services &amp; instances)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Migration à Chaud&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (vMotion)
   &lt;/td&gt;
   &lt;td&gt;Oui (natif)
   &lt;/td&gt;
   &lt;td&gt;Oui (intégrée)
   &lt;/td&gt;
   &lt;td&gt;Oui (natif)
   &lt;/td&gt;
   &lt;td&gt;Oui (intégrée)
   &lt;/td&gt;
   &lt;td&gt;Oui (instances Nova)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Gestion Centralisée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (vCenter)
   &lt;/td&gt;
   &lt;td&gt;Non (nécessite libvirt + outils)
   &lt;/td&gt;
   &lt;td&gt;Oui (Interface Web intégrée)
   &lt;/td&gt;
   &lt;td&gt;Non (nécessite outils/distros tiers)
   &lt;/td&gt;
   &lt;td&gt;Oui (Interface Web intégrée)
   &lt;/td&gt;
   &lt;td&gt;Oui (Horizon Dashboard, APIs)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Stockage Supporté&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;VMFS, NFS, iSCSI, FC, vSAN, vVols
   &lt;/td&gt;
   &lt;td&gt;Tout stockage Linux (local, NAS, SAN)
   &lt;/td&gt;
   &lt;td&gt;Large (LVM, ZFS, Ceph, NFS, iSCSI, GlusterFS...)
   &lt;/td&gt;
   &lt;td&gt;Tout stockage supporté par l'hôte
   &lt;/td&gt;
   &lt;td&gt;NFS, iSCSI, FC, GlusterFS, Ceph
   &lt;/td&gt;
   &lt;td&gt;Cinder (Bloc: iSCSI, Ceph...), Swift (Objet)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Réseau Avancé (SDN)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (vDS, NSX)
   &lt;/td&gt;
   &lt;td&gt;Non (OVS/bridges Linux, config manuelle)
   &lt;/td&gt;
   &lt;td&gt;Limité (OVS/bridges, pare-feu, VLANs)
   &lt;/td&gt;
   &lt;td&gt;Limité (OVS/bridges, config manuelle)
   &lt;/td&gt;
   &lt;td&gt;Oui (OVS intégré)
   &lt;/td&gt;
   &lt;td&gt;Oui (Neutron, très avancé)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Sauvegarde Intégrée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Limitée (vSphere Replication)
   &lt;/td&gt;
   &lt;td&gt;Non
   &lt;/td&gt;
   &lt;td&gt;Oui (vzdump, Proxmox Backup Server)
   &lt;/td&gt;
   &lt;td&gt;Non (dépend outils/distros tiers)
   &lt;/td&gt;
   &lt;td&gt;Limitée
   &lt;/td&gt;
   &lt;td&gt;Non (snapshots Cinder)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Support Conteneurs&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (via Tanzu)
   &lt;/td&gt;
   &lt;td&gt;Non (directement)
   &lt;/td&gt;
   &lt;td&gt;Oui (LXC intégré)
   &lt;/td&gt;
   &lt;td&gt;Non (directement)
   &lt;/td&gt;
   &lt;td&gt;Non (directement)
   &lt;/td&gt;
   &lt;td&gt;Oui (via Magnum pour K8s, etc.)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Support Entreprise&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Oui (Broadcom)
   &lt;/td&gt;
   &lt;td&gt;Via distributions (Red Hat, SUSE, Ubuntu)
   &lt;/td&gt;
   &lt;td&gt;Oui (Proxmox Server Solutions GmbH)
   &lt;/td&gt;
   &lt;td&gt;Via distributions (Citrix, Oracle...)
   &lt;/td&gt;
   &lt;td&gt;Oui (via Red Hat RHV)
   &lt;/td&gt;
   &lt;td&gt;Oui (Red Hat, Mirantis, Canonical...)
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;2.2. Plateformes de Conteneurisation Basées sur Kubernetes ("Container-centric" avec gestion VM)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces plateformes utilisent Kubernetes comme orchestrateur principal mais intègrent des capacités (souvent via KubeVirt) pour gérer également des machines virtuelles, offrant une approche unifiée.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Vanilla&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Le projet open source Kubernetes de base, maintenu par la Cloud Native Computing Foundation (CNCF).&lt;sup&gt;41&lt;/sup&gt; Il fournit les fonctionnalités fondamentales pour l'orchestration de conteneurs (déploiement, scaling, gestion du cycle de vie).&lt;sup&gt;42&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion VM&lt;/strong&gt; : Nécessite l'installation et la configuration manuelles de KubeVirt.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Flexibilité maximale, pas de surcoût lié à une distribution spécifique, contrôle total sur les composants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Complexité opérationnelle très élevée. Nécessite d'intégrer et de gérer soi-même tous les composants additionnels essentiels en production : monitoring, logging, réseau (CNI), stockage (CSI), sécurité, ingress, gestion des identités, etc..&lt;sup&gt;45&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red Hat OpenShift&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Distribution Kubernetes orientée entreprise, construite sur Kubernetes (OKD est la version communautaire en amont &lt;sup&gt;44&lt;/sup&gt;), enrichie avec des fonctionnalités pour la sécurité, les développeurs (outils CI/CD intégrés, build S2I), la gestion opérationnelle (mises à jour automatisées, monitoring intégré) et une interface web complète.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion VM&lt;/strong&gt; : Intègre &lt;strong&gt;OpenShift Virtualization&lt;/strong&gt;, basé sur KubeVirt, permettant de créer, importer et gérer des VMs KVM comme des objets natifs Kubernetes aux côtés des conteneurs.&lt;sup&gt;15&lt;/sup&gt; Inclut le &lt;strong&gt;Migration Toolkit for Virtualization (MTV)&lt;/strong&gt; pour faciliter la migration depuis VMware.&lt;sup&gt;16&lt;/sup&gt; Une édition &lt;strong&gt;OpenShift Virtualization Engine&lt;/strong&gt; est dédiée uniquement à la gestion de VMs sur OpenShift.&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Plateforme applicative hybride pour les entreprises, visant à unifier le développement et l'exploitation des applications traditionnelles (VMs) et modernes (conteneurs, serverless). Particulièrement pertinent pour les organisations déjà investies dans l'écosystème Red Hat.&lt;sup&gt;47&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Solution PaaS/CaaS intégrée et supportée par Red Hat, sécurité renforcée par défaut (SELinux, SCCs) &lt;sup&gt;41&lt;/sup&gt;, outils développeurs et opérateurs intégrés, gestion simplifiée du cycle de vie du cluster et des applications.&lt;sup&gt;42&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Peut être perçu comme plus complexe et "opinionated" (imposant certaines façons de faire) que Kubernetes vanilla &lt;sup&gt;44&lt;/sup&gt;, modèle de souscription payant &lt;sup&gt;42&lt;/sup&gt;, potentiellement plus gourmand en ressources que des solutions plus légères.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUSE Rancher&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Plateforme open source de gestion centralisée pour de multiples clusters Kubernetes, quelle que soit leur localisation (on-premise, cloud public, edge) ou leur distribution (RKE, K3s, EKS, AKS, GKE...).&lt;sup&gt;38&lt;/sup&gt; Rancher lui-même n'est pas une distribution Kubernetes, mais un outil de management qui s'installe au-dessus.&lt;sup&gt;41&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion VM&lt;/strong&gt; : Rancher s'intègre nativement avec &lt;strong&gt;Harvester&lt;/strong&gt;, la solution HCI de SUSE.&lt;sup&gt;30&lt;/sup&gt; Harvester utilise KubeVirt et Longhorn (stockage bloc distribué) pour permettre la gestion des VMs depuis la console Rancher, aux côtés des clusters Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distributions Associées&lt;/strong&gt; : RKE (Rancher Kubernetes Engine) est une distribution Kubernetes certifiée CNCF fonctionnant dans des conteneurs Docker.&lt;sup&gt;47&lt;/sup&gt; K3s est une distribution Kubernetes légère, optimisée pour les environnements à ressources limitées (edge, IoT, CI).&lt;sup&gt;47&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Idéal pour les organisations gérant un parc hétérogène de clusters Kubernetes et recherchant une interface de gestion unifiée et conviviale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Extrême flexibilité (agnostique vis-à-vis de l'infrastructure et de la distribution K8s), interface utilisateur intuitive &lt;sup&gt;41&lt;/sup&gt;, gestion multi-cluster native, open source avec support entreprise optionnel (SUSE).&lt;sup&gt;41&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Moins une plateforme PaaS "tout-en-un" qu'OpenShift.&lt;sup&gt;41&lt;/sup&gt; Bien que l'interface soit simple, la configuration et la gestion avancées des clusters sous-jacents nécessitent toujours une expertise Kubernetes.&lt;sup&gt;44&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K3s&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Distribution Kubernetes légère et certifiée CNCF, développée initialement par Rancher Labs (maintenant SUSE).&lt;sup&gt;47&lt;/sup&gt; Conçue pour être simple, rapide à déployer (binaire unique) et avec une faible empreinte mémoire/CPU.&lt;sup&gt;47&lt;/sup&gt; Remplace et simplifie certains composants K8s (etcd remplacé par SQLite par défaut, par exemple).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion VM&lt;/strong&gt; : Peut exécuter KubeVirt, bien que moins courant que sur des distributions K8s complètes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Excellent choix pour l'edge computing, l'IoT, les environnements de développement/test, et les petits clusters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Léger, rapide, facile à installer et à mettre à jour.&lt;sup&gt;44&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Peut manquer de certaines fonctionnalités ou options de configuration avancées présentes dans K8s complet, potentiellement moins adapté pour de très grands clusters centralisés.&lt;sup&gt;44&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KubeVirt (en tant que projet)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Description&lt;/strong&gt; : Projet open source clé qui étend Kubernetes pour permettre la gestion de machines virtuelles.&lt;sup&gt;8&lt;/sup&gt; Il introduit des Custom Resource Definitions (CRDs) comme VirtualMachine (VM) et VirtualMachineInstance (VMI) qui sont gérées via l'API Kubernetes standard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnement&lt;/strong&gt; : Utilise KVM/QEMU via libvirt, encapsulé dans un pod spécifique (virt-launcher) sur les nœuds workers.&lt;sup&gt;46&lt;/sup&gt; Les composants virt-controller (dans le control plane) et virt-handler (daemonset sur les nœuds) orchestrent le cycle de vie des VMs.&lt;sup&gt;46&lt;/sup&gt; Les VMs utilisent le réseau (CNI) et le stockage (CSI via PVCs) de Kubernetes.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positionnement&lt;/strong&gt; : Technologie habilitante fondamentale pour faire converger la gestion des VMs et des conteneurs sur Kubernetes. Utilisée par OpenShift Virtualization, Harvester, et potentiellement dans des déploiements K8s vanilla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; : Permet une gestion unifiée avec les outils Kubernetes existants, facilite une migration progressive vers le cloud-native en hébergeant des VMs legacy sur une plateforme moderne, potentiel d'amélioration de la densité des workloads par rapport aux VMs traditionnelles.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; : Technologie plus récente que les hyperviseurs dédiés, la performance peut être un sujet d'attention pour certains workloads très intensifs &lt;sup&gt;59&lt;/sup&gt;, la maturité de certaines fonctionnalités (ex: live migration avec stockage non-RWX &lt;sup&gt;46&lt;/sup&gt;) peut être en retrait par rapport à vMotion. L'utilisation en mode "DIY" (Do It Yourself) sur K8s vanilla dépend fortement du support communautaire.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'émergence de KubeVirt et son intégration dans des plateformes majeures comme OpenShift et Harvester/Rancher est significative. Elle brouille la frontière historiquement nette entre le monde de la virtualisation et celui de la conteneurisation. Plutôt que de forcer un choix binaire "tout VM" ou "tout conteneur", KubeVirt ouvre une voie de "Re-platforming".&lt;sup&gt;55&lt;/sup&gt; Les entreprises peuvent déplacer leurs VMs existantes sur une infrastructure Kubernetes, les gérant avec les mêmes outils que leurs conteneurs. Cela permet de bénéficier immédiatement de certains avantages de Kubernetes (orchestration déclarative, API unifiée) tout en planifiant une modernisation plus profonde (refactoring vers des conteneurs natifs) à leur propre rythme.&lt;sup&gt;55&lt;/sup&gt; Cette approche hybride et progressive est un atout majeur pour les organisations avec un parc applicatif mixte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tableau 2.2 : Comparaison des Plateformes Kubernetes (OpenShift vs. Rancher vs. K8s Vanilla + KubeVirt)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Caractéristique&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Kubernetes Vanilla (+ KubeVirt DIY)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Red Hat OpenShift (+ Virtualization)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;SUSE Rancher (+ Harvester/K3s)&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Facilité Déploiement&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Complexe
   &lt;/td&gt;
   &lt;td&gt;Complexe (mais assisté)
   &lt;/td&gt;
   &lt;td&gt;Variable (Rancher simple, cluster K8s dépend)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Gestion Cluster&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Manuelle / Outils tiers
   &lt;/td&gt;
   &lt;td&gt;Intégrée (Single/Multi via ACM)
   &lt;/td&gt;
   &lt;td&gt;Nativement Multi-Cluster
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Fonctionnalités PaaS&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Minimales (à intégrer)
   &lt;/td&gt;
   &lt;td&gt;Riches et Intégrées (CI/CD, Registry...)
   &lt;/td&gt;
   &lt;td&gt;Limitées (focus sur gestion K8s)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Gestion VM (KubeVirt)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Manuelle (installation/config)
   &lt;/td&gt;
   &lt;td&gt;Intégrée (OpenShift Virtualization)
   &lt;/td&gt;
   &lt;td&gt;Intégrée via Harvester
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Outils Migration VM&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Outils OS (virt-v2v, etc.)
   &lt;/td&gt;
   &lt;td&gt;Intégrés (MTV)
   &lt;/td&gt;
   &lt;td&gt;Dépend Harvester / Outils OS
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Sécurité Intégrée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Basique (RBAC, NetworkPolicy...)
   &lt;/td&gt;
   &lt;td&gt;Renforcée (SELinux, SCCs, Compliance)
   &lt;/td&gt;
   &lt;td&gt;Variable (dépend cluster K8s sous-jacent)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Modèle Licence/Coût&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Open Source (Gratuit)
   &lt;/td&gt;
   &lt;td&gt;Souscription (Payant)
   &lt;/td&gt;
   &lt;td&gt;Open Source (Support payant optionnel)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Support&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Communautaire
   &lt;/td&gt;
   &lt;td&gt;Entreprise (Red Hat)
   &lt;/td&gt;
   &lt;td&gt;Entreprise (SUSE) / Communautaire
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Cible Principale&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Experts K8s, Flexibilité Max
   &lt;/td&gt;
   &lt;td&gt;Entreprises, Standardisation RH
   &lt;/td&gt;
   &lt;td&gt;Gestion Hétérogène, Multi-Cloud
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Complexité Opérationnelle&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Très Élevée
   &lt;/td&gt;
   &lt;td&gt;Élevée (mais managée)
   &lt;/td&gt;
   &lt;td&gt;Moyenne à Élevée (selon cluster)
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;3. Analyse Approfondie des Enjeux Techniques de la Migration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La migration d'un environnement VMware établi vers une alternative open source, qu'elle soit basée sur la virtualisation traditionnelle ou sur Kubernetes, soulève d'importants défis techniques qu'il convient d'anticiper et de maîtriser. Ces enjeux couvrent la compatibilité des applications et des systèmes d'exploitation, la parité des fonctionnalités essentielles, la complexité intrinsèque du processus de migration des machines virtuelles elles-mêmes, ainsi que les performances et la capacité de montée en charge comparées des différentes solutions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.1. Compatibilité Applicative et Systèmes d'Exploitation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Assurer que les systèmes d'exploitation invités et les applications qu'ils hébergent fonctionneront correctement sur la nouvelle plateforme est une préoccupation majeure.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support des OS Invités&lt;/strong&gt; : La plupart des hyperviseurs open source basés sur KVM ou Xen offrent un large support pour les systèmes d'exploitation invités courants, notamment diverses distributions Linux et versions de Windows.&lt;sup&gt;13&lt;/sup&gt; Proxmox VE liste explicitement Linux, Windows, et d'autres OS.&lt;sup&gt;21&lt;/sup&gt; De même, OpenShift Virtualization, basé sur KVM/KubeVirt, supporte officiellement Windows et Linux, avec même une certification pour certaines versions de Windows Server.&lt;sup&gt;37&lt;/sup&gt; En théorie, la compatibilité de base des OS est donc généralement assurée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problèmes Potentiels lors d'une Migration VM-à-VM&lt;/strong&gt; : Les difficultés surviennent souvent au niveau de l'interaction entre l'OS invité et le nouvel hyperviseur :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pilotes (Drivers)&lt;/strong&gt; : C'est l'un des points les plus critiques. Les performances optimales (disque, réseau) sur KVM/Proxmox/oVirt dépendent des pilotes paravirtualisés VirtIO.&lt;sup&gt;64&lt;/sup&gt; Il est fortement recommandé d'installer ces pilotes dans la VM &lt;em&gt;avant&lt;/em&gt; la migration, bien que cela puisse parfois être fait après.&lt;sup&gt;64&lt;/sup&gt; La désinstallation préalable des VMware Tools est également une étape essentielle pour éviter les conflits.&lt;sup&gt;64&lt;/sup&gt; L'oubli ou l'échec de cette étape peut entraîner des VMs qui ne démarrent pas ou des performances dégradées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Matérielle Virtuelle&lt;/strong&gt; : Le matériel virtuel émulé par l'hyperviseur cible peut différer de celui de VMware. Il faut s'assurer que le type de contrôleur de disque (IDE pour les très vieux OS &lt;sup&gt;64&lt;/sup&gt;, SATA, ou idéalement VirtIO-SCSI pour la performance &lt;sup&gt;64&lt;/sup&gt;), le type de carte réseau (par exemple, passer de E1000/VMXNET3 à VirtIO-net/netkvm &lt;sup&gt;64&lt;/sup&gt;), et le firmware (BIOS hérité vs UEFI &lt;sup&gt;63&lt;/sup&gt;) sont correctement configurés et supportés par l'OS invité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Réseau&lt;/strong&gt; : Bien que des outils tentent de préserver les configurations réseau &lt;sup&gt;66&lt;/sup&gt;, le changement d'adaptateur réseau virtuel peut entraîner la perte de l'adresse IP statique ou des problèmes de "stuck IP" liés à l'ancienne carte réseau fantôme dans l'OS.&lt;sup&gt;30&lt;/sup&gt; Il est crucial de vérifier et, si nécessaire, de reconfigurer les paramètres IP après la migration. La correspondance des VLANs entre l'environnement source et cible est également indispensable pour maintenir la connectivité.&lt;sup&gt;66&lt;/sup&gt; La préservation de l'adresse MAC peut être importante pour certains OS ou applications.&lt;sup&gt;66&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Licences OS/Applicatives&lt;/strong&gt; : Bien que moins fréquent aujourd'hui, certaines licences logicielles pourraient être liées à des identifiants matériels virtuels spécifiques à VMware. Il convient de vérifier ce point pour les applications critiques ou sous licence spécifique.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problèmes Potentiels lors d'une Migration VM-vers-Conteneur ou VM-vers-KubeVirt&lt;/strong&gt; : La transition vers un environnement basé sur Kubernetes introduit des défis de compatibilité différents :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nature de l'Application&lt;/strong&gt; : Les applications monolithiques, non conçues pour être distribuées ou sans état, sont intrinsèquement difficiles à conteneuriser directement. KubeVirt offre ici une solution de repli intéressante, permettant d'exécuter la VM monolithique au sein de Kubernetes en attendant un refactoring éventuel.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépendances Système Fortes&lt;/strong&gt; : Les applications qui interagissent profondément avec le noyau de l'OS invité, nécessitent des pilotes spécifiques ou des privilèges élevés peuvent être complexes à faire fonctionner dans un conteneur standard, qui partage le noyau de l'hôte et a des capacités limitées par défaut. KubeVirt, exécutant un OS complet dans une VM, contourne ce problème.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stockage Persistant&lt;/strong&gt; : La gestion du stockage persistant dans Kubernetes (via Persistent Volumes - PV, Persistent Volume Claims - PVC et Storage Classes - SC) est fondamentalement différente de la gestion des datastores et des disques virtuels (VMDK) dans VMware.&lt;sup&gt;49&lt;/sup&gt; La migration nécessite de mapper les volumes VMDK vers des PVCs et de s'assurer que le stockage sous-jacent (via un driver CSI) fournit les performances et les fonctionnalités requises (ex: mode d'accès ReadWriteMany pour la migration à chaud KubeVirt &lt;sup&gt;46&lt;/sup&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si les défis de compatibilité technique pure (pilotes, matériel virtuel) lors d'une migration VM-à-VM sont souvent surmontables avec une planification minutieuse et les bons outils (comme l'installation préalable des drivers VirtIO), le véritable enjeu se déplace souvent vers la &lt;strong&gt;parité fonctionnelle&lt;/strong&gt; et la &lt;strong&gt;complexité opérationnelle&lt;/strong&gt;. L'écosystème VMware, centré autour de vCenter, offre un ensemble très intégré de fonctionnalités avancées (vMotion, DRS, HA, NSX, vSAN) qui peuvent être plus difficiles à répliquer avec le même niveau de simplicité et d'intégration en assemblant différentes briques open source.&lt;sup&gt;5&lt;/sup&gt; Une migration réussie ne se mesure pas seulement à la capacité de démarrer la VM sur la nouvelle plateforme, mais aussi à la capacité de l'opérer efficacement avec un niveau de service équivalent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.2. Parité des Fonctionnalités (Haute Disponibilité, Migration à Chaud, Réseau/Stockage)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'un des aspects les plus scrutés lors d'une migration est la capacité des solutions alternatives à offrir un niveau de fonctionnalités équivalent à celui de VMware, notamment pour les opérations critiques.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Haute Disponibilité (HA)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; : vSphere HA est une solution éprouvée et largement utilisée pour redémarrer automatiquement les VMs sur d'autres hôtes en cas de défaillance matérielle.&lt;sup&gt;17&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alternatives Open Source&lt;/em&gt; :&lt;ul&gt;
&lt;li&gt;Proxmox VE intègre une fonctionnalité de HA &lt;sup&gt;1&lt;/sup&gt;, nécessitant au moins trois nœuds et un stockage partagé ou répliqué (comme Ceph).&lt;sup&gt;19&lt;/sup&gt; Certains utilisateurs la jugent fonctionnelle mais potentiellement moins sophistiquée que celle de VMware.&lt;sup&gt;19&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;oVirt propose également une HA de niveau entreprise.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Pour KVM pur ou Xen, la HA nécessite généralement des solutions de clustering externes comme Pacemaker/Corosync, ajoutant une couche de complexité.&lt;/li&gt;
&lt;li&gt;Kubernetes gère nativement la haute disponibilité des applications (pods) en les redémarrant sur des nœuds sains. KubeVirt étend ce principe aux VMs qu'il gère, en redémarrant le pod virt-launcher de la VM.&lt;sup&gt;37&lt;/sup&gt; Des fonctionnalités spécifiques à la HA des VMs sont également développées dans KubeVirt.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration à Chaud (Live Migration)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; : vMotion est la technologie de référence pour déplacer une VM en cours d'exécution d'un hôte à un autre sans interruption de service.&lt;sup&gt;17&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alternatives Open Source&lt;/em&gt; :&lt;ul&gt;
&lt;li&gt;KVM, Xen, Proxmox VE et oVirt supportent tous la migration à chaud nativement.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;KubeVirt supporte également la migration à chaud des VMs entre les nœuds Kubernetes.&lt;sup&gt;37&lt;/sup&gt; Cependant, elle impose des contraintes, notamment la nécessité d'utiliser un stockage partagé accessible en mode ReadWriteMany (RWX) pour les volumes persistants de la VM.&lt;sup&gt;46&lt;/sup&gt; Le processus peut aussi avoir un impact temporaire sur les performances.&lt;sup&gt;46&lt;/sup&gt; KubeVirt implémente des stratégies de migration pré-copie (standard) et post-copie (pour les VMs difficiles à faire converger).&lt;sup&gt;60&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion du Réseau&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; : Offre des commutateurs virtuels standards (vSS) et distribués (vDS). Pour le Software-Defined Networking (SDN) avancé, NSX fournit des fonctionnalités riches de micro-segmentation, de routage dynamique, de pare-feu distribué, etc..&lt;sup&gt;3&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alternatives Open Source&lt;/em&gt; :&lt;ul&gt;
&lt;li&gt;Les solutions basées sur Linux (KVM, Proxmox, Xen) utilisent typiquement les mécanismes de pontage (bridging) Linux ou Open vSwitch (OVS) pour la connectivité des VMs.&lt;sup&gt;1&lt;/sup&gt; La configuration des VLANs est couramment supportée.&lt;sup&gt;31&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Proxmox intègre un pare-feu basique et des fonctionnalités SDN limitées.&lt;sup&gt;5&lt;/sup&gt; oVirt a une intégration OVS plus poussée.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;OpenStack Neutron offre des capacités SDN très complètes mais notoirement complexes à maîtriser.&lt;sup&gt;8&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes utilise le Container Network Interface (CNI) comme standard pour les plugins réseau. Des solutions CNI populaires (Calico, Cilium, OVN-Kubernetes...) fournissent des fonctionnalités SDN avancées (Network Policies pour la micro-segmentation, etc.). OpenShift intègre sa propre solution SDN (OpenShift SDN ou OVN-Kubernetes). KubeVirt s'intègre naturellement dans ce modèle réseau Kubernetes.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion du Stockage&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; : Utilise principalement le système de fichiers cluster VMFS pour les LUNs partagés, vSAN pour l'hyperconvergence (HCI), et supporte NFS et iSCSI. vVols permet une gestion plus granulaire du stockage au niveau des VMs.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alternatives Open Source&lt;/em&gt; :&lt;ul&gt;
&lt;li&gt;Proxmox VE brille par sa flexibilité de stockage, supportant une multitude d'options : stockage local (LVM, LVM-Thin, ZFS), stockage réseau (NFS, iSCSI, CIFS), et stockage distribué/software-defined (Ceph/RBD, GlusterFS, ZFS over iSCSI).&lt;sup&gt;11&lt;/sup&gt; L'intégration native de Ceph et ZFS facilite la mise en place de solutions HCI.&lt;sup&gt;11&lt;/sup&gt; Des limitations peuvent exister pour certaines fonctionnalités (ex: snapshots de l'hyperviseur sur LUNs iSCSI classiques &lt;sup&gt;30&lt;/sup&gt;). Le Thin Provisioning est supporté.&lt;sup&gt;30&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;KVM/Linux peuvent utiliser tout type de stockage accessible par le système hôte Linux (local, NFS, iSCSI, FC).&lt;sup&gt;14&lt;/sup&gt; Des solutions SDS comme Ceph &lt;sup&gt;5&lt;/sup&gt; ou GlusterFS sont couramment utilisées.&lt;/li&gt;
&lt;li&gt;OpenStack propose Cinder pour la gestion des volumes bloc (avec divers backends possibles) et Swift pour le stockage objet.&lt;sup&gt;8&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes standardise l'accès au stockage via l'interface CSI (Container Storage Interface). Les administrateurs définissent des Storage Classes qui pointent vers des provisionneurs de stockage (ex: Ceph via Rook, Longhorn, pilotes CSI pour SAN/NAS...). Les applications demandent du stockage via des PVCs. KubeVirt utilise ce mécanisme standard : les disques virtuels des VMs sont adossés à des PVCs.&lt;sup&gt;46&lt;/sup&gt; Harvester intègre Longhorn pour le stockage distribué.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tableau 3.1 : Synthèse de la Parité des Fonctionnalités : VMware vSphere vs. Alternatives Open Source Majeures&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Fonctionnalité&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;VMware vSphere (Full Stack)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Proxmox VE (+ PBS/Ceph)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;KVM + oVirt/OpenStack&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Xen + XCP-ng/Orchestra&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;OpenShift Virtualization&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;HA (VM Restart)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (Mature)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré
   &lt;/td&gt;
   &lt;td&gt;Intégré (oVirt) / Complexe (OS)
   &lt;/td&gt;
   &lt;td&gt;Via Outils Tiers (Mature)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (K8s + KubeVirt)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Live Migration&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (vMotion)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (Limitations)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Load Balancing (DRS)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (Avancé)
   &lt;/td&gt;
   &lt;td&gt;Limité / Manuel
   &lt;/td&gt;
   &lt;td&gt;Limité (oVirt) / Possible (OS)
   &lt;/td&gt;
   &lt;td&gt;Limité / Manuel
   &lt;/td&gt;
   &lt;td&gt;Via K8s Scheduler (Pods)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;SDN (Micro-segment.)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (NSX)
   &lt;/td&gt;
   &lt;td&gt;Limité / Outils Tiers
   &lt;/td&gt;
   &lt;td&gt;Avancé (Neutron) / Limité (oVirt)
   &lt;/td&gt;
   &lt;td&gt;Limité / Outils Tiers
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (NetworkPolicy)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Stockage SDS/HCI&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (vSAN)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (Ceph/ZFS)
   &lt;/td&gt;
   &lt;td&gt;Via Outils Tiers (Ceph...)
   &lt;/td&gt;
   &lt;td&gt;Via Outils Tiers
   &lt;/td&gt;
   &lt;td&gt;Via CSI (Ceph, Longhorn...)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Gestion Centralisée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (vCenter)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (Web UI)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (oVirt/Horizon)
   &lt;/td&gt;
   &lt;td&gt;Via Outils Tiers (Xen Orch.)
   &lt;/td&gt;
   &lt;td&gt;Natif Intégré (OpenShift UI)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Sauvegarde/DR Intégrée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Limitée (VDP/vSphere Rep.)
   &lt;/td&gt;
   &lt;td&gt;Intégrée (PBS)
   &lt;/td&gt;
   &lt;td&gt;Limitée
   &lt;/td&gt;
   &lt;td&gt;Limitée
   &lt;/td&gt;
   &lt;td&gt;Via Outils Tiers (Velero...)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Sécurité Avancée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Intégrée (NSX, Encryption...)
   &lt;/td&gt;
   &lt;td&gt;Basique / Outils Tiers
   &lt;/td&gt;
   &lt;td&gt;Variable (Dépend config/OS)
   &lt;/td&gt;
   &lt;td&gt;Variable (Dépend config/distro)
   &lt;/td&gt;
   &lt;td&gt;Intégrée (Policies, Secrets...)
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Légende : Natif Intégré = Fonctionnalité clé de la plateforme; Via Outils Tiers = Nécessite un composant externe/communautaire; Limité = Fonctionnalité basique ou moins mature; Complexe = Possible mais difficile à mettre en œuvre.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.3. Complexité de la Migration des VMs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le processus technique de déplacement des machines virtuelles de VMware vers une plateforme open source varie en complexité selon la cible et la méthode choisies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration VM-à-VM (vers Hyperviseur Open Source)&lt;/strong&gt; : C'est le scénario le plus direct, visant à remplacer ESXi par KVM, Proxmox, Xen, etc.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outils Disponibles&lt;/strong&gt; : Plusieurs outils peuvent faciliter cette transition :&lt;ul&gt;
&lt;li&gt;virt-v2v : Un outil en ligne de commande puissant pour convertir des VMs depuis VMware (ESXi/vCenter) ou Xen vers des environnements basés sur KVM (gérés par libvirt, oVirt, OpenStack, RHV).&lt;sup&gt;63&lt;/sup&gt; Il gère la conversion des disques et des métadonnées.&lt;/li&gt;
&lt;li&gt;Importateur Proxmox VE : Depuis la version 8.2, Proxmox intègre un assistant graphique pour importer directement des VMs depuis des hôtes ESXi (versions 6.5 à 8.0, hors vSAN).&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Export/Import OVF : L'exportation de la VM VMware au format OVF (Open Virtualization Format) et son importation sur la plateforme cible (ex: qm importovf sur Proxmox) est une méthode standardisée mais souvent manuelle.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Conversion Manuelle de Disques : Implique de copier les fichiers VMDK de VMware et de les convertir au format qcow2 ou raw en utilisant qemu-img, puis de créer manuellement une VM sur la cible en attachant ces disques.&lt;sup&gt;67&lt;/sup&gt; C'est la méthode la plus flexible mais aussi la plus laborieuse et sujette aux erreurs.&lt;/li&gt;
&lt;li&gt;Outils de Sauvegarde/Restauration : Des solutions tierces comme Veeam (qui a annoncé le support de Proxmox pour le T3 2024 &lt;sup&gt;19&lt;/sup&gt;), Vinchin Backup &amp;amp; Recovery &lt;sup&gt;68&lt;/sup&gt;, ou d'autres supportant à la fois VMware et la cible open source &lt;sup&gt;19&lt;/sup&gt;, peuvent potentiellement être utilisées pour sauvegarder sur VMware et restaurer sur la nouvelle plateforme (V2V).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processus Typique&lt;/strong&gt; : Souvent, cela implique une phase d'exportation/copie depuis VMware, une phase de conversion du format de disque et des métadonnées, et une phase d'importation/création sur la cible.&lt;sup&gt;70&lt;/sup&gt; Les outils comme virt-v2v ou l'importateur Proxmox automatisent une partie de ce flux.&lt;sup&gt;65&lt;/sup&gt; Des ajustements post-migration sont presque toujours nécessaires (installation/vérification des pilotes VirtIO, configuration réseau, vérification du boot).&lt;sup&gt;64&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion du Downtime&lt;/strong&gt; : La plupart des méthodes (export/import OVF, conversion manuelle, virt-v2v &lt;sup&gt;69&lt;/sup&gt;) nécessitent que la VM source soit arrêtée (migration à froid ou "cold migration"). L'importateur Proxmox permet une migration "live" (à chaud), mais elle est plus longue et recommandée uniquement si l'arrêt n'est pas possible.&lt;sup&gt;65&lt;/sup&gt; Les outils de sauvegarde/restauration peuvent offrir des options de restauration rapide minimisant le downtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration VM-vers-Conteneur (Refactoring)&lt;/strong&gt; : Il ne s'agit pas d'une migration d'infrastructure au sens strict, mais d'une réingénierie applicative. La complexité est très élevée et dépend entièrement de l'application. Cela sort du cadre de ce rapport centré sur les plateformes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration VM-vers-KubeVirt (Re-platforming)&lt;/strong&gt; : Déplacer une VM pour qu'elle s'exécute au sein d'un cluster Kubernetes géré par KubeVirt.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outils Disponibles&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;Red Hat Migration Toolkit for Virtualization (MTV) : Intégré à OpenShift, il est spécifiquement conçu pour migrer des VMs (notamment VMware) vers OpenShift Virtualization.&lt;sup&gt;16&lt;/sup&gt; Il automatise le mapping réseau/stockage et la création des objets KubeVirt.&lt;sup&gt;57&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Konveyor : Bien que la communauté Konveyor semble s'être recentrée sur le refactoring applicatif &lt;sup&gt;72&lt;/sup&gt;, ses outils comme Crane (migration inter-cluster K8s) ou Move2Kube (aide au re-platforming) peuvent être utiles dans un contexte plus large de modernisation.&lt;sup&gt;73&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Approche Manuelle/Scriptée : Implique de convertir le disque VM (ex: VMDK vers qcow2/raw ou image de conteneur), de téléverser cette image vers un emplacement accessible par KubeVirt (ex: registry de conteneurs, PVC), et de créer les manifestes YAML pour les objets KubeVirt (VirtualMachine, VirtualMachineInstance, DataVolume, Service...).&lt;sup&gt;48&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processus Typique&lt;/strong&gt; : La migration implique non seulement de déplacer les données du disque, mais aussi de traduire la configuration de la VM (CPU, RAM, réseau, stockage) en objets Kubernetes/KubeVirt. MTV simplifie grandement ce processus dans l'écosystème OpenShift.&lt;sup&gt;57&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complexité&lt;/strong&gt; : Nettement plus complexe qu'une migration VM-à-VM car elle nécessite une compréhension des concepts Kubernetes (Pods, Services, PVCs, CRDs) en plus de la virtualisation. Cependant, elle est moins disruptive qu'un refactoring complet de l'application.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3.4. Performance et Scalabilité Comparées&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La performance et la capacité à monter en charge sont des critères essentiels dans le choix d'une plateforme de virtualisation ou de conteneurisation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comparaison des Hyperviseurs (VMware vs KVM/Proxmox)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Performance Brute&lt;/em&gt; : KVM est souvent réputé pour ses performances proches du matériel natif, grâce à son intégration profonde dans le noyau Linux.&lt;sup&gt;15&lt;/sup&gt; Des benchmarks historiques (Phoronix 2011 &lt;sup&gt;18&lt;/sup&gt;) et plus récents (SPECvirt &lt;sup&gt;19&lt;/sup&gt;) le positionnent favorablement face à ESXi. Proxmox VE, basé sur KVM, hérite de ces bonnes performances. Une étude de Blockbridge en 2024 a même montré que Proxmox surpassait significativement ESXi 7.0u3 en termes d'IOPS (+50%), de latence (-30%) et de bande passante (+38%) dans des tests de stockage intensifs avec 32 VMs.&lt;sup&gt;19&lt;/sup&gt; L'écart semble se réduire sous charge normale.&lt;sup&gt;19&lt;/sup&gt; VMware ESXi reste cependant une plateforme très performante, optimisée pour les charges de travail d'entreprise.&lt;sup&gt;28&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Gestion de la Performance&lt;/em&gt; : VMware dispose d'outils avancés comme Distributed Resource Scheduler (DRS) pour l'équilibrage de charge automatique et l'optimisation des ressources au niveau du cluster &lt;sup&gt;24&lt;/sup&gt;, un domaine où les alternatives open source peuvent être moins intégrées ou nécessiter une configuration manuelle plus poussée.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Conclusion Partielle&lt;/em&gt; : Pour la performance brute, notamment en stockage, KVM et Proxmox semblent très compétitifs, voire supérieurs dans certains scénarios. VMware conserve un avantage potentiel dans la gestion automatisée et sophistiquée de la performance à grande échelle grâce à son écosystème intégré.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparaison VMware vs KubeVirt (VMs sur Kubernetes)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Performance&lt;/em&gt; : Il existe peu de benchmarks publics standardisés comparant directement la performance d'une VM sur ESXi versus la même VM sur KubeVirt. La performance sur KubeVirt dépendra fortement de KVM sous-jacent, mais aussi de la performance et de la configuration du cluster Kubernetes lui-même (performance du CNI pour le réseau, du CSI pour le stockage). L'objectif d'OpenShift Virtualization est d'offrir des performances de niveau entreprise.&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Densité&lt;/em&gt; : Un argument clé en faveur de KubeVirt est le potentiel d'une meilleure densité de workloads. En partageant le plan de contrôle Kubernetes et potentiellement des ressources système avec les conteneurs, KubeVirt pourrait permettre d'héberger plus de VMs sur le même matériel par rapport à une pile de virtualisation traditionnelle plus lourde.&lt;sup&gt;61&lt;/sup&gt; Des analyses TCO suggèrent des gains d'efficacité et une réduction de l'empreinte matérielle.&lt;sup&gt;61&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalabilité&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; : Très éprouvé pour la scalabilité verticale et horizontale dans de très grands data centers.&lt;sup&gt;28&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Proxmox VE&lt;/em&gt; : Permet de créer des clusters de plusieurs nœuds &lt;sup&gt;27&lt;/sup&gt; et est utilisé dans des déploiements multi-sites.&lt;sup&gt;33&lt;/sup&gt; La scalabilité est bonne, bien que peut-être moins testée aux extrêmes que VMware.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;KVM/OpenStack&lt;/em&gt; : Conçus pour une scalabilité massive, formant la base de nombreux clouds publics et privés de grande taille.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes&lt;/em&gt; : L'un de ses points forts est la scalabilité horizontale des applications conteneurisées. KubeVirt, en s'intégrant à Kubernetes, hérite de cette capacité à gérer un grand nombre de VMs (pods virt-launcher) orchestrées par Kubernetes. La scalabilité réelle dépendra de la robustesse du control plane K8s et des capacités des nœuds workers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La migration vers KubeVirt représente un changement de paradigme technique et opérationnel plus profond qu'une simple migration VM-à-VM. Elle ne consiste pas seulement à changer d'hyperviseur, mais à adopter une nouvelle plateforme d'orchestration (Kubernetes) pour gérer les VMs. Cela impose une &lt;strong&gt;convergence des compétences et des outils&lt;/strong&gt; traditionnellement séparés entre les équipes d'infrastructure (gestion des VMs) et les équipes applicatives/DevOps (gestion des conteneurs et de Kubernetes). La gestion du cycle de vie des VMs, de leur réseau (via CNI et Services K8s) et de leur stockage (via CSI et PVCs) se fait désormais avec les mécanismes et les API de Kubernetes.&lt;sup&gt;37&lt;/sup&gt; Cette approche intégrée promet une plateforme unifiée &lt;sup&gt;49&lt;/sup&gt;, mais exige que les administrateurs de virtualisation acquièrent une compréhension de Kubernetes &lt;sup&gt;59&lt;/sup&gt; et que les processus opérationnels s'alignent sur les pratiques DevOps (Infrastructure as Code, GitOps, CI/CD).&lt;sup&gt;54&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Évaluation des Défis Opérationnels et Organisationnels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Au-delà des aspects purement techniques, la migration de VMware vers des solutions open source engendre des défis opérationnels et organisationnels significatifs. Le succès de la transition dépend largement de la capacité de l'entreprise à anticiper et à gérer ces changements, qui touchent aux compétences des équipes, aux outils utilisés au quotidien, aux modèles de support et à la structure globale des coûts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.1. Besoins en Nouvelles Compétences&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le passage à un écosystème open source, qu'il s'agisse de virtualisation classique ou de Kubernetes, exige une adaptation et souvent une montée en compétence significative des équipes IT.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compétences pour la Virtualisation Open Source (Proxmox, KVM, Xen, oVirt)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;Une &lt;strong&gt;maîtrise solide de l'environnement Linux&lt;/strong&gt; est quasi indispensable, car la plupart de ces solutions reposent sur ce système d'exploitation.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Une &lt;strong&gt;connaissance de l'hyperviseur sous-jacent (KVM ou Xen)&lt;/strong&gt; est nécessaire pour le dépannage avancé et l'optimisation.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;La familiarité avec les &lt;strong&gt;outils spécifiques à la plateforme choisie&lt;/strong&gt; (interface web et ligne de commande Proxmox &lt;sup&gt;20&lt;/sup&gt;, libvirt pour KVM, Xen Orchestra pour XCP-ng) et les &lt;strong&gt;technologies de stockage et réseau associées&lt;/strong&gt; (Ceph, ZFS, GlusterFS, LVM, Open vSwitch) est cruciale.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Les équipes devront potentiellement être plus à l'aise avec la &lt;strong&gt;ligne de commande&lt;/strong&gt; et le &lt;strong&gt;scripting&lt;/strong&gt; pour l'automatisation et certaines tâches de gestion, car les interfaces graphiques, bien qu'existantes (surtout pour Proxmox et oVirt), peuvent être moins exhaustives que vCenter pour couvrir l'ensemble des fonctionnalités avancées.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compétences pour Kubernetes et KubeVirt&lt;/strong&gt; : La transition vers une plateforme basée sur Kubernetes représente un saut de complexité plus important.&lt;ul&gt;
&lt;li&gt;Une &lt;strong&gt;compréhension approfondie de Kubernetes&lt;/strong&gt; est fondamentale : architecture (control plane, nœuds workers), objets clés (Pods, Deployments, Services, Ingress, ConfigMaps, Secrets), API, ligne de commande (kubectl), concepts réseau (CNI, Services, Ingress) et stockage (CSI, PV, PVC, StorageClasses).&lt;sup&gt;74&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;gestion des conteneurs&lt;/strong&gt; (Docker, containerd, CRI-O) et la capacité à construire et gérer des images de conteneurs sont nécessaires.&lt;/li&gt;
&lt;li&gt;Des compétences spécifiques à &lt;strong&gt;KubeVirt&lt;/strong&gt; pour la définition et la gestion des VMs via les CRDs sont requises.&lt;/li&gt;
&lt;li&gt;La maîtrise des &lt;strong&gt;outils de l'écosystème Kubernetes&lt;/strong&gt; est essentielle pour une exploitation en production : monitoring (Prometheus, Grafana &lt;sup&gt;37&lt;/sup&gt;), logging (EFK/Loki), automatisation et déploiement (Helm, Kustomize, GitOps avec ArgoCD/Flux), gestion de la sécurité (Network Policies, OPA/Gatekeeper, scanners de vulnérabilités), et potentiellement service mesh (Istio, Linkerd).&lt;/li&gt;
&lt;li&gt;Des compétences en &lt;strong&gt;automatisation d'infrastructure&lt;/strong&gt; (Ansible &lt;sup&gt;5&lt;/sup&gt;, Terraform &lt;sup&gt;1&lt;/sup&gt;) sont également très utiles.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;courbe d'apprentissage&lt;/strong&gt; pour maîtriser cet ensemble est reconnue comme étant raide.&lt;sup&gt;6&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparaison avec les Compétences VMware&lt;/strong&gt; : Les administrateurs VMware, certifiés VCP par exemple &lt;sup&gt;74&lt;/sup&gt;, possèdent une expertise spécifique sur l'écosystème vSphere/vCenter.&lt;sup&gt;75&lt;/sup&gt; Bien que certaines compétences soient transférables (concepts de virtualisation, réseau, stockage), une part importante de nouvelles connaissances doit être acquise pour gérer efficacement les plateformes open source, et plus encore pour Kubernetes.&lt;sup&gt;1&lt;/sup&gt; VMware positionne sa solution Tanzu comme un moyen de tirer parti des compétences vSphere existantes pour aborder Kubernetes &lt;sup&gt;75&lt;/sup&gt;, mais une migration vers des solutions open source pures demandera un investissement conséquent en formation.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impact Organisationnel&lt;/strong&gt; : Pour combler ce fossé de compétences, les entreprises devront investir dans la &lt;strong&gt;formation&lt;/strong&gt; de leurs équipes existantes &lt;sup&gt;1&lt;/sup&gt;, potentiellement &lt;strong&gt;recruter&lt;/strong&gt; de nouveaux profils avec une expertise Linux/KVM/Kubernetes, ou &lt;strong&gt;s'appuyer sur des partenaires externes&lt;/strong&gt; (consultants, sociétés de services spécialisées en open source) pour la migration et/ou l'exploitation.&lt;sup&gt;1&lt;/sup&gt; La migration vers Kubernetes, en particulier, peut favoriser une &lt;strong&gt;convergence des équipes&lt;/strong&gt; infrastructure et développement/DevOps, nécessitant une adaptation des structures organisationnelles.&lt;sup&gt;54&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4.2. Maturité des Outils de Gestion, Supervision et Sécurité&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'écosystème VMware, avec vCenter et la suite vRealize (maintenant Aria), offre une plateforme de gestion, de supervision et de sécurité très intégrée et mature.&lt;sup&gt;20&lt;/sup&gt; Les alternatives open source présentent un paysage plus hétérogène.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gestion Centralisée&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Proxmox VE&lt;/em&gt; offre une interface web intégrée et assez complète pour gérer le cluster, les VMs, les conteneurs, le stockage et le réseau.&lt;sup&gt;12&lt;/sup&gt; Elle est souvent louée pour sa convivialité.&lt;sup&gt;20&lt;/sup&gt; Cependant, pour l'automatisation avancée (provisioning type vRA/vRO), des outils externes (Ansible, Terraform) sont nécessaires.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;oVirt&lt;/em&gt; fournit également une interface de gestion centralisée de niveau entreprise.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;KVM/Xen purs&lt;/em&gt; nécessitent des outils de gestion tiers (comme virt-manager pour une gestion locale/simple, ou des solutions plus complexes comme OpenStack Horizon ou Xen Orchestra).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes&lt;/em&gt; : Le Dashboard Kubernetes officiel est limité. Des outils comme Lens ou Octant offrent de meilleures interfaces graphiques. Les distributions comme OpenShift &lt;sup&gt;41&lt;/sup&gt; et Rancher &lt;sup&gt;41&lt;/sup&gt; fournissent des consoles web beaucoup plus riches et intégrées. Pour la gestion multi-cluster et la gouvernance, des outils comme Red Hat Advanced Cluster Management (ACM) &lt;sup&gt;16&lt;/sup&gt; ou Rancher lui-même sont des solutions dédiées.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supervision (Monitoring &amp;amp; Logging)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Proxmox VE&lt;/em&gt; inclut des capacités de monitoring de base des ressources (CPU, RAM, disque, réseau) visibles dans l'interface web &lt;sup&gt;27&lt;/sup&gt;, avec une intégration possible vers InfluxDB/Graphite.&lt;sup&gt;27&lt;/sup&gt; Les logs sont gérés via les mécanismes standards de Linux (syslog, journald).&lt;sup&gt;31&lt;/sup&gt; Pour une supervision et une centralisation des logs avancées, des outils externes (Zabbix, Checkmk, ELK/EFK/Loki stack) sont généralement nécessaires.&lt;sup&gt;31&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;KVM/Xen/Linux&lt;/em&gt; : Reposent entièrement sur l'écosystème d'outils de monitoring et de logging Linux/open source (Nagios, Zabbix, Prometheus Node Exporter, Fluentd, etc.).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes&lt;/em&gt; : Possède un écosystème de supervision très riche et devenu un standard de facto, basé principalement sur &lt;strong&gt;Prometheus&lt;/strong&gt; pour les métriques, &lt;strong&gt;Grafana&lt;/strong&gt; pour la visualisation &lt;sup&gt;37&lt;/sup&gt;, et Alertmanager pour les alertes. Pour les logs, des agents comme Fluentd ou FluentBit sont utilisés pour collecter les logs des conteneurs et les envoyer vers des systèmes de centralisation comme Elasticsearch, OpenSearch ou Loki. Ces outils sont souvent pré-intégrés et configurés dans les distributions comme OpenShift (OpenShift Monitoring) et Rancher (Rancher Monitoring).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sécurité&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware&lt;/em&gt; offre un ensemble robuste de fonctionnalités de sécurité : pare-feu distribué et micro-segmentation avec NSX &lt;sup&gt;24&lt;/sup&gt;, chiffrement des VMs au repos et en mouvement (vMotion chiffré) &lt;sup&gt;31&lt;/sup&gt;, chiffrement vSAN &lt;sup&gt;31&lt;/sup&gt;, intégration avec des modules TPM matériels ou virtuels, Secure Boot, et des outils pour la conformité (ex: vSphere Trust Authority).&lt;sup&gt;20&lt;/sup&gt; Cet ensemble facilite l'atteinte des exigences de conformité réglementaire (HIPAA, PCI-DSS...).&lt;sup&gt;7&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Proxmox VE&lt;/em&gt; fournit des fonctionnalités de sécurité de base : pare-feu intégré au niveau de l'hôte et du cluster (basé sur iptables) &lt;sup&gt;27&lt;/sup&gt;, gestion fine des permissions via RBAC &lt;sup&gt;31&lt;/sup&gt;, support de l'authentification à deux facteurs (2FA).&lt;sup&gt;20&lt;/sup&gt; Le chiffrement des volumes est possible (ex: via LUKS ou ZFS) mais nécessite une configuration manuelle.&lt;sup&gt;31&lt;/sup&gt; Les fonctionnalités de sécurité réseau avancées (type micro-segmentation) ne sont pas natives.&lt;sup&gt;31&lt;/sup&gt; La sécurité repose beaucoup sur la sécurisation de l'OS Debian sous-jacent. Les fonctionnalités intégrées pour la conformité sont limitées.&lt;sup&gt;31&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;KVM/Linux&lt;/em&gt; bénéficient des mécanismes de sécurité éprouvés de Linux, notamment SELinux ou AppArmor pour le Mandatory Access Control (MAC).&lt;sup&gt;15&lt;/sup&gt; KVM utilise également sVirt pour renforcer l'isolation des VMs.&lt;sup&gt;17&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kubernetes&lt;/em&gt; intègre plusieurs mécanismes de sécurité : Network Policies pour la segmentation réseau au niveau des pods, gestion des secrets, contrôle d'accès basé sur les rôles (RBAC), Security Contexts pour définir les privilèges des conteneurs, Pod Security Admission/Policies pour renforcer la sécurité des pods. Les distributions comme OpenShift vont plus loin en activant SELinux par défaut et en utilisant des Security Context Constraints (SCCs) plus stricts.&lt;sup&gt;41&lt;/sup&gt; L'écosystème K8s propose de nombreux outils tiers pour le scan de vulnérabilités (images, configurations), la sécurité runtime (Falco, Sysdig Secure &lt;sup&gt;44&lt;/sup&gt;), et la gestion centralisée des politiques de sécurité (OPA/Gatekeeper, Kyverno &lt;sup&gt;37&lt;/sup&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maturité Globale de l'Outillage&lt;/strong&gt; : L'écosystème d'outils VMware est reconnu pour sa maturité, son intégration et sa couverture fonctionnelle étendue, fruit de nombreuses années de développement.&lt;sup&gt;76&lt;/sup&gt; Du côté open source, la situation est variable. Proxmox offre une solution bien intégrée mais avec un périmètre fonctionnel potentiellement moins large que la suite VMware complète. Utiliser KVM ou Xen purs nécessite d'assembler et d'intégrer soi-même les différentes briques d'outillage (gestion, monitoring, sauvegarde, sécurité), ce qui demande du temps et de l'expertise. L'écosystème Kubernetes est extrêmement dynamique et innovant, avec des outils très puissants, mais il peut aussi apparaître fragmenté et complexe à maîtriser et à intégrer de manière cohérente.&lt;sup&gt;45&lt;/sup&gt; Les distributions Kubernetes comme OpenShift et Rancher visent précisément à simplifier cette intégration en proposant des ensembles d'outils pré-validés et supportés.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4.3. Modèles de Support : Communautaire vs. Entreprise&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le modèle de support est une considération critique, en particulier pour les environnements de production.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support Communautaire&lt;/strong&gt; (Typique pour KVM/Xen purs, K8s vanilla, Proxmox sans souscription) :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Il est &lt;strong&gt;gratuit&lt;/strong&gt; et donne accès à une vaste base de connaissances collective via les forums, les listes de diffusion, la documentation en ligne, les blogs, etc..&lt;sup&gt;5&lt;/sup&gt; Pour des problèmes courants ou des questions générales, la communauté peut être très réactive et fournir des solutions efficaces.&lt;sup&gt;31&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : Il n'offre &lt;strong&gt;aucune garantie de temps de réponse (SLA)&lt;/strong&gt;.&lt;sup&gt;77&lt;/sup&gt; La résolution de problèmes complexes ou spécifiques peut dépendre de la disponibilité et de la bonne volonté des membres de la communauté.&lt;sup&gt;6&lt;/sup&gt; Il n'y a pas d'interlocuteur unique responsable en cas d'incident majeur. Ce modèle est souvent jugé &lt;strong&gt;insuffisant pour les applications et infrastructures critiques&lt;/strong&gt; en entreprise.&lt;sup&gt;76&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support Entreprise&lt;/strong&gt; (Proposé par des éditeurs comme Red Hat, SUSE, Canonical, ou Proxmox Server Solutions GmbH pour leurs produits/distributions basés sur l'open source) :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Fournit des &lt;strong&gt;niveaux de service garantis (SLAs)&lt;/strong&gt;, un accès à des &lt;strong&gt;équipes d'experts dédiées&lt;/strong&gt;, un support technique potentiellement &lt;strong&gt;24/7&lt;/strong&gt; pour les incidents critiques, la fourniture de &lt;strong&gt;correctifs de sécurité validés&lt;/strong&gt; et une &lt;strong&gt;feuille de route produit claire&lt;/strong&gt;.&lt;sup&gt;5&lt;/sup&gt; Il offre une &lt;strong&gt;responsabilité&lt;/strong&gt; claire en cas de problème et est généralement considéré comme &lt;strong&gt;indispensable pour les environnements de production critiques&lt;/strong&gt;.&lt;sup&gt;30&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : Représente un &lt;strong&gt;coût récurrent&lt;/strong&gt; (modèle de souscription annuel).&lt;sup&gt;11&lt;/sup&gt; Bien que souvent inférieur aux coûts de licence VMware &lt;sup&gt;11&lt;/sup&gt;, il doit être budgété. Il peut également lier l'entreprise à l'écosystème et aux cycles de vie du fournisseur de support choisi.&lt;sup&gt;47&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le Choix du Modèle&lt;/strong&gt; : La décision dépendra fortement de la &lt;strong&gt;criticité des charges de travail&lt;/strong&gt; hébergées, du &lt;strong&gt;niveau d'expertise technique interne&lt;/strong&gt;, du &lt;strong&gt;budget alloué au support&lt;/strong&gt; et de l'&lt;strong&gt;appétence au risque&lt;/strong&gt; de l'organisation.&lt;sup&gt;20&lt;/sup&gt; De nombreuses entreprises choisissent de souscrire à un support entreprise pour sécuriser leurs déploiements open source en production, considérant que le coût est justifié par la réduction du risque opérationnel.&lt;sup&gt;8&lt;/sup&gt; Pour les environnements non critiques (développement, test, pré-production), le support communautaire peut être suffisant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;4.4. Analyse Comparative du Coût Total de Possession (TCO)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'analyse du TCO est essentielle pour comparer équitablement VMware et ses alternatives open source, en allant au-delà du simple coût des licences logicielles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Composantes du TCO à Considérer&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Coûts Logiciels (Licences et Souscriptions)&lt;/strong&gt; : C'est le point de divergence le plus évident. VMware impose désormais des abonnements par cœur coûteux.&lt;sup&gt;1&lt;/sup&gt; Les solutions open source de base (KVM, Xen, K8s vanilla, Proxmox sans support) n'ont pas de coût de licence.&lt;sup&gt;1&lt;/sup&gt; Les distributions et plateformes open source avec support entreprise (OpenShift, Rancher, Proxmox avec support) ont des coûts de souscription, mais souvent inférieurs aux licences VMware équivalentes.&lt;sup&gt;11&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts de Support&lt;/strong&gt; : Pour VMware, le support est généralement inclus dans l'abonnement. Pour l'open source, il faut choisir entre le support communautaire (gratuit mais risqué) et le support entreprise (coût additionnel).&lt;sup&gt;32&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts Matériels&lt;/strong&gt; : Les besoins matériels peuvent varier. Proxmox VE est réputé moins gourmand en ressources pour l'hyperviseur lui-même que ESXi.&lt;sup&gt;19&lt;/sup&gt; L'adoption de KubeVirt et des conteneurs peut potentiellement améliorer la densité des workloads et réduire l'empreinte matérielle globale par rapport à une infrastructure 100% VM.&lt;sup&gt;61&lt;/sup&gt; Cependant, certaines plateformes comme OpenShift peuvent avoir des prérequis matériels minimaux plus élevés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts Opérationnels (Personnel et Compétences)&lt;/strong&gt; : C'est un facteur clé souvent sous-estimé. Si les compétences requises pour les solutions open source (Linux, KVM, K8s, Ceph...) manquent en interne, les coûts liés à la formation, au recrutement de nouveaux profils ou à l'externalisation (consultants, infogérance) peuvent être significatifs et potentiellement compenser les économies de licences.&lt;sup&gt;6&lt;/sup&gt; L'investissement dans l'automatisation (Ansible, Terraform) peut cependant aider à maîtriser ces coûts à terme.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts de Migration&lt;/strong&gt; : Le projet de migration lui-même a un coût (temps des équipes internes, potentiels outils ou services externes, downtime éventuel).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts de Formation&lt;/strong&gt; : Nécessaires pour assurer la montée en compétence des équipes.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts des Outils Tiers&lt;/strong&gt; : Si la plateforme open source choisie nécessite des outils complémentaires pour le monitoring, la sécurité ou la sauvegarde avancée, leurs coûts doivent être inclus dans le TCO.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comparaisons Spécifiques du TCO&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;VMware vs. Proxmox VE&lt;/em&gt; : Grâce à l'absence de coût de licence, Proxmox présente souvent un TCO plus avantageux, même en incluant une souscription de support.&lt;sup&gt;19&lt;/sup&gt; Une discussion sur Reddit &lt;sup&gt;32&lt;/sup&gt; montre des avis partagés, certains estimant que VMware Standard est compétitif face à Proxmox Premium, tandis que d'autres rapportent des économies substantielles avec Proxmox. Le choix du niveau de support Proxmox et les compétences internes sont déterminants.&lt;sup&gt;11&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;VMware vs. OpenShift Virtualization&lt;/em&gt; : OpenShift, via son modèle de souscription, peut offrir un TCO inférieur, en particulier pour les entreprises déjà engagées avec Red Hat ou celles qui bénéficient des gains de densité et d'agilité apportés par la plateforme unifiée VM/conteneurs.&lt;sup&gt;54&lt;/sup&gt; Une analyse TCO de Platform9 (fournissant KubeVirt managé) comparée à VMware a montré une réduction de 49% sur 5 ans, en incluant les coûts opérationnels et de licence.&lt;sup&gt;61&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;VMware vs. KVM (DIY)&lt;/em&gt; : Le coût de licence KVM est nul, mais le TCO global dépendra entièrement des coûts d'implémentation (assemblage des outils), de gestion (compétences internes requises) et de support (interne ou externe).&lt;sup&gt;15&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Facteurs Clés pour l'Analyse TCO&lt;/strong&gt; : Il est crucial de ne pas se focaliser uniquement sur le coût des licences logicielles.&lt;sup&gt;11&lt;/sup&gt; Une analyse TCO rigoureuse doit modéliser l'ensemble des coûts sur plusieurs années (typiquement 3 à 5 ans), en incluant les coûts opérationnels (personnel, formation), les coûts de support (interne vs externe, SLA requis), les coûts matériels (potentiels gains de densité), et les coûts de migration initiaux. Des outils de calcul TCO peuvent être utiles s'ils sont disponibles et adaptés (ex: Scale Computing &lt;sup&gt;26&lt;/sup&gt;, Platform9 &lt;sup&gt;61&lt;/sup&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'analyse du TCO des solutions open source révèle une complexité souvent sous-estimée. Si l'économie sur les licences logicielles est un avantage indéniable et immédiat &lt;sup&gt;1&lt;/sup&gt;, elle peut être contrebalancée par d'autres facteurs. Les coûts potentiellement plus élevés liés au &lt;strong&gt;besoin accru de compétences spécifiques&lt;/strong&gt; (internes ou externes) &lt;sup&gt;6&lt;/sup&gt;, à l'&lt;strong&gt;intégration d'outils&lt;/strong&gt; qui peuvent être perçus comme moins matures ou plus fragmentés que la suite VMware &lt;sup&gt;5&lt;/sup&gt;, et au &lt;strong&gt;risque opérationnel&lt;/strong&gt; associé au support communautaire pour les environnements critiques &lt;sup&gt;6&lt;/sup&gt; doivent impérativement être pris en compte. Une analyse TCO sérieuse ne peut se contenter de comparer les prix affichés des licences ou des souscriptions ; elle doit intégrer une évaluation réaliste de ces coûts opérationnels, de support et de risque sur le long terme.&lt;sup&gt;11&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tableau 4.1 : Analyse Comparative des Facteurs TCO (VMware vs. Proxmox vs. OpenShift)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Catégorie de Coût&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;VMware vSphere (Abonnement)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Proxmox VE (+ Support Premium)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;OpenShift Platform Plus (+ Virt.)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Facteurs Clés d'Influence&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Licences/Souscriptions&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;Faible (Support uniquement)
   &lt;/td&gt;
   &lt;td&gt;Élevé
   &lt;/td&gt;
   &lt;td&gt;Modèle par cœur VMware, Coût support Proxmox, Édition OpenShift
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Support Annuel&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Inclus (Très Élevé)
   &lt;/td&gt;
   &lt;td&gt;Faible à Moyen
   &lt;/td&gt;
   &lt;td&gt;Inclus (Élevé)
   &lt;/td&gt;
   &lt;td&gt;Niveau de SLA requis, Compétences internes
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Matériel Initial/Rafraîch.&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Moyen à Élevé
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Moyen à Élevé
   &lt;/td&gt;
   &lt;td&gt;Densité workloads, Prérequis plateforme (OShift &gt; Proxmox)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Personnel Opérationnel&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Moyen à Élevé
   &lt;/td&gt;
   &lt;td&gt;Élevé
   &lt;/td&gt;
   &lt;td&gt;Compétences Linux/KVM/K8s internes, Niveau d'automatisation
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Formation Initiale/Continue&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Faible (si déjà expert)
   &lt;/td&gt;
   &lt;td&gt;Moyenne (Linux/Proxmox)
   &lt;/td&gt;
   &lt;td&gt;Élevée (K8s/OpenShift)
   &lt;/td&gt;
   &lt;td&gt;Écart de compétences initial, Complexité plateforme
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Migration Initiale&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;N/A
   &lt;/td&gt;
   &lt;td&gt;Faible à Moyen
   &lt;/td&gt;
   &lt;td&gt;Moyen à Élevé
   &lt;/td&gt;
   &lt;td&gt;Complexité source, Outils utilisés, Recours à services tiers
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Outils Tiers (Monitor/Secu...)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Faible (suite intégrée)
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Faible à Moyen (suite intégrée)
   &lt;/td&gt;
   &lt;td&gt;Niveau de fonctionnalités requis vs. intégré
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;TCO Global Estimé (3-5 ans)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Faible à Moyen&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Moyen à Élevé&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Fortement dépendant des coûts opérationnels et de support&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;em&gt;Évaluation qualitative : Faible &amp;lt; Moyen &amp;lt; Élevé &amp;lt; Très Élevé. Le TCO global est une estimation comparative.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Le passage à l'open source, que ce soit vers la virtualisation ou Kubernetes, représente bien plus qu'un simple changement d'outil technologique. C'est une &lt;strong&gt;transformation opérationnelle profonde&lt;/strong&gt; qui impacte les compétences requises &lt;sup&gt;6&lt;/sup&gt;, les outils de gestion et de supervision utilisés au quotidien &lt;sup&gt;31&lt;/sup&gt;, les processus de déploiement et de maintenance, et les modèles de support.&lt;sup&gt;31&lt;/sup&gt; Le succès d'une telle migration dépend donc autant de la robustesse de la technologie choisie que de la capacité de l'organisation à &lt;strong&gt;gérer ce changement organisationnel et culturel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Stratégies de Migration Détaillées&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois la décision de migrer prise et la plateforme cible sélectionnée, il est essentiel de définir une stratégie de migration claire et une approche de déploiement adaptée au contexte de l'entreprise. Plusieurs méthodologies existent, chacune avec ses avantages, ses inconvénients et ses cas d'usage privilégiés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.1. Les "6 R" de la Migration Cloud (Adaptées au contexte VMware vers Open Source)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bien qu'originellement définies pour les migrations vers le cloud public, les stratégies des "6 R" offrent un cadre utile pour penser la migration depuis VMware :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rehost (Lift and Shift)&lt;/strong&gt; : Cette stratégie consiste à déplacer les machines virtuelles (VMs) de l'environnement VMware vers la nouvelle plateforme (hyperviseur open source comme KVM/Proxmox, ou plateforme KubeVirt sur Kubernetes) avec un minimum de modifications.&lt;sup&gt;55&lt;/sup&gt; L'objectif principal est la rapidité et la minimisation des changements applicatifs initiaux.&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : C'est généralement l'approche la &lt;strong&gt;plus rapide&lt;/strong&gt; et la &lt;strong&gt;moins risquée à court terme&lt;/strong&gt;, car elle ne touche pas au fonctionnement interne des applications.&lt;sup&gt;62&lt;/sup&gt; Elle permet de quitter rapidement l'infrastructure VMware source.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : Elle &lt;strong&gt;ne tire pas pleinement parti des capacités&lt;/strong&gt; de la nouvelle plateforme (élasticité native de K8s, fonctionnalités de stockage avancées de Proxmox/Ceph, etc.).&lt;sup&gt;55&lt;/sup&gt; Les VMs migrées peuvent conserver des inefficacités ou des configurations sous-optimales pour le nouvel environnement. C'est souvent une étape tactique plutôt qu'une optimisation finale.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replatform (Lift and Reshape)&lt;/strong&gt; : Ici, on apporte des &lt;strong&gt;modifications ciblées&lt;/strong&gt; aux VMs ou à leur environnement pour mieux exploiter les capacités de la plateforme cible, sans pour autant réécrire complètement les applications.&lt;sup&gt;62&lt;/sup&gt; Exemples :&lt;ul&gt;
&lt;li&gt;Migrer une VM vers &lt;strong&gt;KubeVirt&lt;/strong&gt; pour la gérer via l'API Kubernetes.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Modifier une application pour utiliser un service de base de données managé si la cible est un cloud public.&lt;sup&gt;55&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Adapter la configuration de stockage pour utiliser des fonctionnalités spécifiques comme ZFS ou Ceph sur Proxmox, ou des vVols sur un stockage compatible.&lt;sup&gt;62&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;Installer ou optimiser les pilotes VirtIO après une migration vers KVM/Proxmox.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Permet de réaliser des &lt;strong&gt;gains d'efficacité ou de fonctionnalité&lt;/strong&gt; par rapport au Lift and Shift, sans l'effort d'une refonte complète.&lt;sup&gt;62&lt;/sup&gt; Offre un bon &lt;strong&gt;équilibre entre l'effort et les bénéfices&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : Nécessite plus de planification, de tests et potentiellement d'expertise que le Lift and Shift.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refactor / Re-architect&lt;/strong&gt; : Cette stratégie implique une &lt;strong&gt;modernisation profonde&lt;/strong&gt; des applications, souvent en les redéveloppant ou en les ré-architecturant pour adopter une approche cloud-native.&lt;sup&gt;55&lt;/sup&gt; Cela signifie typiquement décomposer des applications monolithiques en microservices, les conteneuriser (avec Docker par exemple), et les déployer nativement sur une plateforme d'orchestration comme Kubernetes.&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Permet de &lt;strong&gt;tirer pleinement parti des avantages du cloud-native&lt;/strong&gt; : scalabilité horizontale, résilience, agilité de déploiement (CI/CD), optimisation des coûts à long terme grâce à une meilleure utilisation des ressources.&lt;sup&gt;62&lt;/sup&gt; C'est la voie vers une transformation applicative complète.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : C'est de loin l'approche la &lt;strong&gt;plus complexe, la plus longue, la plus coûteuse et la plus risquée&lt;/strong&gt;.&lt;sup&gt;62&lt;/sup&gt; Elle nécessite des compétences avancées en développement logiciel, en architecture microservices et en Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repurchase&lt;/strong&gt; : Remplacer une application existante hébergée sur une VM par une solution logicielle en mode SaaS (Software as a Service).&lt;sup&gt;78&lt;/sup&gt; Moins une stratégie de migration d'infrastructure qu'une décision applicative, mais elle peut réduire le nombre de VMs à migrer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retain&lt;/strong&gt; : Décider de &lt;strong&gt;conserver certaines applications ou workloads sur l'infrastructure VMware existante&lt;/strong&gt; (ou une version réduite/dédiée de celle-ci).&lt;sup&gt;78&lt;/sup&gt; Cette approche hybride peut être pertinente pour des applications très critiques, très spécifiques, difficiles ou coûteuses à migrer, ou soumises à des contraintes réglementaires particulières.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retire&lt;/strong&gt; : Identifier et &lt;strong&gt;décommissionner les applications ou VMs qui ne sont plus utilisées&lt;/strong&gt; ou dont la valeur métier est devenue nulle.&lt;sup&gt;78&lt;/sup&gt; C'est une étape importante de nettoyage à réaliser avant ou pendant la migration pour ne pas déplacer des systèmes obsolètes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tableau 5.1 : Comparaison des Stratégies de Migration (Lift &amp;amp; Shift vs. Replatform vs. Refactor)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Stratégie&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Effort / Complexité&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Risque Initial&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Durée Estimée&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Coût Initial&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Bénéfices Cloud-Native&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Compétences Requises (Focus)&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Lift &amp; Shift (Rehost)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Faible
   &lt;/td&gt;
   &lt;td&gt;Faible
   &lt;/td&gt;
   &lt;td&gt;Courte
   &lt;/td&gt;
   &lt;td&gt;Faible
   &lt;/td&gt;
   &lt;td&gt;Très Limités
   &lt;/td&gt;
   &lt;td&gt;Infrastructure, Outils Migration
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Replatform&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Moyenne
   &lt;/td&gt;
   &lt;td&gt;Moyen
   &lt;/td&gt;
   &lt;td&gt;Modérés
   &lt;/td&gt;
   &lt;td&gt;Infra, Plateforme Cible, App (léger)
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Refactor&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;Longue
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;Maximaux
   &lt;/td&gt;
   &lt;td&gt;Développement, Architecture, K8s
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;5.2. Approches de Déploiement de la Migration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois la stratégie choisie (comment migrer), il faut décider de l'approche de déploiement (quand et à quel rythme migrer).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Big Bang&lt;/strong&gt; : Cette approche consiste à migrer &lt;strong&gt;l'ensemble de l'environnement&lt;/strong&gt; concerné (ou un large périmètre fonctionnel) &lt;strong&gt;en une seule fois&lt;/strong&gt;, généralement pendant une fenêtre de maintenance planifiée et étendue.&lt;sup&gt;79&lt;/sup&gt; L'ancien système est arrêté, la migration est effectuée, le nouveau système est démarré et validé.&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : La &lt;strong&gt;durée totale du projet de migration est plus courte&lt;/strong&gt;. Il n'y a &lt;strong&gt;pas de complexité liée à la gestion de deux systèmes en parallèle&lt;/strong&gt; sur une longue période. La transition est nette et claire pour tous les utilisateurs. Les coûts peuvent être inférieurs à court terme car l'effort est concentré.&lt;sup&gt;79&lt;/sup&gt; Cette approche peut convenir aux environnements de petite taille, peu complexes, ou lorsque l'organisation peut tolérer une interruption de service planifiée et souhaite une coupure franche.&lt;sup&gt;79&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : Le &lt;strong&gt;risque est maximal&lt;/strong&gt; : si un problème majeur survient pendant la migration ou lors du redémarrage, l'ensemble du périmètre migré est impacté, et un retour arrière (rollback) peut être très complexe et coûteux.&lt;sup&gt;79&lt;/sup&gt; Elle nécessite une &lt;strong&gt;planification extrêmement rigoureuse&lt;/strong&gt; et des &lt;strong&gt;tests préalables exhaustifs&lt;/strong&gt; pour minimiser les imprévus. Le &lt;strong&gt;downtime requis peut être long&lt;/strong&gt;, ce qui est inacceptable pour de nombreuses activités critiques fonctionnant 24/7.&lt;sup&gt;79&lt;/sup&gt; La &lt;strong&gt;pression sur les équipes&lt;/strong&gt; de migration est immense pendant la fenêtre de bascule. Il y a &lt;strong&gt;peu de flexibilité&lt;/strong&gt; pour ajuster la stratégie en cours de route.&lt;sup&gt;80&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phased / Trickle / Progressive (Par Lots)&lt;/strong&gt; : L'environnement est divisé en &lt;strong&gt;unités logiques plus petites&lt;/strong&gt; (par application, par service métier, par criticité, par localisation géographique...) qui sont migrées &lt;strong&gt;étape par étape&lt;/strong&gt;, sur une période de temps plus étendue.&lt;sup&gt;79&lt;/sup&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Le &lt;strong&gt;risque est considérablement réduit&lt;/strong&gt; : un échec lors de la migration d'un lot n'affecte que ce périmètre limité et est plus facile à gérer ou à annuler.&lt;sup&gt;79&lt;/sup&gt; Le &lt;strong&gt;downtime est limité&lt;/strong&gt; à chaque lot (voire nul pour certaines migrations à chaud). L'approche permet aux équipes de &lt;strong&gt;gagner en expérience&lt;/strong&gt; au fur et à mesure, d'&lt;strong&gt;identifier et de corriger les problèmes&lt;/strong&gt; rencontrés sur les premiers lots, et d'&lt;strong&gt;ajuster la méthodologie&lt;/strong&gt; pour les lots suivants.&lt;sup&gt;79&lt;/sup&gt; L'&lt;strong&gt;adaptation des utilisateurs&lt;/strong&gt; au nouveau système est également plus progressive.&lt;sup&gt;81&lt;/sup&gt; C'est généralement l'approche &lt;strong&gt;préférée pour les environnements complexes, critiques ou de grande taille&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : La &lt;strong&gt;durée totale du projet de migration est plus longue&lt;/strong&gt;.&lt;sup&gt;79&lt;/sup&gt; Elle nécessite de &lt;strong&gt;gérer la coexistence&lt;/strong&gt; de l'ancien et du nouvel environnement pendant la période de transition, ce qui peut être complexe (synchronisation de données, gestion des identités, dépendances inter-lots, routage réseau).&lt;sup&gt;79&lt;/sup&gt; Les &lt;strong&gt;coûts opérationnels peuvent être plus élevés&lt;/strong&gt; pendant cette période car deux systèmes doivent être maintenus et potentiellement synchronisés.&lt;sup&gt;79&lt;/sup&gt; La gestion du projet est plus complexe en raison des multiples phases.&lt;sup&gt;81&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration Parallèle&lt;/strong&gt; : Une variante de l'approche progressive où l'ancien et le nouveau système fonctionnent &lt;strong&gt;simultanément pendant une période de validation&lt;/strong&gt;, traitant potentiellement les mêmes transactions ou données.&lt;sup&gt;81&lt;/sup&gt;&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : C'est l'approche la &lt;strong&gt;moins risquée&lt;/strong&gt; car elle permet une validation complète du nouveau système avant de décommissionner l'ancien.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inconvénients&lt;/em&gt; : C'est souvent la &lt;strong&gt;plus coûteuse et la plus complexe&lt;/strong&gt; à mettre en œuvre, car elle peut nécessiter une double saisie de données ou des mécanismes de synchronisation complexes, et implique de maintenir deux infrastructures complètes en production.&lt;sup&gt;81&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Tableau 5.2 : Comparaison des Approches de Déploiement (Big Bang vs. Phased)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Approche&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Risque Global&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Durée Totale Projet&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Coût Total Estimé&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Impact Opérationnel (Downtime)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Complexité Gestion (Pendant Migration)&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;&lt;strong&gt;Flexibilité / Ajustement&lt;/strong&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Big Bang&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Très Élevé
   &lt;/td&gt;
   &lt;td&gt;Courte
   &lt;/td&gt;
   &lt;td&gt;Potent. Inférieur
   &lt;/td&gt;
   &lt;td&gt;Élevé (Unique et Long)
   &lt;/td&gt;
   &lt;td&gt;Faible (Transition Nette)
   &lt;/td&gt;
   &lt;td&gt;Faible
   &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;&lt;strong&gt;Phased / Progressive&lt;/strong&gt;
   &lt;/td&gt;
   &lt;td&gt;Réduit
   &lt;/td&gt;
   &lt;td&gt;Longue
   &lt;/td&gt;
   &lt;td&gt;Potent. Supérieur
   &lt;/td&gt;
   &lt;td&gt;Faible (Par Lot)
   &lt;/td&gt;
   &lt;td&gt;Élevée (Coexistence)
   &lt;/td&gt;
   &lt;td&gt;Élevée
   &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Le choix de la stratégie de migration ("R") influence souvent l'approche de déploiement la plus réaliste. Par exemple, une stratégie de &lt;strong&gt;Refactoring&lt;/strong&gt; &lt;sup&gt;62&lt;/sup&gt;, intrinsèquement longue et complexe, se prête mal à une approche &lt;strong&gt;Big Bang&lt;/strong&gt; &lt;sup&gt;79&lt;/sup&gt; pour un environnement d'entreprise significatif. Elle sera presque toujours déployée de manière &lt;strong&gt;progressive&lt;/strong&gt;.&lt;sup&gt;79&lt;/sup&gt; À l'inverse, un &lt;strong&gt;Lift and Shift&lt;/strong&gt; &lt;sup&gt;62&lt;/sup&gt;, étant plus simple, peut être envisagé soit en Big Bang (pour des petits périmètres) soit par lots. Le &lt;strong&gt;Replatforming&lt;/strong&gt; &lt;sup&gt;62&lt;/sup&gt;, avec des modifications intermédiaires, offre plus de flexibilité quant à l'approche de déploiement. La nature de la transformation visée (simple déplacement vs optimisation vs refonte) dicte en partie le rythme et le séquencement possibles de la migration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.3. Planification et Exécution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Quelle que soit la stratégie ou l'approche choisie, une planification rigoureuse et une exécution méthodique sont indispensables à la réussite.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Évaluation Pré-migration&lt;/strong&gt; : Réaliser un audit complet de l'environnement VMware existant (inventaire des VMs, configurations matérielles et logicielles, utilisation des ressources, dépendances applicatives et réseau).&lt;sup&gt;1&lt;/sup&gt; Définir des objectifs clairs et mesurables pour la migration (réduction des coûts, amélioration des performances, gain d'agilité...).&lt;sup&gt;70&lt;/sup&gt; Identifier les contraintes (budgétaires, temporelles, réglementaires).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feuille de Route (Roadmap)&lt;/strong&gt; : Élaborer un plan de migration détaillé, incluant les étapes clés, la priorisation des workloads (basée sur la criticité, la complexité, les dépendances), les outils à utiliser, les responsabilités de chaque équipe, et un calendrier réaliste.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests Pilotes (Proof of Concept - PoC)&lt;/strong&gt; : Avant de lancer la migration à grande échelle, il est crucial de valider le processus, les outils et la plateforme cible sur un échantillon représentatif et non critique de VMs ou d'applications.&lt;sup&gt;62&lt;/sup&gt; Ces pilotes permettent d'identifier les problèmes potentiels (techniques, performance, compatibilité), d'affiner la méthodologie et de former les équipes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sauvegarde et Plan de Retour Arrière (Rollback)&lt;/strong&gt; : Mettre en place une stratégie de sauvegarde robuste pour toutes les VMs et données avant de commencer la migration.&lt;sup&gt;62&lt;/sup&gt; Définir et tester un plan de retour arrière clair pour chaque phase de migration en cas d'échec majeur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exécution de la Migration&lt;/strong&gt; : Suivre la feuille de route, utiliser les outils choisis, communiquer étroitement entre les équipes, et documenter le processus.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suivi et Optimisation Post-migration&lt;/strong&gt; : Une fois les VMs migrées, surveiller attentivement leurs performances et leur stabilité sur la nouvelle plateforme.&lt;sup&gt;1&lt;/sup&gt; Procéder aux ajustements et optimisations nécessaires (tuning des ressources, configuration réseau/stockage).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il est essentiel de comprendre que la migration n'est souvent pas une fin en soi, mais plutôt une &lt;strong&gt;étape dans un parcours de modernisation plus large et potentiellement continu&lt;/strong&gt;. Une approche initiale de type "Lift and Shift" ou "Replatform" peut être choisie pour sortir rapidement de l'environnement VMware et réaliser des économies de coûts, tout en planifiant des phases ultérieures de "Refactoring" ou d'optimisation une fois l'infrastructure stabilisée sur la nouvelle plateforme open source. Des technologies comme &lt;strong&gt;KubeVirt&lt;/strong&gt; &lt;sup&gt;48&lt;/sup&gt; sont particulièrement intéressantes dans cette optique, car elles permettent d'adopter une plateforme moderne (Kubernetes) tout en continuant à exécuter les VMs existantes (Replatforming). Cela crée une base solide pour une modernisation progressive, où les VMs peuvent être graduellement refactorisées en conteneurs natifs sur la même plateforme, au rythme de l'entreprise.&lt;sup&gt;61&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Analyse Comparative : Migration vers Virtualisation Open Source vs. Conteneurisation Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le choix de la plateforme cible est une décision stratégique majeure qui conditionne l'ensemble du projet de migration et l'évolution future de l'infrastructure. Deux grandes voies se dessinent : rester dans un paradigme centré sur la VM en adoptant une solution de virtualisation open source, ou basculer vers un paradigme centré sur les conteneurs avec Kubernetes, tout en utilisant KubeVirt pour héberger les VMs existantes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.1. Chemin "Virtualisation Open Source" (Ex: Proxmox, KVM/oVirt, Xen)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette voie consiste à remplacer VMware vSphere/ESXi par un hyperviseur ou une plateforme de virtualisation open source pour continuer à gérer principalement des machines virtuelles.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transition plus familière&lt;/strong&gt; : Le modèle opérationnel reste centré sur la VM, ce qui représente un changement moins radical pour les équipes d'infrastructure habituées à VMware.&lt;sup&gt;5&lt;/sup&gt; La courbe d'apprentissage initiale peut être moins abrupte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance VM éprouvée&lt;/strong&gt; : Les hyperviseurs comme KVM et Xen sont matures et offrent d'excellentes performances pour les workloads virtualisés traditionnels.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coûts potentiellement très bas&lt;/strong&gt; : L'absence de coût de licence pour les solutions de base (KVM, Xen, Proxmox sans support) est un avantage financier majeur.&lt;sup&gt;11&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplicité relative (pour certaines plateformes)&lt;/strong&gt; : Des solutions intégrées comme Proxmox VE offrent une expérience de gestion relativement simple et unifiée.&lt;sup&gt;20&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Moins orienté modernisation applicative&lt;/strong&gt; : Cette approche résout le problème du coût et du verrouillage VMware, mais ne facilite pas intrinsèquement la transition vers des architectures cloud-natives basées sur les microservices et les conteneurs.&lt;sup&gt;6&lt;/sup&gt; Elle peut perpétuer une gestion en silos de l'infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Écosystème d'outils potentiellement fragmenté&lt;/strong&gt; : Pour atteindre un niveau de fonctionnalité équivalent à la suite VMware complète (gestion avancée, SDN, sécurité, automatisation), il faut souvent assembler et intégrer différentes briques open source (ex: KVM + oVirt + Ceph + Ansible + ELK...), ce qui demande de l'expertise et de l'effort.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maturité variable des outils&lt;/strong&gt; : Bien que les hyperviseurs soient matures, certains outils de gestion, de supervision ou de sécurité de l'écosystème open source peuvent être perçus comme moins aboutis ou moins intégrés que leurs équivalents VMware.&lt;sup&gt;5&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Défis de support&lt;/strong&gt; : Reposer sur le support communautaire pour une infrastructure critique peut être risqué.&lt;sup&gt;31&lt;/sup&gt; Le support entreprise est une option mais représente un coût additionnel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6.2. Chemin "Conteneurisation Kubernetes" (Ex: OpenShift, Rancher, K8s + KubeVirt)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cette voie consiste à adopter Kubernetes comme plateforme d'infrastructure unifiée, capable d'orchestrer à la fois les nouvelles applications conteneurisées et les VMs existantes grâce à KubeVirt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Avantages&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alignement stratégique cloud-native&lt;/strong&gt; : Positionne l'infrastructure pour l'avenir, en adoptant les standards de l'industrie pour le déploiement et la gestion d'applications modernes (microservices, serverless) et en facilitant les pratiques DevOps.&lt;sup&gt;6&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plateforme unifiée VM/Conteneurs&lt;/strong&gt; : KubeVirt permet de gérer les VMs et les conteneurs avec les mêmes outils, les mêmes API (Kubernetes) et sur la même infrastructure physique, réduisant la complexité et les silos.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modernisation progressive&lt;/strong&gt; : Facilite un parcours où les applications peuvent être migrées en tant que VMs sur KubeVirt (Replatforming), puis progressivement refactorisées en conteneurs natifs sur la même plateforme lorsque cela fait sens.&lt;sup&gt;54&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Richesse de l'écosystème Kubernetes&lt;/strong&gt; : Bénéficie de l'immense écosystème d'outils open source pour l'observabilité (Prometheus/Grafana), la sécurité (Falco, OPA), le réseau (CNI), le stockage (CSI), le service mesh (Istio), etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalabilité et résilience natives&lt;/strong&gt; : Kubernetes est conçu dès le départ pour l'auto-réparation, le scaling horizontal et la gestion déclarative de l'état désiré.&lt;sup&gt;54&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potentiel d'optimisation des ressources&lt;/strong&gt; : La gestion unifiée et la nature potentiellement plus légère des conteneurs (et de KubeVirt par rapport à une pile VM complète) peuvent conduire à une meilleure densité et utilisation du matériel.&lt;sup&gt;61&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexité et courbe d'apprentissage&lt;/strong&gt; : Kubernetes est une plateforme complexe avec de nombreux concepts à maîtriser. La courbe d'apprentissage pour les équipes (infrastructure et développement) est significativement plus raide que pour la virtualisation traditionnelle.&lt;sup&gt;6&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nouveauté relative de KubeVirt&lt;/strong&gt; : Bien que basé sur KVM, KubeVirt est une technologie plus jeune que les hyperviseurs établis. Des défis de performance, de stabilité ou de manque de fonctionnalités spécifiques peuvent exister pour certains workloads VM très exigeants ou particuliers.&lt;sup&gt;59&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coût des plateformes managées&lt;/strong&gt; : Utiliser une distribution Kubernetes entreprise comme OpenShift pour simplifier la gestion et obtenir du support représente un coût de souscription potentiellement élevé.&lt;sup&gt;42&lt;/sup&gt; Gérer K8s vanilla + KubeVirt en mode DIY est moins cher en licence mais maximise la complexité opérationnelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nécessité d'une transformation des processus&lt;/strong&gt; : Adopter Kubernetes efficacement implique souvent une refonte des processus de déploiement (vers CI/CD), de gestion de la configuration (vers GitOps/IaC) et une collaboration plus étroite entre les équipes (DevOps).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;6.3. Facteurs de Décision&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le choix entre ces deux voies dépendra d'une analyse approfondie de plusieurs facteurs propres à chaque organisation :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Maturité et Nature des Applications&lt;/strong&gt; : Un parc applicatif majoritairement composé d'applications legacy stables et peu évolutives pourrait pencher vers la virtualisation open source. À l'inverse, une entreprise avec de nombreux développements en cours ou prévus, visant des architectures microservices, sera naturellement attirée par Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectifs Stratégiques Prioritaires&lt;/strong&gt; : Si l'objectif premier est une réduction rapide des coûts de licence VMware avec un minimum de perturbations, la virtualisation open source peut être la voie la plus directe. Si l'objectif est une transformation à plus long terme vers l'agilité, le cloud-native et une plateforme unifiée, Kubernetes/KubeVirt est une option plus stratégique.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compétences Internes et Culture d'Entreprise&lt;/strong&gt; : L'existence (ou la volonté d'acquérir) des compétences pointues en Linux, KVM, et surtout Kubernetes/conteneurs est déterminante. La capacité de l'organisation à adopter de nouveaux outils, de nouveaux processus (DevOps, IaC) et à favoriser la collaboration entre équipes jouera un rôle crucial.&lt;sup&gt;54&lt;/sup&gt; Une culture réfractaire au changement pourrait rendre l'adoption de Kubernetes très difficile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horizon Temporel et Budget&lt;/strong&gt; : La virtualisation open source peut offrir des gains plus rapides avec un investissement initial potentiellement moindre (surtout en DIY). Kubernetes/KubeVirt représente un investissement initial plus important (en formation, outils, potentiellement licences de distribution) mais promet des bénéfices stratégiques à plus long terme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En synthèse, le choix n'est pas purement technique mais profondément stratégique. La migration vers la &lt;strong&gt;virtualisation open source&lt;/strong&gt; peut être vue comme une &lt;strong&gt;étape tactique&lt;/strong&gt;, répondant au besoin immédiat de réduire les coûts et la dépendance à VMware, tout en conservant un paradigme opérationnel relativement familier. La migration vers &lt;strong&gt;Kubernetes/KubeVirt&lt;/strong&gt; est une &lt;strong&gt;décision plus stratégique et transformatrice&lt;/strong&gt;, visant une modernisation en profondeur de l'infrastructure et des applications, mais exigeant un investissement initial plus conséquent en termes de complexité, de coût et de changement organisationnel.&lt;sup&gt;6&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. Outils de Migration Spécifiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La réussite technique d'une migration dépend en grande partie du choix et de la maîtrise des outils appropriés pour déplacer les machines virtuelles et leurs données de l'environnement source vers l'environnement cible. Il n'existe pas d'outil universel ; le choix dépendra fortement de la plateforme cible (KVM, Proxmox, OpenStack, Kubernetes/KubeVirt) et de la stratégie de migration adoptée (Lift &amp;amp; Shift, Replatform).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.1. Outils de Migration VM-vers-VM (vers KVM/Proxmox/oVirt/OpenStack)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces outils sont conçus pour migrer des VMs VMware vers d'autres plateformes de virtualisation classiques.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;virt-v2v&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Outil open source en ligne de commande, généralement inclus dans les distributions Linux basées sur Red Hat (RHEL, CentOS, Fedora), mais installable sur d'autres. Il est conçu pour convertir des VMs depuis VMware ESXi (via connexion directe ou vCenter), Xen, ou Hyper-V vers un format compatible KVM (géré par libvirt), oVirt, OpenStack ou RHV.&lt;sup&gt;63&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fonctionnement&lt;/em&gt; : virt-v2v se connecte à l'hyperviseur source, inspecte la VM, copie les disques en les convertissant au format désiré (qcow2, raw...), crée un fichier de définition XML pour libvirt, et tente d'installer les pilotes VirtIO nécessaires dans l'OS invité pendant le processus.&lt;sup&gt;68&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Utilisation&lt;/em&gt; : Nécessite que la VM source soit arrêtée.&lt;sup&gt;69&lt;/sup&gt; La commande spécifie la source (ex: -ic vpx://... pour vCenter, -ic esx://... pour ESXi), le nom de la VM, et la destination (ex: -o libvirt pour une importation directe dans libvirt local, -o local -os /chemin pour exporter les fichiers, -o openstack pour OpenStack).&lt;sup&gt;68&lt;/sup&gt; Des options permettent de gérer l'authentification et la vérification des certificats.&lt;sup&gt;69&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Limitations&lt;/em&gt; : Le support des OS invités est spécifique et documenté (principalement RHEL, Windows, SLES).&lt;sup&gt;63&lt;/sup&gt; Des problèmes peuvent survenir avec certaines configurations UEFI ou des systèmes de fichiers spécifiques.&lt;sup&gt;63&lt;/sup&gt; Des ajustements manuels post-migration (configuration réseau notamment) sont souvent nécessaires.&lt;sup&gt;63&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Importateur Intégré Proxmox VE (&amp;gt;= 8.2)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Fonctionnalité intégrée à l'interface web de Proxmox VE (depuis la version 8.2) permettant d'importer directement des VMs depuis des hôtes VMware ESXi (versions 6.5 à 8.0) ou vCenter.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fonctionnement&lt;/em&gt; : L'administrateur ajoute d'abord l'hôte ESXi ou vCenter comme une source de "stockage" dans Proxmox. Ensuite, un assistant d'importation permet de parcourir les VMs sur la source, de sélectionner celles à migrer, et de configurer les paramètres de la VM cible sur Proxmox (nœud, stockage de destination, format de disque - qcow2 ou raw recommandé, réseau, etc.). L'outil gère la copie et la conversion des disques.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Utilisation&lt;/em&gt; : Nécessite un accès SSH à l'hôte ESXi source. Il est recommandé d'arrêter la VM source, bien qu'une migration "live" soit possible (mais plus lente et potentiellement plus risquée). Les snapshots sur la VM source doivent être supprimés. L'import depuis des datastores vSAN n'est pas supporté.&lt;sup&gt;65&lt;/sup&gt; Il est crucial d'avoir préalablement désinstallé les VMware Tools et installé les pilotes VirtIO sur la VM source (surtout pour Windows) pour assurer un démarrage et des performances correctes après migration.&lt;sup&gt;65&lt;/sup&gt; Des ajustements post-migration (attacher le disque au contrôleur VirtIO SCSI, vérifier l'ordre de boot) sont souvent nécessaires.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OVF (Open Virtualization Format)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Standard industriel pour l'empaquetage et la distribution de machines virtuelles. Une VM exportée en OVF comprend un fichier descripteur (.ovf, en XML), les fichiers de disques virtuels (.vmdk dans le cas de VMware), et éventuellement un fichier manifeste (.mf).&lt;sup&gt;70&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Utilisation&lt;/em&gt; : Exporter la VM depuis VMware vSphere Client ou vCenter au format OVF.&lt;sup&gt;70&lt;/sup&gt; Transférer les fichiers générés vers la plateforme cible. Utiliser l'outil d'importation OVF de la plateforme cible (ex: la commande qm importovf &amp;lt;vmid&amp;gt; &amp;lt;fichier.ovf&amp;gt; &amp;lt;stockage_cible&amp;gt; dans Proxmox &lt;sup&gt;65&lt;/sup&gt;). L'outil VMware OVF Tool peut également être utilisé pour faciliter l'export, l'import et la conversion.&lt;sup&gt;70&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avantages/Inconvénients&lt;/em&gt; : Méthode standardisée mais souvent très manuelle, nécessitant des transferts de fichiers volumineux et des ajustements post-importation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversion Manuelle de Disques + Recréation VM&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Approche la plus basique, impliquant de copier manuellement les fichiers de disque .vmdk (et *-flat.vmdk) depuis le datastore VMware vers un stockage accessible par la plateforme cible.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Utilisation&lt;/em&gt; : Utiliser des outils comme scp ou un client SFTP (WinSCP) pour copier les fichiers.&lt;sup&gt;65&lt;/sup&gt; Utiliser l'outil qemu-img sur l'hôte cible pour convertir le format de disque (ex: qemu-img convert -f vmdk -O qcow2 vmware_disk.vmdk proxmox_disk.qcow2).&lt;sup&gt;67&lt;/sup&gt; Créer une nouvelle VM sur la plateforme cible avec une configuration matérielle similaire (CPU, RAM), puis attacher le disque nouvellement converti.&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avantages/Inconvénients&lt;/em&gt; : Offre un contrôle total mais est très laborieux, lent, et sujet aux erreurs. Nécessite des étapes de configuration post-création importantes (installation des pilotes, configuration réseau, ajustement du bootloader/fstab).&lt;sup&gt;71&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outils de Sauvegarde/Restauration Tiers&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Les solutions de sauvegarde d'entreprise qui supportent à la fois VMware comme source et la plateforme open source cible (Proxmox, KVM via RHV/oVirt, Nutanix AHV...) peuvent être utilisées pour effectuer une migration V2V (Virtual-to-Virtual).&lt;sup&gt;19&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Utilisation&lt;/em&gt; : Sauvegarder la VM sur l'environnement VMware. Effectuer une restauration de cette sauvegarde en choisissant la plateforme open source comme destination. L'outil de sauvegarde gère la conversion et la création de la VM sur la cible.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Exemples&lt;/em&gt; : Veeam (support Proxmox annoncé &lt;sup&gt;19&lt;/sup&gt;), Vinchin Backup &amp;amp; Recovery (supporte VMware, Proxmox, oVirt, OpenStack, XenServer...) &lt;sup&gt;68&lt;/sup&gt;, Commvault &lt;sup&gt;19&lt;/sup&gt;, Rubrik &lt;sup&gt;30&lt;/sup&gt;, Cohesity.&lt;sup&gt;30&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avantages/Inconvénients&lt;/em&gt; : Peut potentiellement simplifier et accélérer le processus via une interface unifiée, et offrir des options de restauration rapide (Instant VM Recovery) minimisant le downtime. Dépend fortement des capacités et des licences de l'outil de sauvegarde.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;7.2. Outils de Migration vers Kubernetes/Conteneurs (incl. KubeVirt)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces outils visent à faciliter le déplacement de VMs ou d'applications vers un environnement Kubernetes, potentiellement en utilisant KubeVirt pour les VMs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Red Hat Migration Toolkit for Virtualization (MTV)&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Composant intégré à la plateforme Red Hat OpenShift, conçu spécifiquement pour migrer des machines virtuelles depuis diverses sources (VMware vSphere étant une source majeure) vers OpenShift Virtualization (qui utilise KubeVirt).&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Fonctionnement&lt;/em&gt; : Fournit une interface utilisateur dans la console OpenShift pour définir des fournisseurs source (ex: vCenter), créer des plans de migration spécifiant les VMs à migrer, et mapper les réseaux et les stockages entre l'environnement source et la configuration cible OpenShift (NetworkAttachmentDefinitions, StorageClasses). L'outil orchestre ensuite la copie des données et la création des objets KubeVirt (VirtualMachine, VirtualMachineInstance) correspondants dans OpenShift.&lt;sup&gt;57&lt;/sup&gt; Il supporte la migration à froid (cold migration).&lt;sup&gt;57&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Avantages&lt;/em&gt; : Solution intégrée et supportée dans l'écosystème OpenShift, simplifie un processus autrement complexe.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Konveyor&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Description&lt;/em&gt; : Communauté open source (soutenue notamment par Red Hat) dont l'objectif est de développer des outils et des bonnes pratiques pour aider à la modernisation et à la migration d'applications vers Kubernetes et le cloud hybride.&lt;sup&gt;73&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Outils Pertinents&lt;/em&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Crane&lt;/strong&gt; (anciennement Migration Toolkit for Containers - MTC) : Outil principal pour migrer des applications (stateful ou stateless) &lt;strong&gt;entre différents clusters Kubernetes&lt;/strong&gt; (ex: d'un ancien cluster OpenShift 3 vers un nouveau cluster OpenShift 4/moderne).&lt;sup&gt;73&lt;/sup&gt; Il peut utiliser différentes méthodes de copie, y compris rsync pour une migration directe si une connectivité réseau existe, ou passer par un stockage objet intermédiaire.&lt;sup&gt;73&lt;/sup&gt; &lt;em&gt;Moins pertinent pour une migration VMware vers K8s initiale, mais utile pour les migrations K8s-vers-K8s ultérieures.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Move2Kube&lt;/strong&gt; : Outil en ligne de commande qui vise à accélérer le &lt;strong&gt;re-platforming&lt;/strong&gt; d'applications (depuis des VMs ou d'autres sources) vers Kubernetes en générant automatiquement des artefacts de déploiement K8s (manifestes YAML, Dockerfiles, etc.).&lt;sup&gt;73&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pathfinder&lt;/strong&gt; : Outil d'évaluation qui analyse un portefeuille d'applications pour déterminer leur &lt;strong&gt;aptitude à la conteneurisation&lt;/strong&gt; et suggérer des stratégies de migration.&lt;sup&gt;73&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tackle/Windup&lt;/strong&gt; : Outil plus spécifique pour analyser des applications Java en vue de leur modernisation et migration.&lt;sup&gt;73&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Positionnement&lt;/em&gt; : Konveyor semble s'être &lt;strong&gt;recentré sur les aspects applicatifs&lt;/strong&gt; de la modernisation (Replatforming, Refactoring) plutôt que sur la migration d'infrastructure VM-vers-KubeVirt directe.&lt;sup&gt;72&lt;/sup&gt; Ses outils sont donc complémentaires aux outils de migration de VMs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plateformes Managées/Commerciales avec support KubeVirt&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Platform9&lt;/em&gt; : Propose une plateforme Kubernetes managée qui intègre KubeVirt et offre explicitement des services pour aider à la migration depuis VMware, en mettant en avant une réduction du TCO.&lt;sup&gt;61&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Spectro Cloud Palette&lt;/em&gt; : Plateforme de gestion de clusters Kubernetes qui supporte le déploiement et la gestion de KubeVirt, potentiellement avec des fonctionnalités pour faciliter l'intégration de VMs.&lt;sup&gt;37&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;7.3. Outils d'Automatisation (Supportant la Migration)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ces outils ne sont pas spécifiques à la migration mais peuvent grandement faciliter et sécuriser le processus en automatisant des tâches répétitives.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ansible Automation Platform&lt;/strong&gt; : Outil d'automatisation basé sur des playbooks YAML, très utilisé pour la configuration post-migration (installation de logiciels, configuration système), le déploiement d'infrastructure, et l'orchestration de tâches complexes sur les systèmes cibles (Linux, Windows).&lt;sup&gt;1&lt;/sup&gt; Red Hat l'intègre fortement dans ses solutions de migration et de gestion.&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terraform&lt;/strong&gt; : Outil d'Infrastructure as Code (IaC) permettant de définir et de provisionner l'infrastructure cible (réseau, stockage, instances K8s, VMs sur certaines plateformes) de manière déclarative et reproductible.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'analyse des outils disponibles montre clairement qu'il n'y a pas de solution unique pour tous les scénarios de migration. Le choix de l'outil est intrinsèquement lié à la &lt;strong&gt;plateforme cible&lt;/strong&gt; (on n'utilisera pas les mêmes outils pour migrer vers Proxmox ou vers OpenShift Virtualization) et à la &lt;strong&gt;stratégie de migration&lt;/strong&gt; retenue (un Lift &amp;amp; Shift VM-à-VM utilisera des outils différents d'un Replatforming vers KubeVirt).&lt;/p&gt;
&lt;p&gt;De plus, on observe que le domaine de la migration &lt;strong&gt;VM-vers-KubeVirt&lt;/strong&gt; est un domaine où l'outillage est &lt;strong&gt;moins standardisé et potentiellement moins mature&lt;/strong&gt; que pour les migrations VM-à-VM traditionnelles. Des solutions intégrées comme MTV de Red Hat &lt;sup&gt;51&lt;/sup&gt; ou des offres managées comme Platform9 &lt;sup&gt;61&lt;/sup&gt; existent pour simplifier ce processus dans des contextes spécifiques (OpenShift ou plateforme managée). Cependant, réaliser une migration "DIY" vers KubeVirt sur un cluster Kubernetes vanilla nécessitera probablement une combinaison d'outils de conversion de disque (comme qemu-img), de scripting pour générer les manifestes KubeVirt, et une expertise Kubernetes/KubeVirt plus approfondie que pour utiliser un outil comme virt-v2v ou l'importateur Proxmox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. Retours d'Expérience, Études de Cas et Bonnes Pratiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'analyse des retours d'expérience et des cas concrets de migration permet de mieux appréhender la réalité du terrain, les bénéfices obtenus et les écueils à éviter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.1. Exemples de Migration vers Proxmox VE&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs organisations de tailles et de secteurs variés ont documenté leur passage de VMware (ou d'autres solutions comme XenServer) à Proxmox VE.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Motivations Récurrentes&lt;/strong&gt; : La &lt;strong&gt;réduction des coûts&lt;/strong&gt; (liée au modèle open source sans licence) et la volonté de s'affranchir du verrouillage fournisseur sont des moteurs fréquents.&lt;sup&gt;33&lt;/sup&gt; La recherche de &lt;strong&gt;flexibilité&lt;/strong&gt; &lt;sup&gt;34&lt;/sup&gt;, de &lt;strong&gt;simplicité d'utilisation&lt;/strong&gt; &lt;sup&gt;33&lt;/sup&gt; et le &lt;strong&gt;support de l'open source&lt;/strong&gt; &lt;sup&gt;33&lt;/sup&gt; sont également cités.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profils d'Organisations&lt;/strong&gt; : On trouve des exemples dans l'&lt;strong&gt;éducation&lt;/strong&gt; (collèges techniques comme HTL Leonding, universités comme Sigmund Freud Univ. ou Univ. de Macau &lt;sup&gt;33&lt;/sup&gt;), les &lt;strong&gt;PME&lt;/strong&gt;, les &lt;strong&gt;fournisseurs de services Internet ou d'hébergement&lt;/strong&gt; (IGNUM, EdgeUno &lt;sup&gt;33&lt;/sup&gt;), le &lt;strong&gt;secteur public/santé&lt;/strong&gt; (Assurance Maladie française pour Proxmox Mail Gateway, projet de base de données pour la santé publique au Brésil &lt;sup&gt;33&lt;/sup&gt;), des &lt;strong&gt;entreprises technologiques&lt;/strong&gt; (Textkernel - IA pour RH, ESTECO - logiciels d'ingénierie &lt;sup&gt;33&lt;/sup&gt;), des &lt;strong&gt;fondations&lt;/strong&gt; (Cyber-Complex &lt;sup&gt;33&lt;/sup&gt;) et même des &lt;strong&gt;lieux culturels&lt;/strong&gt; (Odéon-Théâtre de l'Europe &lt;sup&gt;33&lt;/sup&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bénéfices Observés&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Économies substantielles&lt;/strong&gt; sur les coûts de licence (un cas mentionne 60% de réduction &lt;sup&gt;34&lt;/sup&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amélioration des performances&lt;/strong&gt;.&lt;sup&gt;34&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibilité accrue&lt;/strong&gt; pour adapter l'infrastructure et tester de nouvelles configurations.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplification de la gestion&lt;/strong&gt; de l'infrastructure grâce à l'interface centralisée.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gain de temps&lt;/strong&gt; pour les équipes d'administration.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalabilité et fiabilité&lt;/strong&gt; améliorées, notamment en utilisant les fonctionnalités de clustering HA et le stockage Ceph.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Démarche de Migration&lt;/strong&gt; : Une approche &lt;strong&gt;graduelle&lt;/strong&gt; est souvent privilégiée &lt;sup&gt;34&lt;/sup&gt;, précédée d'une phase d'&lt;strong&gt;évaluation des besoins&lt;/strong&gt; et de &lt;strong&gt;planification&lt;/strong&gt;.&lt;sup&gt;34&lt;/sup&gt; L'utilisation des fonctionnalités natives de Proxmox (HA, Ceph) est fréquente pour construire une infrastructure résiliente.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Appréciations Qualitatives&lt;/strong&gt; : Les témoignages sont généralement positifs, qualifiant Proxmox VE de "phénoménal" &lt;sup&gt;33&lt;/sup&gt;, de "meilleur moyen de simplifier l'infrastructure IT" &lt;sup&gt;33&lt;/sup&gt;, ou soulignant la réduction des heures de travail.&lt;sup&gt;33&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;8.2. Exemples de Migration vers OpenShift Virtualization / KubeVirt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les retours d'expérience sur la migration vers KubeVirt (souvent via OpenShift Virtualization) sont peut-être moins nombreux ou moins détaillés publiquement, mais certains points émergent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Motivations Principales&lt;/strong&gt; : Recherche d'une &lt;strong&gt;alternative aux hyperviseurs traditionnels&lt;/strong&gt; dans un contexte de modernisation, volonté de &lt;strong&gt;consolider la gestion des VMs et des conteneurs&lt;/strong&gt; sur une plateforme unique.&lt;sup&gt;16&lt;/sup&gt; Faciliter la migration de workloads legacy vers une plateforme cloud-native sans réécriture immédiate.&lt;sup&gt;55&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profils d'Organisations&lt;/strong&gt; : Principalement des &lt;strong&gt;entreprises&lt;/strong&gt; cherchant à moderniser leur infrastructure et à adopter Kubernetes de manière plus large, tout en gérant leur parc de VMs existant.&lt;sup&gt;37&lt;/sup&gt; Un cas cité est celui de Reist Telecom AG.&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bénéfices Observés&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gestion unifiée&lt;/strong&gt; des VMs et des conteneurs via les outils et API Kubernetes/OpenShift.&lt;sup&gt;49&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processus de migration simplifié&lt;/strong&gt; depuis VMware grâce à des outils dédiés comme le Migration Toolkit for Virtualization (MTV).&lt;sup&gt;57&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potentiel de réduction du TCO&lt;/strong&gt; et d'&lt;strong&gt;augmentation de la densité&lt;/strong&gt; des workloads par rapport à des silos séparés VM et conteneurs.&lt;sup&gt;61&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibilité&lt;/strong&gt; pour moderniser les applications au rythme de l'entreprise.&lt;sup&gt;16&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bonnes performances&lt;/strong&gt; lors des migrations à chaud de VMs avec stockage performant, minimisant l'impact sur les IOs.&lt;sup&gt;56&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Démarche de Migration&lt;/strong&gt; : L'utilisation de MTV pour orchestrer la migration depuis VMware vers OpenShift est une approche documentée.&lt;sup&gt;57&lt;/sup&gt; Le processus implique la création d'objets KubeVirt (VM/VMI) et le mapping des ressources réseau et stockage.&lt;sup&gt;56&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L'analyse croisée de ces retours suggère que &lt;strong&gt;Proxmox VE&lt;/strong&gt; s'est solidement établi comme une &lt;strong&gt;alternative crédible et performante à VMware&lt;/strong&gt;, particulièrement appréciée pour sa &lt;strong&gt;simplicité, sa flexibilité et son modèle économique avantageux&lt;/strong&gt; dans des contextes variés allant de la PME à certains déploiements d'entreprise ou sectoriels (éducation, public). &lt;strong&gt;OpenShift Virtualization / KubeVirt&lt;/strong&gt; apparaît comme une &lt;strong&gt;solution plus stratégique&lt;/strong&gt;, visant les entreprises qui s'engagent dans une &lt;strong&gt;modernisation profonde vers le cloud-native et Kubernetes&lt;/strong&gt;, et qui cherchent une &lt;strong&gt;plateforme unifiée&lt;/strong&gt; pour gérer un parc applicatif mixte (VMs et conteneurs). Le choix de l'une ou l'autre voie semble donc dépendre fortement des objectifs à long terme et du contexte spécifique de l'organisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.3. Leçons Apprises et Bonnes Pratiques (Synthèse)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Des migrations réussies (et des échecs évités) se dégagent plusieurs bonnes pratiques transversales :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La Planification est Reine&lt;/strong&gt; : Ne jamais sous-estimer la phase amont. Réaliser un audit détaillé de l'environnement source, comprendre les dépendances applicatives et réseau, définir des objectifs clairs et mesurables, et choisir la stratégie (Lift&amp;amp;Shift, Replatform, Refactor) et l'approche (Big Bang, Phased) les plus adaptées.&lt;sup&gt;1&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tester, Tester et Encore Tester&lt;/strong&gt; : Les Proofs of Concept (PoC) et les migrations pilotes sur des workloads non critiques sont indispensables pour valider la plateforme cible, les outils de migration, les procédures, estimer les performances et identifier les problèmes potentiels avant de passer à l'échelle.&lt;sup&gt;62&lt;/sup&gt; Tester spécifiquement la compatibilité OS et applicative.&lt;sup&gt;64&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Préparer Méticuleusement les VMs Sources&lt;/strong&gt; : Avant la migration, "nettoyer" les VMs sources : désinstaller les agents et outils spécifiques à VMware (VMware Tools) &lt;sup&gt;64&lt;/sup&gt;, installer les pilotes paravirtualisés de la plateforme cible (VirtIO pour KVM/Proxmox) si possible &lt;sup&gt;64&lt;/sup&gt;, et supprimer les snapshots de la VM qui peuvent compliquer ou ralentir la migration [&lt;sup&gt;65&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Sources des citations&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;Move From VMware : Libérez votre infrastructure de VMware - Alter Way, consulté le avril 22, 2025, &lt;a href="https://www.alterway.fr/movefromvmware-liberez-votre-infrastructure-de-vmware/"&gt;https://www.alterway.fr/movefromvmware-liberez-votre-infrastructure-de-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Broadcom's Acquisition of VMware: Impact on Businesses ..., consulté le avril 22, 2025, &lt;a href="https://www.rutter-net.com/blog/broadcoms-acquisition-of-vmware"&gt;https://www.rutter-net.com/blog/broadcoms-acquisition-of-vmware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Broadcom's VMware Acquisition: What It Means for Avi Networks Customers - Radware, consulté le avril 22, 2025, &lt;a href="https://www.radware.com/blog/applicationdelivery/broadcom-s-vmware-acquisition/"&gt;https://www.radware.com/blog/applicationdelivery/broadcom-s-vmware-acquisition/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Broadcom VMware Alternative: Partners See 'Massive' Opportunity For HPE VM Essentials - CRN, consulté le avril 22, 2025, &lt;a href="https://www.crn.com/news/virtualization/2025/a-broadcom-vmware-alternative-partners-see-massive-opportunity-for-hpe-vm-essentials"&gt;https://www.crn.com/news/virtualization/2025/a-broadcom-vmware-alternative-partners-see-massive-opportunity-for-hpe-vm-essentials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quelles alternatives open source à VMware? — abilian.com, consulté le avril 22, 2025, &lt;a href="https://abilian.com/fr/news/alternatives-open-source-a-vmware/"&gt;https://abilian.com/fr/news/alternatives-open-source-a-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Quelles stratégies et solutions alternatives à VMWare envisager - Inside Group, consulté le avril 22, 2025, &lt;a href="https://insidegroup.fr/actualites/strategie-vmware/"&gt;https://insidegroup.fr/actualites/strategie-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware Alternatives for Business: Exploring the Best Options - Otava, consulté le avril 22, 2025, &lt;a href="https://www.otava.com/blog/vmware-alternatives-for-business-exploring-the-best-options/"&gt;https://www.otava.com/blog/vmware-alternatives-for-business-exploring-the-best-options/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Top VMware Alternatives in 2025 &amp;amp; How to Migrate Easily - Hystax, consulté le avril 22, 2025, &lt;a href="https://hystax.com/vmware-alternatives-migration-2025/"&gt;https://hystax.com/vmware-alternatives-migration-2025/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Migrating from VMware to Open Source - Ubuntu, consulté le avril 22, 2025, &lt;a href="https://ubuntu.com/engage/vmware-migration-to-open-source"&gt;https://ubuntu.com/engage/vmware-migration-to-open-source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How the Broadcom VMware Acquisition of VMware is Affecting Longtime Customers, consulté le avril 22, 2025, &lt;a href="https://blog.clearscale.com/how-the-broadcom-vmware-acquisition-of-vmware-is-affecting-longtime-customers/"&gt;https://blog.clearscale.com/how-the-broadcom-vmware-acquisition-of-vmware-is-affecting-longtime-customers/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Alternatives to VMware: The Benefits of Open Source - Enix.io, consulté le avril 22, 2025, &lt;a href="https://enix.io/en/blog/vmware-alternatives/"&gt;https://enix.io/en/blog/vmware-alternatives/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Top 5 Open Source Alternatives to VMware ESXi for SMBs | Pogo Tech Blog, consulté le avril 22, 2025, &lt;a href="https://www.pogolinux.com/blog/top-5-open-source-alternatives-vmware-esxi-smb/"&gt;https://www.pogolinux.com/blog/top-5-open-source-alternatives-vmware-esxi-smb/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Xen vs. KVM - Comparison of Hypervisors | Storware BLOG, consulté le avril 22, 2025, &lt;a href="https://storware.eu/blog/xen-vs-kvm-comparison-of-hypervisors/"&gt;https://storware.eu/blog/xen-vs-kvm-comparison-of-hypervisors/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Choisir la bonne plateforme de virtualisation : Proxmox vs. KVM expliqué - Bacula Systems, consulté le avril 22, 2025, &lt;a href="https://www.baculasystems.com/fr/blog-fr/proxmox-vs-kvm/"&gt;https://www.baculasystems.com/fr/blog-fr/proxmox-vs-kvm/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KVM vs. VMware: Choosing the Right Hypervisor for Your Needs - Lightbits Labs, consulté le avril 22, 2025, &lt;a href="https://www.lightbitslabs.com/blog/kvmvsvmware/"&gt;https://www.lightbitslabs.com/blog/kvmvsvmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KVM ou VMware : quel hyperviseur choisir ? - Red Hat, consulté le avril 22, 2025, &lt;a href="https://www.redhat.com/fr/topics/virtualization/kvm-vs-vmware-comparison"&gt;https://www.redhat.com/fr/topics/virtualization/kvm-vs-vmware-comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KVM vs Proxmox VE vs VMware vSphere comparison - PeerSpot, consulté le avril 22, 2025, &lt;a href="https://www.peerspot.com/products/comparisons/kvm_vs_proxmox-ve_vs_vmware-vsphere"&gt;https://www.peerspot.com/products/comparisons/kvm_vs_proxmox-ve_vs_vmware-vsphere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware Player 4.0 vs. KVM Linux Virtualization - OpenBenchmarking.org, consulté le avril 22, 2025, &lt;a href="https://openbenchmarking.org/result/1112124-AR-KVMLINUX286&amp;amp;grs&amp;amp;export=pdf"&gt;https://openbenchmarking.org/result/1112124-AR-KVMLINUX286&amp;amp;grs&amp;amp;export=pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox vs VMware: which virtualisation solution should you choose?, consulté le avril 22, 2025, &lt;a href="https://www.1300nerdcore.com.au/post/proxmox-vs-vmware-which-virtualisation-solution-should-you-choose"&gt;https://www.1300nerdcore.com.au/post/proxmox-vs-vmware-which-virtualisation-solution-should-you-choose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox vs VMware: comparing virtualisation solutions - Qim info, consulté le avril 22, 2025, &lt;a href="https://www.qiminfo.ch/en/proxmox-vs-vmware-which-virtualisation-solution-should-you-choose/"&gt;https://www.qiminfo.ch/en/proxmox-vs-vmware-which-virtualisation-solution-should-you-choose/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;9 VMware Alternatives To Consider In 2025 - CloudZero, consulté le avril 22, 2025, &lt;a href="https://www.cloudzero.com/blog/vmware-alternatives/"&gt;https://www.cloudzero.com/blog/vmware-alternatives/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Explore the VMware Alternatives for Your Virtualization Needs, consulté le avril 22, 2025, &lt;a href="https://globalcybersecuritynetwork.com/blog/explore-the-vmware-alternatives-for-your-virtualization-needs/"&gt;https://globalcybersecuritynetwork.com/blog/explore-the-vmware-alternatives-for-your-virtualization-needs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Top 9 VMware ESXi Alternatives for Server Virtualization 2024 | Vinchin Backup, consulté le avril 22, 2025, &lt;a href="https://www.vinchin.com/vm-tips/vmware-esxi-alternatives.html"&gt;https://www.vinchin.com/vm-tips/vmware-esxi-alternatives.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox VMware: What's Right for You? - Cloudzy, consulté le avril 22, 2025, &lt;a href="https://cloudzy.com/blog/proxmox-vs-vmware/"&gt;https://cloudzy.com/blog/proxmox-vs-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Best VMware alternatives to explore in 2025 - GroWrk, consulté le avril 22, 2025, &lt;a href="https://growrk.com/blog/vmware-alternatives"&gt;https://growrk.com/blog/vmware-alternatives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Looking for Vmware Alternatives? Here Are 7 Alternatives To Consider! - Workwize, consulté le avril 22, 2025, &lt;a href="https://www.goworkwize.com/blog/vmware-alternatives"&gt;https://www.goworkwize.com/blog/vmware-alternatives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Comparison - Proxmox VE vs vSphere, Hyper-V, Xen..., consulté le avril 22, 2025, &lt;a href="https://www.proxmox.com/en/products/proxmox-virtual-environment/comparison"&gt;https://www.proxmox.com/en/products/proxmox-virtual-environment/comparison&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox vs VMware vs Hyper-V: The Ultimate 2024 Showdown - Amaze, consulté le avril 22, 2025, &lt;a href="https://www.amaze.au/proxmox-vs-vmware-vs-hyper-v-the-ultimate-2024-showdown/"&gt;https://www.amaze.au/proxmox-vs-vmware-vs-hyper-v-the-ultimate-2024-showdown/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox vs VMware - Comparison | Storware BLOG, consulté le avril 22, 2025, &lt;a href="https://storware.eu/blog/proxmox-vs-vmware-comparison/"&gt;https://storware.eu/blog/proxmox-vs-vmware-comparison/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Broadcom\VMware alternative s? : r/sysadmin - Reddit, consulté le avril 22, 2025, &lt;a href="https://www.reddit.com/r/sysadmin/comments/1k2kfjn/broadcomvmware_alternative_s/"&gt;https://www.reddit.com/r/sysadmin/comments/1k2kfjn/broadcomvmware_alternative_s/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Proxmox vs VMware: What Are the Main Security Differences? | Siberoloji, consulté le avril 22, 2025, &lt;a href="https://www.siberoloji.com/proxmox-vs-vmware-what-are-the-main-security-differences/"&gt;https://www.siberoloji.com/proxmox-vs-vmware-what-are-the-main-security-differences/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cost VMware standard vs Promox : r/Proxmox - Reddit, consulté le avril 22, 2025, &lt;a href="https://www.reddit.com/r/Proxmox/comments/1b19539/cost_vmware_standard_vs_promox/"&gt;https://www.reddit.com/r/Proxmox/comments/1b19539/cost_vmware_standard_vs_promox/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Success Stories from Proxmox customers &amp;amp; users, consulté le avril 22, 2025, &lt;a href="https://www.proxmox.com/en/about/about-us/stories"&gt;https://www.proxmox.com/en/about/about-us/stories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Comparative Analysis Between Proxmox and VMware - X5 Servers, consulté le avril 22, 2025, &lt;a href="https://x5servers.com/en/Comparative-analysis-between-Proxmox-and-VMware/"&gt;https://x5servers.com/en/Comparative-analysis-between-Proxmox-and-VMware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Did anyone regret a switch from VMWare to ProxMox? : r/sysadmin - Reddit, consulté le avril 22, 2025, &lt;a href="https://www.reddit.com/r/sysadmin/comments/1jtxhx8/did_anyone_regret_a_switch_from_vmware_to_proxmox/"&gt;https://www.reddit.com/r/sysadmin/comments/1jtxhx8/did_anyone_regret_a_switch_from_vmware_to_proxmox/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Navigating New Horizons: Thinfinity® Workspace as a Strategic VMware Alternative, consulté le avril 22, 2025, &lt;a href="https://blog.cybelesoft.com/alternatives-to-vmware-post-broadcom/"&gt;https://blog.cybelesoft.com/alternatives-to-vmware-post-broadcom/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Top 5 Kubernetes-Based Alternatives to VMware - Portworx, consulté le avril 22, 2025, &lt;a href="https://portworx.com/blog/top-5-kubernetes-based-alternatives-to-vmware/"&gt;https://portworx.com/blog/top-5-kubernetes-based-alternatives-to-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SUSE Harvester and Rancher Solutions on ThinkSystem V3 Servers - Lenovo Press, consulté le avril 22, 2025, &lt;a href="https://lenovopress.lenovo.com/lp2110-suse-harvester-and-rancher-solutions-on-thinksystem-v3-servers"&gt;https://lenovopress.lenovo.com/lp2110-suse-harvester-and-rancher-solutions-on-thinksystem-v3-servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Harvester Overview, consulté le avril 22, 2025, &lt;a href="https://docs.harvesterhci.io/v1.4/"&gt;https://docs.harvesterhci.io/v1.4/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SUSE® Virtualization :: Rancher product documentation, consulté le avril 22, 2025, &lt;a href="https://documentation.suse.com/cloudnative/rancher-manager/latest/en/integrations/harvester/harvester.html"&gt;https://documentation.suse.com/cloudnative/rancher-manager/latest/en/integrations/harvester/harvester.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rancher Vs. OpenShift - Qovery, consulté le avril 22, 2025, &lt;a href="https://www.qovery.com/blog/rancher-vs-openshift/"&gt;https://www.qovery.com/blog/rancher-vs-openshift/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Top 13 Kubernetes Alternatives for Containers in 2025 - Spacelift, consulté le avril 22, 2025, &lt;a href="https://spacelift.io/blog/kubernetes-alternatives"&gt;https://spacelift.io/blog/kubernetes-alternatives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes Alternatives for Container Orchestration - Wiz, consulté le avril 22, 2025, &lt;a href="https://www.wiz.io/academy/kubernetes-alternatives"&gt;https://www.wiz.io/academy/kubernetes-alternatives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;13 alternatives to vanilla Kubernetes for container orchestration - Sysdig, consulté le avril 22, 2025, &lt;a href="https://sysdig.com/learn-cloud-native/13-alternatives-to-vanilla-kubernetes-for-container-orchestration/"&gt;https://sysdig.com/learn-cloud-native/13-alternatives-to-vanilla-kubernetes-for-container-orchestration/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes vs. OpenShift vs. VMware Tanzu: An Expert Comparison by HumberSys, consulté le avril 22, 2025, &lt;a href="https://www.humbersys.com/?p=1182"&gt;https://www.humbersys.com/?p=1182&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;KubeVirt user guide, consulté le avril 22, 2025, &lt;a href="https://kubevirt.io/user-guide/"&gt;https://kubevirt.io/user-guide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rancher vs. Openshift: The Guide - Densify, consulté le avril 22, 2025, &lt;a href="https://www.densify.com/openshift-tutorial/rancher-vs-openshift/"&gt;https://www.densify.com/openshift-tutorial/rancher-vs-openshift/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Migrating VMs to Kubernetes with Kubevirt - CloudRaft, consulté le avril 22, 2025, &lt;a href="https://www.cloudraft.io/blog/migrating-vms-to-kubernetes-with-kubevirt"&gt;https://www.cloudraft.io/blog/migrating-vms-to-kubernetes-with-kubevirt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Simplifying VM Storage and Management With OpenShift and KubeVirt - Cloud Native Now, consulté le avril 22, 2025, &lt;a href="https://cloudnativenow.com/social-facebook/simplifying-vm-storage-and-management-with-openshift-and-kubevirt/"&gt;https://cloudnativenow.com/social-facebook/simplifying-vm-storage-and-management-with-openshift-and-kubevirt/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat Launches OpenShift Virtualization Engine to Streamline Virtual Machine Management -- ADTmag - Application Development Trends, consulté le avril 22, 2025, &lt;a href="https://adtmag.com/Articles/2025/01/22/Red-Hat-Launches-OpenShift-Virtualization-Engine.aspx"&gt;https://adtmag.com/Articles/2025/01/22/Red-Hat-Launches-OpenShift-Virtualization-Engine.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat OpenShift Virtualization | Red Hat Developer, consulté le avril 22, 2025, &lt;a href="https://developers.redhat.com/products/openshift/virtualization"&gt;https://developers.redhat.com/products/openshift/virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat OpenShift Virtualization Engine overview - YouTube, consulté le avril 22, 2025, &lt;a href="https://www.youtube.com/watch?v=NvGBmk-T_Kc"&gt;https://www.youtube.com/watch?v=NvGBmk-T_Kc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Choosing the Right Platform: OpenShift Virtualization vs. VMware - Trilio, consulté le avril 22, 2025, &lt;a href="https://trilio.io/openshift-virtualization/openshift-virtualization-vs-vmware/"&gt;https://trilio.io/openshift-virtualization/openshift-virtualization-vs-vmware/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware vs OpenShift Virtualization: Which Platform Wins in 2025? - SYONE, consulté le avril 22, 2025, &lt;a href="https://blog.syone.com/vmware-vs-openshift-virtualizationwhich-platform-wins-in-2025"&gt;https://blog.syone.com/vmware-vs-openshift-virtualizationwhich-platform-wins-in-2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Transform your VMware workloads with ROSA on AWS: limitless… - Paradigma Digital, consulté le avril 22, 2025, &lt;a href="https://en.paradigmadigital.com/techbiz/transform-vmware-workloads-rosa-aws-limitless-modernization/"&gt;https://en.paradigmadigital.com/techbiz/transform-vmware-workloads-rosa-aws-limitless-modernization/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Clustered Realities: Migrating VMs to Red Hat OpenShift Virtualization - Lightbits Labs, consulté le avril 22, 2025, &lt;a href="https://www.lightbitslabs.com/blog/migrating-vms-to-red-hat-openshift-virtualization/"&gt;https://www.lightbitslabs.com/blog/migrating-vms-to-red-hat-openshift-virtualization/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware to OpenShift Virtualization Migration - YouTube, consulté le avril 22, 2025, &lt;a href="https://www.youtube.com/watch?v=Rp8YcDgSrZo&amp;amp;pp=0gcJCdgAo7VqN5tD"&gt;https://www.youtube.com/watch?v=Rp8YcDgSrZo&amp;amp;pp=0gcJCdgAo7VqN5tD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Red Hat OpenShift vs VMware ESXi comparison - PeerSpot, consulté le avril 22, 2025, &lt;a href="https://www.peerspot.com/products/comparisons/red-hat-openshift_vs_vmware-esxi-40782"&gt;https://www.peerspot.com/products/comparisons/red-hat-openshift_vs_vmware-esxi-40782&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes as a Virtual Machine Management System - kth .diva, consulté le avril 22, 2025, &lt;a href="https://kth.diva-portal.org/smash/get/diva2:1909098/FULLTEXT01.pdf"&gt;https://kth.diva-portal.org/smash/get/diva2:1909098/FULLTEXT01.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Live Migration - KubeVirt user guide, consulté le avril 22, 2025, &lt;a href="https://kubevirt.io/user-guide/compute/live_migration/"&gt;https://kubevirt.io/user-guide/compute/live_migration/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware vs KubeVirt - Discover a Cost-Effective Alternative for Virtualization - Platform9, consulté le avril 22, 2025, &lt;a href="https://platform9.com/blog/vmware-vs-kubevirt/"&gt;https://platform9.com/blog/vmware-vs-kubevirt/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What Is VMware Migration? | Pure Storage, consulté le avril 22, 2025, &lt;a href="https://www.purestorage.com/uk/knowledge/vmware-migration.html"&gt;https://www.purestorage.com/uk/knowledge/vmware-migration.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Converting virtual machines from other hypervisors to KVM with virt-v2v in RHEL 7, RHEL 8, and RHEL 9 - Red Hat Customer Portal, consulté le avril 22, 2025, &lt;a href="https://access.redhat.com/articles/1351473"&gt;https://access.redhat.com/articles/1351473&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;To those who successfully migrated VMWare to Proxmox or Hyper-V how did it go? - Reddit, consulté le avril 22, 2025, &lt;a href="https://www.reddit.com/r/sysadmin/comments/1j3lbgj/to_those_who_successfully_migrated_vmware_to/"&gt;https://www.reddit.com/r/sysadmin/comments/1j3lbgj/to_those_who_successfully_migrated_vmware_to/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;A Step-by-Step Guide to Migrating VMs from VMware ESXi to Proxmox - Cheap Windows VPS, consulté le avril 22, 2025, &lt;a href="https://cheapwindowsvps.com/blog/a-step-by-step-guide-to-migrating-vms-from-vmware-esxi-to-proxmox/"&gt;https://cheapwindowsvps.com/blog/a-step-by-step-guide-to-migrating-vms-from-vmware-esxi-to-proxmox/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open-Source Migration with Migratekit: VMware to OpenStack - VEXXHOST sponsor pr... - Mohammed Naser - YouTube, consulté le avril 22, 2025, &lt;a href="https://www.youtube.com/watch?v=AmQelZT_4TQ"&gt;https://www.youtube.com/watch?v=AmQelZT_4TQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;VMware Migration Issues - Proxmox Support Forum, consulté le avril 22, 2025, &lt;a href="https://forum.proxmox.com/threads/vmware-migration-issues.163753/"&gt;https://forum.proxmox.com/threads/vmware-migration-issues.163753/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What Is Virt-v2v and How to Convert VM for KVM? - Vinchin Backup &amp;amp; Recovery, consulté le avril 22, 2025, &lt;a href="https://www.vinchin.com/vm-migration/virt-v2v.html"&gt;https://www.vinchin.com/vm-migration/virt-v2v.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Converting a VMware vCenter Linux virtual machine to KVM - Red Hat Customer Portal, consulté le avril 22, 2025, &lt;a href="https://access.redhat.com/articles/1353223"&gt;https://access.redhat.com/articles/1353223&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How to Migrate VMs from VMware to Proxmox VE? - Apps4Rent.com, consulté le avril 22, 2025, &lt;a href="https://www.apps4rent.com/blog/vmware-to-proxmox-ve-migration/"&gt;https://www.apps4rent.com/blog/vmware-to-proxmox-ve-migration/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Migrate VMs from KVM to VMware | Steps and Common Problems | Vinchin Backup, consulté le avril 22, 2025, &lt;a href="https://www.vinchin.com/vm-migration/kvm-to-vmware.html"&gt;https://www.vinchin.com/vm-migration/kvm-to-vmware.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Most efficient way to move virtual machines from vmare to kubevirt on kubernetes? - Reddit, consulté le avril 22, 2025, &lt;a href="https://www.reddit.com/r/kubernetes/comments/1jqbwh2/most_efficient_way_to_move_virtual_machines_from/"&gt;https://www.reddit.com/r/kubernetes/comments/1jqbwh2/most_efficient_way_to_move_virtual_machines_from/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;-Konveyor- Moving Workloads Across Clusters With Crane – And A Look At The Konveyor Community | PDF | Backup | Replication (Computing) - Scribd, consulté le avril 22, 2025, &lt;a href="https://www.scribd.com/document/815067347/Konveyor-Moving-Workloads-Across-Clusters-With-Crane-And-A-Look-At-The-Konveyor-Community"&gt;https://www.scribd.com/document/815067347/Konveyor-Moving-Workloads-Across-Clusters-With-Crane-And-A-Look-At-The-Konveyor-Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How to Become a Cloud Administrator ? Key Certifications and Skills You Need, consulté le avril 22, 2025, &lt;a href="https://www.webasha.com/blog/how-to-become-a-cloud-administrator-key-certifications-and-skills-you-need"&gt;https://www.webasha.com/blog/how-to-become-a-cloud-administrator-key-certifications-and-skills-you-need&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TOP 5 REASONS KUBERNETES RUNS BETTER ON VMWARE vSPHERE, consulté le avril 22, 2025, &lt;a href="https://www.vmware.com/docs/solution-overview-top-5-reasons-kubernetes-runs-better-on-vmware-vsphere"&gt;https://www.vmware.com/docs/solution-overview-top-5-reasons-kubernetes-runs-better-on-vmware-vsphere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;What are the benefits of "enterprise-level" virtualization? - Server Fault, consulté le avril 22, 2025, &lt;a href="https://serverfault.com/questions/513381/what-are-the-benefits-of-enterprise-level-virtualization"&gt;https://serverfault.com/questions/513381/what-are-the-benefits-of-enterprise-level-virtualization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Product - Community vs Enterprise - CFEngine, consulté le avril 22, 2025, &lt;a href="https://cfengine.com/community-vs-enterprise-comparison/"&gt;https://cfengine.com/community-vs-enterprise-comparison/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lift-and-Shift or Refactor: Which Migration Methodology is Right for You? - ClearScale Blog, consulté le avril 22, 2025, &lt;a href="https://blog.clearscale.com/lift-and-shift-or-refactor-which-migration-methodology-is-right-for-you/"&gt;https://blog.clearscale.com/lift-and-shift-or-refactor-which-migration-methodology-is-right-for-you/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big Bang vs. Gradual Data Migration: Pros, Cons, and Best Practices - XB Software, consulté le avril 22, 2025, &lt;a href="https://xbsoftware.com/blog/big-bang-or-gradual-data-migration/"&gt;https://xbsoftware.com/blog/big-bang-or-gradual-data-migration/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big Bang vs Trickle Migration [Key Differences &amp;amp; Considerations] - Brainhub, consulté le avril 22, 2025, &lt;a href="https://brainhub.eu/library/big-bang-migration-vs-trickle-migration"&gt;https://brainhub.eu/library/big-bang-migration-vs-trickle-migration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Big Bang vs Phased Implementation - Impact on Time and Cost, consulté le avril 22, 2025, &lt;a href="https://pm.stackexchange.com/questions/12038/big-bang-vs-phased-implementation-impact-on-time-and-cost"&gt;https://pm.stackexchange.com/questions/12038/big-bang-vs-phased-implementation-impact-on-time-and-cost&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="Infrastructure"></category></entry><entry><title>Simplifier et optimiser vos clusters Kubernetes : le combo gagnant EKS + Karpenter + Auto Mode</title><link href="https://blogppr.alterway.fr/simplifier-et-optimiser-vos-clusters-kubernetes-le-combo-gagnant-eks-karpenter-auto-mode.html" rel="alternate"></link><published>2025-04-29T18:00:00+02:00</published><updated>2025-04-29T18:00:00+02:00</updated><author><name>Cédric Henriques</name></author><id>tag:blogppr.alterway.fr,2025-04-29:/simplifier-et-optimiser-vos-clusters-kubernetes-le-combo-gagnant-eks-karpenter-auto-mode.html</id><summary type="html">&lt;p&gt;Retour d’expérience de Qonto et focus sur Karpenter &amp;amp; EKS Auto Mode à l'AWS Summit 2025&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Simplifier et optimiser vos clusters Kubernetes : le combo gagnant EKS + Karpenter + Auto Mode&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Retour d’expérience de Qonto et focus sur Karpenter &amp;amp; EKS Auto Mode&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;À l’occasion d’une session au Summit AWS 2025, les équipes de Qonto et d’AWS sont revenues sur les bonnes pratiques pour gérer efficacement des clusters Kubernetes à grande échelle. Voici les principaux enseignements à retenir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Kubernetes : un standard… qui reste complexe à opérer&lt;/h2&gt;
&lt;p&gt;Kubernetes s’est imposé comme l’orchestrateur de conteneurs de référence. &lt;strong&gt;84 % des entreprises&lt;/strong&gt; l’utilisent, selon la CNCF, que ce soit en production ou en expérimentation. Ses atouts sont connus :&lt;br /&gt;
- &lt;strong&gt;Portabilité&lt;/strong&gt; : du laptop à l’on-prem, en passant par le cloud.&lt;br /&gt;
- &lt;strong&gt;Support des architectures microservices&lt;/strong&gt; : agilité, découplage, scalabilité.&lt;/p&gt;
&lt;p&gt;Mais derrière ces bénéfices se cache une &lt;strong&gt;complexité opérationnelle réelle&lt;/strong&gt; : scaler les ressources, gérer les mises à jour, sécuriser les déploiements… Tout cela demande du temps et de l’expertise.&lt;/p&gt;
&lt;p&gt;Depuis 2017, &lt;strong&gt;Amazon EKS (Elastic Kubernetes Service)&lt;/strong&gt; propose de décharger les équipes de la gestion du &lt;strong&gt;control plane&lt;/strong&gt;. Mais qu’en est-il du &lt;strong&gt;data plane&lt;/strong&gt; et des ressources sous-jacentes ? Comment éviter de passer des heures sur l’optimisation des nœuds ou le patching du système ?&lt;/p&gt;
&lt;p&gt;C’est là qu’interviennent &lt;strong&gt;Karpenter&lt;/strong&gt; et &lt;strong&gt;EKS Auto Mode&lt;/strong&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Karpenter : le scaling intelligent et granulaire&lt;/h2&gt;
&lt;h3&gt;De Cluster Autoscaler à Karpenter : changer de paradigme&lt;/h3&gt;
&lt;p&gt;Avant Karpenter, le scaling horizontal (HPA) et Cluster Autoscaler étaient les standards. Mais ils reposaient sur des &lt;strong&gt;Auto Scaling Groups (ASG)&lt;/strong&gt;, avec plusieurs limites :&lt;br /&gt;
- Taille des instances homogène dans un ASG (peu de flexibilité).&lt;br /&gt;
- Latence liée à l’intermédiation entre Kubernetes, Cluster Autoscaler et ASG.&lt;br /&gt;
- Complexité pour gérer le Spot et les architectures ARM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Karpenter&lt;/strong&gt;, projet open source intégré à l’écosystème Kubernetes (SIG Autoscaling), vient casser ces limitations.&lt;/p&gt;
&lt;h3&gt;Comment fonctionne Karpenter ?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Il observe les pods en attente de scheduling.  &lt;/li&gt;
&lt;li&gt;Il choisit dynamiquement le meilleur type d’instance pour les exécuter.  &lt;/li&gt;
&lt;li&gt;Il provisionne directement les instances via l’API EC2 (sans passer par un ASG).  &lt;/li&gt;
&lt;li&gt;Il scale de manière fine : petites, moyennes, grandes instances, Spot, On-Demand, ARM, GPU, selon les contraintes de vos workloads.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Node Pools &amp;amp; Node Classes : plus de contrôle, moins de friction&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NodePool&lt;/strong&gt; : définit les types d’instances autorisées (par ex. : uniquement Graviton, Spot, GPU…).  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NodeClass&lt;/strong&gt; : configure les instances (subnets, AMI, IAM role, OS version…).  &lt;/li&gt;
&lt;li&gt;Support de l’&lt;strong&gt;auto-consolidation&lt;/strong&gt; : Karpenter détecte les nœuds sous-utilisés, déploie de nouveaux nœuds optimisés, et termine les anciens.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bénéfices concrets pour Qonto :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scalabilité granulaire&lt;/strong&gt; sans dépendance à des groupes statiques.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adoption facilitée du Spot&lt;/strong&gt; avec des économies sur le compute (jusqu’à 55 % combiné à Graviton et consolidation).  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplification des mises à jour&lt;/strong&gt; : changement de version d’OS simplement via la NodeClass.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réduction des temps de mise à jour&lt;/strong&gt; : de plusieurs jours à 1h pour certains clusters.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Aller plus loin avec EKS Auto Mode : l’automatisation poussée de Kubernetes&lt;/h2&gt;
&lt;h3&gt;Le constat : EKS gère déjà le control plane, mais la gestion des nœuds restait à la charge des clients&lt;/h3&gt;
&lt;p&gt;Avec &lt;strong&gt;EKS Auto Mode&lt;/strong&gt;, AWS va plus loin :&lt;br /&gt;
- Gestion automatique &lt;strong&gt;du data plane&lt;/strong&gt; (instances EC2, patching, dimensionnement).&lt;br /&gt;
- Sélection dynamique des instances optimales.&lt;br /&gt;
- Mises à jour automatiques des nœuds avec OS optimisé (Amazon Linux / Ubuntu).&lt;br /&gt;
- Surveillance de l’état de santé des nœuds + correction automatique.&lt;br /&gt;
- &lt;strong&gt;Compute éphémère&lt;/strong&gt; : rotation régulière des instances, réduisant la surface d’attaque et les risques liés aux patchs manquants.&lt;/p&gt;
&lt;h3&gt;La promesse :&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Vous déclarez vos pods, AWS gère le reste.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plus besoin de gérer :&lt;br /&gt;
- Le cycle de vie des instances.&lt;br /&gt;
- Le patching OS.&lt;br /&gt;
- Le monitoring bas niveau.&lt;br /&gt;
- La mise à l’échelle (scaling up &amp;amp; scaling down).&lt;/p&gt;
&lt;h3&gt;Focus sécurité :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Intégration native avec &lt;strong&gt;IAM Pod Identity&lt;/strong&gt; pour les permissions sur les services AWS.  &lt;/li&gt;
&lt;li&gt;Rafraîchissement automatique des pods (patching tous les 14 jours).  &lt;/li&gt;
&lt;li&gt;Compute éphémère = renouvellement continu des ressources sous-jacentes.  &lt;/li&gt;
&lt;li&gt;Compatibilité avec les services de sécurité AWS (GuardDuty, Security Hub…).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Karpenter + Auto Mode : complémentaires ou concurrents ?&lt;/h2&gt;
&lt;p&gt;Les deux solutions sont &lt;strong&gt;complémentaires&lt;/strong&gt; :&lt;br /&gt;
- &lt;strong&gt;Karpenter&lt;/strong&gt; : idéal si vous avez besoin de &lt;strong&gt;contrôle fin&lt;/strong&gt; sur les types d’instances, les stratégies Spot, les pools par workload (GPU, Graviton, etc.).&lt;br /&gt;
- &lt;strong&gt;Auto Mode&lt;/strong&gt; : pour les cas où vous voulez &lt;strong&gt;externaliser totalement la gestion du data plane&lt;/strong&gt; et concentrer vos efforts sur les déploiements applicatifs, sans gérer d’infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chez Qonto&lt;/strong&gt; :&lt;br /&gt;
- Karpenter optimise les clusters actuels avec une gestion granulaire des instances.&lt;br /&gt;
- Auto Mode est exploré pour continuer à &lt;strong&gt;réduire la maintenance&lt;/strong&gt; et déléguer davantage d’opérations non différenciantes à AWS.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Pourquoi ces choix technologiques comptent ?&lt;/h2&gt;
&lt;p&gt;Chez Qonto, ce sont &lt;strong&gt;15 clusters&lt;/strong&gt;, &lt;strong&gt;15 000 pods&lt;/strong&gt; et &lt;strong&gt;200 déploiements par jour&lt;/strong&gt;.&lt;br /&gt;
Avec ce niveau d’activité, maintenir un bon équilibre entre :&lt;br /&gt;
- Disponibilité.&lt;br /&gt;
- Sécurité.&lt;br /&gt;
- Scalabilité.&lt;br /&gt;
- Coût maîtrisé.  &lt;/p&gt;
&lt;p&gt;…devient un défi majeur. L’automatisation via Karpenter et Auto Mode permet de libérer les équipes des tâches les plus répétitives et chronophages.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion : Kubernetes à grande échelle, mais sans douleur&lt;/h2&gt;
&lt;p&gt;Scalabilité, coûts, sécurité, maintenance : les défis Kubernetes sont nombreux. Avec &lt;strong&gt;EKS, Karpenter et EKS Auto Mode&lt;/strong&gt;, AWS propose un ensemble cohérent pour :&lt;br /&gt;
- Accélérer les déploiements.&lt;br /&gt;
- Simplifier la gestion opérationnelle.&lt;br /&gt;
- Optimiser les coûts de calcul.&lt;br /&gt;
- Sécuriser les clusters par défaut.&lt;/p&gt;
&lt;p&gt;L’expérience de Qonto montre que ces outils sont non seulement efficaces, mais surtout &lt;strong&gt;adaptés à une gestion Kubernetes à grande échelle&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Et si vous pouviez, vous aussi, passer plus de temps à innover… et moins à patcher vos nœuds ?&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Amazon Web Services"></category></entry><entry><title>Déployer Talos sur Numspot</title><link href="https://blogppr.alterway.fr/deployer-talos-sur-numspot.html" rel="alternate"></link><published>2025-04-18T10:00:00+02:00</published><updated>2025-04-18T10:00:00+02:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-04-18:/deployer-talos-sur-numspot.html</id><summary type="html">&lt;p&gt;Déployer un cluster Kubernetes Talos sur NumSpot avec Terraform : quand minimalisme et souveraineté riment avec modernité&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Déployer un cluster Kubernetes Talos sur NumSpot avec Terraform : quand minimalisme et souveraineté riment avec modernité&lt;/h1&gt;
&lt;h2&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Chez de nombreux Cloud Providers, la tentation est grande d’utiliser les services managés Kubernetes (KaaS) : maintenance simplifiée, upgrades automatisés, intégration avec la console cloud... NumSpot n’échappe pas à la règle et propose sa propre offre Kubernetes managée, très séduisante pour qui veut déployer vite et sans douleur.&lt;/p&gt;
&lt;p&gt;Mais que faire lorsqu'on souhaite garder un contrôle total sur son OS, sa couche Kubernetes, tout en s’appuyant sur l’infrastructure robuste d’un cloud souverain ? C’est là que Talos de SideroLabs entre en scène. Minimaliste, sécurisé et taillé pour le Cloud Native, Talos OS s’impose comme un choix sérieux pour déployer Kubernetes en toute maîtrise.&lt;/p&gt;
&lt;p&gt;Dans cet article, je vous guide sur la création d’un cluster Talos sur NumSpot, orchestré par Terraform. Une alternative sérieuse pour ceux qui veulent conjuguer automatisation, sobriété et souveraineté.&lt;/p&gt;
&lt;h2&gt;Pourquoi Talos et pas un service managé ?&lt;/h2&gt;
&lt;p&gt;Avant de plonger dans le code, posons le décor.&lt;/p&gt;
&lt;p&gt;Talos est un OS Linux immuable et minimaliste conçu exclusivement pour exécuter Kubernetes. &lt;strong&gt;Pas de package manager&lt;/strong&gt;, &lt;strong&gt;pas de SSH&lt;/strong&gt;, une &lt;strong&gt;surface d’attaque&lt;/strong&gt; réduite au strict nécessaire, et une approche &lt;strong&gt;API-first&lt;/strong&gt; pour l'administration.&lt;/p&gt;
&lt;p&gt;NumSpot, de son côté, est un cloud souverain basé sur OutScale (Xen), robuste et compatible avec les standards du cloud public. Il propose déjà un Kubernetes managé, mais dans notre cas :&lt;/p&gt;
&lt;p&gt;Contrainte de sécurité élevée : Talos réduit les vecteurs d'attaque.&lt;/p&gt;
&lt;p&gt;Volonté d’expérimenter : maîtriser les mises à jour, le bootstrap, la gestion du cycle de vie.&lt;/p&gt;
&lt;p&gt;Homogénéité multi-cloud / on-prem : même OS partout, même comportement.&lt;/p&gt;
&lt;h2&gt;Pré-requis&lt;/h2&gt;
&lt;p&gt;Avant de commencer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Un projet actif sur NumSpot avec quota suffisant.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un compte de service numspot avec des droits suffisants pour créer tous les éléments de l'infrastructure Numspot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sous la forme d'un ID (SA_idKey) et d'un Secret (SA_KeyPass)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une infrastructure réseau existante (Vpc, Subnet, Nat Gateway). Très facile à créer en utilisant terraform.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une vm de service avec :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform installé (&amp;gt;=1.6.x).&lt;/li&gt;
&lt;li&gt;talosctl installé.&lt;/li&gt;
&lt;li&gt;curl pour accéder à l'API de numspot car tou n'est pas encore disponible dans le provider terraform pour Numspot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prévoyez sur cette VM un volume supplémentaire de 20G monté sur la VM (/dev/sda).&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Création d'une Image dans le catalogue privé du compte Numspot&lt;/h2&gt;
&lt;p&gt;L'image Talos n'est pas disponible dans le catalogue public de Numspot. &lt;/p&gt;
&lt;h3&gt;1.1 Téléchargement du raw disk Talos Linux&lt;/h3&gt;
&lt;p&gt;Nous allons devoir télécharger une image sur &lt;a href="https://factory.talos.dev/"&gt;Talos Linux Image Factory&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;C'est un service proposé par Sidero Labs qui permet de générer des images machine personnalisées pour Talos Linux. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choisir la version de Talos Linux, ex: 1.9.5&lt;/li&gt;
&lt;li&gt;Cliquer sur "Next"&lt;/li&gt;
&lt;li&gt;Choisir "Nocloud" comme type de distribution&lt;/li&gt;
&lt;li&gt;Cliquer sur "Next"&lt;/li&gt;
&lt;li&gt;Choisir amd64 comme architecture de machine, ne pas cocher SecureBoot&lt;/li&gt;
&lt;li&gt;Cliquer sur "Next"&lt;/li&gt;
&lt;li&gt;Vous pouvez choisir des extensions système si besoin (moi j'en ai choisi aucune)&lt;/li&gt;
&lt;li&gt;Cliquer sur "Next"&lt;/li&gt;
&lt;li&gt;Laisser le champ Customization vide&lt;/li&gt;
&lt;li&gt;Cliquer sur "Next"&lt;/li&gt;
&lt;li&gt;Télécharger le Disk Image (ex: https://factory.talos.dev/image/&lt;hash&gt;/v1.9.5/nocloud-amd64.raw.xz) &lt;strong&gt;sur la VM de service&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1.2 Copie du raw disk sur /dev/sda&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Décompresser le raw disk &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;xz&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;nocloud-amd64.raw.xz
mv&lt;span class="w"&gt; &lt;/span&gt;talos-1.9.5-nocloud-amd64.raw&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Nettoyage du disk avant copie&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vérifiez où est monté votre volume dans la vm (sudo fdisk -l). (Moi /dev/sda)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Disk /dev/vda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C7AE58FB-33FF-47AD-B0B0-C5494AA4C12B

Device       Start      End  Sectors  Size Type
/dev/vda1  2099200 20971486 18872287    9G Linux filesystem
/dev/vda14    2048    10239     8192    4M BIOS boot
/dev/vda15   10240   227327   217088  106M EFI System
/dev/vda16  227328  2097152  1869825  913M Linux extended boot

Partition table entries are not in disk order.


Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Commande à lancer &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;wipefs&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/dev/sda
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Copie avec la commande dd du raw disk sur /dev/sda&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;dd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;talos-1.9.5-nocloud-amd64.raw&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sda&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32M&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;progress
&lt;span class="m"&gt;1241513984&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;GB,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;GiB&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;copied,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;s,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.1&lt;span class="w"&gt; &lt;/span&gt;GB/s&lt;span class="w"&gt; &lt;/span&gt;...
&lt;span class="m"&gt;38&lt;/span&gt;+1&lt;span class="w"&gt; &lt;/span&gt;records&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="m"&gt;38&lt;/span&gt;+1&lt;span class="w"&gt; &lt;/span&gt;records&lt;span class="w"&gt; &lt;/span&gt;out
&lt;span class="m"&gt;1306525696&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bytes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.3&lt;span class="w"&gt; &lt;/span&gt;GB,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;.2&lt;span class="w"&gt; &lt;/span&gt;GiB&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;copied,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;.819&lt;span class="w"&gt; &lt;/span&gt;s,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.6&lt;span class="w"&gt; &lt;/span&gt;MB/s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Soyez patient !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ça peut prendre un certain temps avant d'avoir la 🫲.&lt;/p&gt;
&lt;p&gt;Si on repasse un &lt;code&gt;fdisk -l&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;on voit que le disk a maintenant une structure&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 1C07C588-7E7B-4245-BF46-C54B8BCBDEEE

Device       Start     End Sectors  Size Type
/dev/sda1     2048  206847  204800  100M EFI System
/dev/sda2   206848  208895    2048    1M BIOS boot
/dev/sda3   208896 2256895 2048000 1000M Linux filesystem
/dev/sda4  2256896 2258943    2048    1M Linux filesystem
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;1.1.3 Snapshot du volume pour en faire un ... Snapshot 😏&lt;/h3&gt;
&lt;p&gt;Sur numspot on peut convertir un snapshot en une image numspot utilisable pour booter une vm.&lt;/p&gt;
&lt;p&gt;Je pense qu'on peut faire cette partie par l'api de numspot, mais je vais au plus simple et je vais le faire par le portail.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allez dans Stockage &amp;gt;&amp;gt; Volumes &lt;/li&gt;
&lt;li&gt;Identifiez le volume que vous avez ajouté à votre VM &lt;/li&gt;
&lt;li&gt;Dans &lt;code&gt;Actions&lt;/code&gt; Choissisez "Créer un Snapshot depuis ce Volume"&lt;/li&gt;
&lt;li&gt;Donnez un nom à votre snapshot pour facilement l'identifier (ex: talos-nocloud-1.9.5)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/s1.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Puis allez dans snapshot, Vérifiez que votre snapshot est généré et disponible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/s2.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;notez l'ID du snapshot dans notre exemple &lt;code&gt;snap-88153838&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;1.1.4 Transformation du Snapshot en Image privée Numspot&lt;/h3&gt;
&lt;p&gt;C'est à ce moment-là que les choses se compliquent car cette fonctionnalité n'existe pas &lt;strong&gt;encore&lt;/strong&gt; dans le portail.&lt;/p&gt;
&lt;p&gt;On va donc utiliser l'API de numspot pour faire ça !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Il faut nous connecter à l'API pour récupérer un TOKEN d'authentification qui sera utilisé dans les commandes curl suivantes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Créer un script &lt;code&gt;auth.sh&lt;/code&gt; avec le code suivant :&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adapter simplement &lt;code&gt;REGION&lt;/code&gt;, &lt;code&gt;SA_idKey&lt;/code&gt; et  &lt;code&gt;SA_KeyPass&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# auth.sh&lt;/span&gt;

&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cloudgouv-eu-west-1&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;SA_idKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;SA_KeyPass&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;omygodthisisasecretkey&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;-X&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;https://api.&lt;span class="nv"&gt;$REGION&lt;/span&gt;.numspot.com/iam/token&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Accept: */*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-u&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SA_idKey&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SA_KeyPass&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-H&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/x-www-form-urlencoded&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;grant_type=client_credentials&amp;amp;scope=openid+offline_access&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.access_token&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# pour Debug seulement&lt;/span&gt;
&lt;span class="c1"&gt;#echo $ACCESS_TOKEN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Nous avons notre &lt;code&gt;TOKEN&lt;/code&gt;. Nous allons donc transformer notre snapshot en image privée.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Créer le script suivant ou la commande :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;auth.sh

curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://api.cloudgouv-eu-west-1.numspot.com/compute/spaces/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/images&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;POST&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--data&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;architecture&amp;quot;: &amp;quot;x86_64&amp;quot;,&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;blockDeviceMappings&amp;quot;: [&lt;/span&gt;
&lt;span class="s1"&gt;    {&lt;/span&gt;
&lt;span class="s1"&gt;      &amp;quot;bsu&amp;quot;: {&lt;/span&gt;
&lt;span class="s1"&gt;        &amp;quot;deleteOnVmDeletion&amp;quot;: true,&lt;/span&gt;
&lt;span class="s1"&gt;        &amp;quot;snapshotId&amp;quot;: &amp;quot;snap-88153838&amp;quot;,&lt;/span&gt;
&lt;span class="s1"&gt;        &amp;quot;volumeSize&amp;quot;: 20,&lt;/span&gt;
&lt;span class="s1"&gt;        &amp;quot;volumeType&amp;quot;: &amp;quot;standard&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;      },&lt;/span&gt;
&lt;span class="s1"&gt;      &amp;quot;deviceName&amp;quot;: &amp;quot;/dev/sda1&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;    }&lt;/span&gt;
&lt;span class="s1"&gt;  ],&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;productCodes&amp;quot;: [&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;0001&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;  ],&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;name&amp;quot;: &amp;quot;talos1.9.5-img&amp;quot;,&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;rootDeviceName&amp;quot;: &amp;quot;/dev/sda1&amp;quot;&lt;/span&gt;
&lt;span class="s1"&gt;}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Adaptez les champs :&lt;/li&gt;
&lt;li&gt;snapshotId&lt;/li&gt;
&lt;li&gt;name &lt;/li&gt;
&lt;li&gt;
&lt;p&gt;volumeType (si besoin)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Gardez les champs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/dev/sda1  de deviceName et rootDeviceName &lt;/li&gt;
&lt;li&gt;architecture &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je ne sais pas trop ce qu'est &lt;code&gt;productCodes&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Note : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment trouver https://api.cloudgouv-eu-west-1.numspot.com/compute/spaces/xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx ?&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Allez dans IAM &amp;gt;&amp;gt; Espaces : Prenez l'ID de votre Espace&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lancez le script &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si tout se passe bien, allez dans Compute &amp;gt;&amp;gt; Images et tapez  Talos dans le champ de recherche. Vous devriez avoir
quelque chose d'approchant à ça &lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/s3.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Notez l'ID de votre image (chez moi &lt;code&gt;ami-4a8eaf5a&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Voilà nous avons une image disponible nous allons pouvoir créer des VM à partir de cette image.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/s4.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Vous pouvez déjà créer une vm de test pour vous assurer qu'elle boot correctement&lt;/p&gt;
&lt;p&gt;Note : &lt;/p&gt;
&lt;p&gt;Le boot est, je ne sais pas trop pourquoi, la première fois très lent.&lt;/p&gt;
&lt;p&gt;Si vous ouvrez la console de la VM créée vous aurez quelque chose comme ça d'approchant :&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/s5.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Création des configurations terraform pour Talos sur Numspot&lt;/h2&gt;
&lt;p&gt;Structure du répertoire :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;.
├── files
├── numspot-talos
└── templates
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Répertoire :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;files&lt;/code&gt; : contient 1 fichier &lt;code&gt;cp-scheduling.yaml&lt;/code&gt; qui permet de configurer les nœuds Talos avec des données fixes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;templates&lt;/code&gt; : contient 1 fichier de configuration &lt;code&gt;node-configuration.yaml.tmpl&lt;/code&gt; qui permet de configurer les différents nœuds en fonction de leurs rôles ou autres paramètres.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;numspot-talos&lt;/code&gt; : répertoire généré avec le nom du cluster, contiendra les fichiers permettant d'administrer le cluster avec la CLI talosctl et le kubeconfig permettant l'accès à l'API kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1 fichiers Providers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Créez un fichier &lt;code&gt;providers.tf&lt;/code&gt; avec le code suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;terraform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;required_providers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;numspot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numspot/numspot&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;gt;= 1.0&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;talos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;siderolabs/talos&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;gt;= 0.6.0&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;provider&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;numspot&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;numspot_host&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://api.cloudgouv-eu-west-1.numspot.com&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ID du SA&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_secret&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Secret du SA&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;space_id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Votre Space ID&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;numspot_host_os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://objectstorage.eu-west-2.numspot.com&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Adaptez les informations de numspot&lt;/p&gt;
&lt;p&gt;Le rôle principal du fichier &lt;code&gt;providers.tf&lt;/code&gt; est de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Déclarer les fournisseurs (Providers) requis : Indiquer à Terraform quels plugins (fournisseurs) sont nécessaires pour interagir avec les différentes API des services que vous souhaitez gérer (ici, NumSpot et Talos).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configurer les fournisseurs : Fournir les informations d'authentification et les paramètres spécifiques (comme les points de terminaison d'API ou les régions) pour que Terraform puisse communiquer correctement avec ces services.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bloc terraform {}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C'est un bloc spécial pour les configurations globales de Terraform lui-même.&lt;/li&gt;
&lt;li&gt;required_providers {} : Ce sous-bloc est crucial. Il liste les fournisseurs externes dont dépend votre code Terraform.&lt;ul&gt;
&lt;li&gt;numspot = { ... } :&lt;ul&gt;
&lt;li&gt;Déclare que le fournisseur numspot est nécessaire.&lt;/li&gt;
&lt;li&gt;source = "numspot/numspot" : Indique à Terraform où trouver le code de ce fournisseur dans le Registre Terraform (ici, il s'agit du fournisseur officiel maintenu par ou pour NumSpot).&lt;/li&gt;
&lt;li&gt;version = "&amp;gt;= 1.0" : Spécifie que n'importe quelle version du fournisseur numspot égale ou supérieure à 1.0 est acceptable. Terraform téléchargera la version la plus récente correspondante lors de l'exécution de terraform init.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;talos = { ... } :&lt;ul&gt;
&lt;li&gt;Déclare que le fournisseur talos est nécessaire.&lt;/li&gt;
&lt;li&gt;source = "siderolabs/talos" : Indique que ce fournisseur provient de l'organisation siderolabs (les créateurs de Talos OS).&lt;/li&gt;
&lt;li&gt;version = "&amp;gt;= 0.6.0" : Spécifie que n'importe quelle version du fournisseur Talos égale ou supérieure à 0.6.0 est acceptable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bloc provider "numspot" {}&lt;ul&gt;
&lt;li&gt;Ce bloc configure le fournisseur numspot qui a été déclaré dans required_providers. C'est ici que vous donnez à Terraform les "clés" pour accéder à votre compte NumSpot.&lt;/li&gt;
&lt;li&gt;numspot_host = "https://api.cloudgouv-eu-west-1.numspot.com" : Définit l'URL du point de terminaison (endpoint) de l'API principale de NumSpot pour la région eu-west-1. C'est l'adresse que Terraform utilisera pour envoyer ses requêtes de gestion d'infrastructure.&lt;/li&gt;
&lt;li&gt;client_id = "ID du SA" : C'est l'identifiant de votre Compte de Service (SA) NumSpot. Vous devez remplacer "ID du SA" par votre véritable identifiant. Ce compte doit avoir les permissions nécessaires pour créer/modifier/supprimer les ressources définies dans votre code Terraform.&lt;/li&gt;
&lt;li&gt;client_secret = "Secret du SA" : C'est le secret associé à votre client_id. Vous devez remplacer "Secret du SA" par votre véritable secret. ATTENTION : Il est fortement déconseillé de stocker des secrets en clair directement dans les fichiers .tf. Utilisez plutôt des variables d'environnement (ex: NUMSPOT_CLIENT_SECRET) ou un fichier terraform.tfvars (ajouté au .gitignore) pour plus de sécurité.&lt;/li&gt;
&lt;li&gt;space_id = "Votre Space ID" : C'est l'identifiant de votre "Espace" (Space) NumSpot, qui correspond souvent à un projet ou un périmètre d'isolation logique au sein de votre organisation. Vous devez remplacer "Votre Space ID" par votre ID d'espace réel.&lt;/li&gt;
&lt;li&gt;numspot_host_os = "https://objectstorage.eu-west-2.numspot.com" : Définit l'URL du point de terminaison spécifique pour le service de Stockage Objet (Object Storage) de NumSpot, ici dans la région eu-west-2. Le fournisseur peut avoir besoin de cette information pour certaines opérations liées au stockage (par exemple, si vous gérez des buckets S3 ou téléchargez des images via ce service).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 variables et fichiers de configuration statiques ou templates&lt;/h3&gt;
&lt;p&gt;Nous allons avoir besoin de quelques variables.&lt;/p&gt;
&lt;p&gt;Ce fichier (vars.tf ou variables.tf) regroupe les paramètres que j'ai rendus configurables pour ce projet de déploiement de Talos sur NumSpot. &lt;/p&gt;
&lt;p&gt;L'idée est que vous puissiez adapter facilement le déploiement à vos besoins (nom du cluster, IPs, configuration des nœuds) sans toucher au cœur logique du code Terraform.&lt;/p&gt;
&lt;p&gt;Il faudra adapter les adresses IP en fonction des subnets que vous avez définis.&lt;/p&gt;
&lt;p&gt;Un des gros avantages de Talos c'est de pouvoir définir une &lt;code&gt;vip&lt;/code&gt; pour le control plane.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un fichier &lt;code&gt;vars.tf&lt;/code&gt; avec le code suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;cluster_name&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A name to provide for the Talos cluster&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numspot-talos&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;vip&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vip of k8s Talos cluster&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.230&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;variable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;node_data&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A map of node data&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.234&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.235&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.236&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.240&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;worker-1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;10.0.1.241&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/sda&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;worker-2&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Voici le détail des variables que j'ai définies :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;variable "cluster_name"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ici, vous définissez le nom que portera le cluster Talos que nous allons créer. Ce nom sera utilisé pour taguer certaines ressources ou dans la configuration Talos elle-même.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type attendu :&lt;/strong&gt; Une simple chaîne de caractères (&lt;code&gt;string&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valeur par défaut :&lt;/strong&gt; Si vous ne fournissez pas de nom spécifique, j'utiliserai &lt;code&gt;"numspot-Talos"&lt;/code&gt; par défaut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;variable "vip"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Cette variable sert à définir l'adresse IP virtuelle (VIP) que j'utiliserai comme point d'accès stable pour le control plane Kubernetes (l'API Server). C'est l'adresse que vous utiliserez généralement dans votre &lt;code&gt;kubeconfig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type attendu :&lt;/strong&gt; Une chaîne de caractères (&lt;code&gt;string&lt;/code&gt;) représentant une adresse IP valide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valeur par défaut :&lt;/strong&gt; J'ai mis &lt;code&gt;"10.0.1.230"&lt;/code&gt; par défaut, ce qui correspond à mon réseau de test. Adaptez-la à votre plan d'adressage réseau.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;variable "node_data"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; C'est la variable la plus structurée. Elle me permet de savoir exactement quels nœuds (control planes et workers) vous voulez dans votre cluster et quelques détails à leur sujet. Pour chaque nœud, je m'attends à trouver son adresse IP (qui sert de clé dans la map), le disque sur lequel je dois installer Talos (&lt;code&gt;install_disk&lt;/code&gt;), et éventuellement un nom d'hôte (&lt;code&gt;hostname&lt;/code&gt;) que vous souhaitez lui assigner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type attendu :&lt;/strong&gt; Un objet complexe (&lt;code&gt;object&lt;/code&gt;) contenant deux maps : &lt;code&gt;controlplanes&lt;/code&gt; et &lt;code&gt;workers&lt;/code&gt;. Chaque map associe une adresse IP (clé &lt;code&gt;string&lt;/code&gt;) à un objet contenant au moins &lt;code&gt;install_disk&lt;/code&gt; (&lt;code&gt;string&lt;/code&gt;) et optionnellement &lt;code&gt;hostname&lt;/code&gt; (&lt;code&gt;string&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valeur par défaut :&lt;/strong&gt; J'ai fourni une configuration par défaut assez complète pour vous montrer la structure attendue et permettre un démarrage rapide. Elle configure :&lt;ul&gt;
&lt;li&gt;Trois &lt;strong&gt;control planes&lt;/strong&gt; aux IPs &lt;code&gt;10.0.1.234&lt;/code&gt;, &lt;code&gt;10.0.1.235&lt;/code&gt;, &lt;code&gt;10.0.1.236&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deux &lt;strong&gt;workers&lt;/strong&gt; aux IPs &lt;code&gt;10.0.1.240&lt;/code&gt; (nommé &lt;code&gt;worker-1&lt;/code&gt;) et &lt;code&gt;10.0.1.241&lt;/code&gt; (nommé &lt;code&gt;worker-2&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Pour tous ces nœuds par défaut, j'installerai Talos sur le disque &lt;code&gt;/dev/sda&lt;/code&gt; (assurez-vous que c'est bien le disque que vous avez préparé sur vos VM NumSpot comme indiqué dans les prérequis !).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fichier &lt;code&gt;files/cp-scheduling.yaml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Contenu :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;allowSchedulingOnControlPlanes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Permet de déployer des workloads utilisateur sur les control-plane (vous pouvez mettre &lt;code&gt;false&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fichier &lt;code&gt;templates/node-configuration.yaml.tmpl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contenu :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;machine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;certSANs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${ dns_name }&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;if vip != &amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${vip}&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;install&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${install_disk}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${hostname}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;interfaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eth0&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;dhcp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;if vip != &amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;vip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${vip}&lt;/span&gt;
&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="p p-Indicator"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;endif&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;cluster&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;apiServer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;certSANs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;${ dns_name }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Permet de configurer des install disk différents, de mettre des hostname parlant et d'ajouter les SANs pour la vip et le fqdn du loadbalancer&lt;/p&gt;
&lt;h3&gt;2.3 les data  (ressources externes numspot)&lt;/h3&gt;
&lt;p&gt;Mon infrastructure Numspot possède déjà des composants déployés (ex: VPC, Subnets, IPs ...).&lt;/p&gt;
&lt;p&gt;Plutôt que de recréer un réseau à chaque fois, je pars du principe que vous avez déjà un VPC, un sous-réseau (subnet), et un groupe de sécurité (security group) prêts à l'emploi. &lt;/p&gt;
&lt;p&gt;Ce fichier sert à les "retrouver" pour que Terraform puisse les utiliser.&lt;/p&gt;
&lt;p&gt;Créez un fichier &lt;code&gt;data.tf&lt;/code&gt; avec le code suivant :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_vpcs&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;ds-vpc&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vpc-xxxxxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_subnets&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;ds-subnet&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;vpc_ids&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;data.numspot_vpcs.ds-vpc.items.0.id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_security_groups&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;ds-sg&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;security_group_ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sg-xxxxxxx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;null_resource&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;print-ds-vpc-id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;local-exec&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo data.numspot_vpcs.ds-vpc.items.0.id&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;null_resource&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;print-ds-subnet-id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;local-exec&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo data.numspot_subnets.ds-subnet.items.0.id&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;null_resource&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;print-ds-sg-id&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;provisioner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;local-exec&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;echo data.numspot_security_groups.ds-sg.items.0.id&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "numspot_vpcs" "ds-vpc"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ce bloc utilise une source de données (&lt;code&gt;data&lt;/code&gt;) Terraform pour rechercher des informations sur un VPC spécifique dans NumSpot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Je lui demande de chercher le VPC dont l'identifiant est &lt;code&gt;vpc-xxxxxxxx&lt;/code&gt;. Le nom que je lui donne dans Terraform est &lt;code&gt;ds-vpc&lt;/code&gt; (pour "data source VPC").&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; J'ai besoin de l'identifiant et potentiellement d'autres détails de ce VPC pour configurer le reste de l'infrastructure, notamment pour trouver le bon sous-réseau.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Important :&lt;/strong&gt; Vous &lt;strong&gt;devez remplacer &lt;code&gt;vpc-xxxxxxxx&lt;/code&gt;&lt;/strong&gt; par l'ID du VPC que vous souhaitez réellement utiliser dans votre environnement NumSpot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "numspot_subnets" "ds-subnet"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; De la même manière, je recherche ici un ou plusieurs sous-réseaux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Au lieu de chercher par ID de sous-réseau, je filtre en demandant les sous-réseaux qui appartiennent au VPC que j'ai trouvé juste avant (&lt;code&gt;data.numspot_vpcs.ds-vpc.items.0.id&lt;/code&gt;). J'utilise &lt;code&gt;.items.0.id&lt;/code&gt; car la source de données &lt;code&gt;numspot_vpcs&lt;/code&gt; renvoie une liste (même s'il n'y a qu'un seul VPC correspondant à l'ID), et je prends le premier élément (&lt;code&gt;0&lt;/code&gt;) de cette liste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Les machines virtuelles de notre cluster Talos devront être placées dans un sous-réseau spécifique. Ce bloc me permet d'obtenir l'ID de ce sous-réseau.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note :&lt;/strong&gt; Ce code suppose qu'il y a au moins un sous-réseau dans le VPC spécifié. Si vous en avez plusieurs, le code Terraform qui utilise &lt;code&gt;data.numspot_subnets.ds-subnet.items.0.id&lt;/code&gt; ciblera le premier sous-réseau retourné par l'API NumSpot. Assurez-vous que c'est bien celui que vous visez.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "numspot_security_groups" "ds-sg"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Je récupère ici les informations d'un groupe de sécurité existant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Comme pour le VPC, je le cible directement par son ID : &lt;code&gt;sg-xxxxxxxx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Les machines virtuelles auront besoin d'être associées à un groupe de sécurité pour contrôler le trafic entrant et sortant. Ce groupe doit déjà être configuré avec les règles nécessaires pour Talos et Kubernetes (par exemple, ouvrir les ports 6443, 50000, 50001, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Important :&lt;/strong&gt; Vous &lt;strong&gt;devez remplacer &lt;code&gt;sg-xxxxxxxx&lt;/code&gt;&lt;/strong&gt; par l'ID du groupe de sécurité que vous avez préparé pour ce cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "null_resource" "print-..."&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ces trois blocs (&lt;code&gt;print-ds-vpc-id&lt;/code&gt;, &lt;code&gt;print-ds-subnet-id&lt;/code&gt;, &lt;code&gt;print-ds-sg-id&lt;/code&gt;) sont un peu différents. Ils utilisent une ressource &lt;code&gt;null_resource&lt;/code&gt;, qui ne crée rien dans NumSpot. Associée à &lt;code&gt;provisioner "local-exec"&lt;/code&gt;, elle me permet simplement d'exécuter une commande sur la machine où vous lancez Terraform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; J'exécute une commande &lt;code&gt;echo&lt;/code&gt; qui affiche littéralement la chaîne de caractères correspondant au chemin d'accès Terraform vers l'ID de la ressource (par exemple, &lt;code&gt;echo data.numspot_vpcs.ds-vpc.items.0.id&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Je les ai ajoutés principalement à des fins de &lt;strong&gt;débogage&lt;/strong&gt; ou de &lt;strong&gt;vérification rapide&lt;/strong&gt;. Lorsque vous lancez &lt;code&gt;terraform apply&lt;/code&gt;, ces commandes s'exécuteront et afficheront les chemins d'accès dans la sortie. Cela ne montre pas la &lt;em&gt;valeur&lt;/em&gt; de l'ID, mais confirme que Terraform tente d'utiliser ces références. C'est une petite aide pour s'assurer que les data sources sont bien lues, même si pour voir les &lt;em&gt;vraies&lt;/em&gt; valeurs, il faudrait utiliser des &lt;code&gt;output&lt;/code&gt; ou une interpolation &lt;code&gt;${...}&lt;/code&gt; dans le &lt;code&gt;echo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note :&lt;/strong&gt; Ces ressources &lt;code&gt;null_resource&lt;/code&gt; n'ont aucun impact sur l'infrastructure créée et peuvent être retirées si vous les trouvez inutiles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.4 Les VMs et autres composants de l'infrastructure&lt;/h3&gt;
&lt;p&gt;Ce fichier contient les définitions des ressources principales que Terraform va créer et gérer sur NumSpot pour notre cluster Talos. 
On y trouve la création des VMs (Control Plane et Workers) et du Load Balancer nécessaire pour la haute disponibilité et l'accès externe à l'API Kubernetes.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un fichier infra.tf avec le code suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Création des VMs Controlplane&lt;/span&gt;
&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_vm&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;talos-cp&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;for_each&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;image_id&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ami-4a8eaf5a&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ns-eco6-2c8r&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;keypair_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;talos-keypair&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;subnet_id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_subnets.ds-subnet.items.0.id&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;security_group_ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;data.numspot_security_groups.ds-sg.items.0.id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;private_ips&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;talos-cp-${each.key}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Création des VMs Worker&lt;/span&gt;
&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_vm&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;talos-worker&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;for_each&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.workers&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;image_id&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ami-4a8eaf5a&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ns-eco6-2c8r&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;keypair_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;talos-keypair&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;subnet_id&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_subnets.ds-subnet.items.0.id&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;security_group_ids&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;data.numspot_security_groups.ds-sg.items.0.id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;private_ips&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;talos-worker-${each.value.hostname}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_load_balancer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;load-balancer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nlb001&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;listeners&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;load_balancer_port&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;backend_port&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;backend_protocol&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TCP&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;load_balancer_protocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TCP&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;subnets&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;data.numspot_subnets.ds-subnet.items.0.id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;security_groups&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;data.numspot_security_groups.ds-sg.items.0.id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;backend_vm_ids&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;numspot_vm.talos-cp[ip].id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;  // invalide  à l&amp;#39;heure actuelle - public_ip       = numspot_public_ip.lb-public-ip.public_ip&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;internet-facing&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;health_check&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;healthy_threshold&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;check_interval&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HTTPS&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/api/v1/namespaces/kube-public/configmaps/cluster-info&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="na"&gt;unhealthy_threshold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;numspot_load_balancers&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;load-balancer&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;load_balancer_names&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;numspot_load_balancer.load-balancer.name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;numspot_load_balancer.load-balancer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour le Health check je mets ça mais en fait ça ne peut pas marcher car tous les accès à l'API sont authentifiés. même la partie publique.&lt;/p&gt;
&lt;p&gt;Le problème c'est que je ne peux pas utiliser actuellement (bug ? ) un check TCP sur le port 6443 avec le provider numspot.&lt;/p&gt;
&lt;p&gt;Je patcherai plus tard le healthcheck via un call API pour le mettre à jour.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Ce fichier contient les définitions des ressources principales que Terraform va créer et gérer sur NumSpot pour notre cluster Talos. On y trouve la création des VMs (Control Plane et Workers) et du Load Balancer nécessaire pour la haute disponibilité et l'accès externe à l'API Kubernetes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "numspot_vm" "talos-cp"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ici, je définis les machines virtuelles qui serviront de nœuds &lt;strong&gt;Control Plane&lt;/strong&gt; pour notre cluster Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; J'utilise une boucle &lt;code&gt;for_each&lt;/code&gt; qui s'appuie sur la map &lt;code&gt;controlplanes&lt;/code&gt; de notre variable &lt;code&gt;var.node_data&lt;/code&gt; (définie dans &lt;code&gt;vars.tf&lt;/code&gt;). Pour chaque entrée dans cette map (chaque IP de control plane), Terraform créera une VM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration clé :&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;image_id = "ami-3b18dcca"&lt;/code&gt; : J'utilise une image spécifique de NumSpot. &lt;strong&gt;Attention, cet ID (&lt;code&gt;ami-3b18dcca&lt;/code&gt;) est l'ID de l'image Talos que nous avons créée manuellement dans la première étape du tuto.&lt;/strong&gt; Vous devrez remplacer cet ID par celui de &lt;em&gt;votre&lt;/em&gt; image Talos perso dans votre catalogue privé NumSpot.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type = "ns-eco6-2c8r"&lt;/code&gt; : Je choisis ce type d'instance (taille/puissance). Vous pouvez l'adapter selon vos besoins.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;keypair_name = "talos-keypair"&lt;/code&gt; : J'associe une paire de clés SSH préexistante nommée &lt;code&gt;talos-keypair&lt;/code&gt; à la VM. Même si Talos n'utilise pas SSH, NumSpot peut le requérir ou cela peut être utile pour certaines opérations de bas niveau (très rare avec Talos). Assurez-vous que cette keypair existe dans votre compte NumSpot.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subnet_id&lt;/code&gt; et &lt;code&gt;security_group_ids&lt;/code&gt; : J'utilise les informations du VPC/Subnet/Groupe de Sécurité que nous avons récupérées dans &lt;code&gt;data.tf&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;private_ips = [each.key]&lt;/code&gt; : C'est ici que j'attribue l'adresse IP privée fixe à chaque VM control plane. L'adresse IP provient directement de la &lt;em&gt;clé&lt;/em&gt; de la map &lt;code&gt;var.node_data.controlplanes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt;: Je mets un tag "name" sur chaque VM pour l'identifier facilement (ex: &lt;code&gt;talos-cp-10.0.1.234&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "numspot_vm" "talos-worker"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Très similaire au bloc précédent, mais celui-ci crée les machines virtuelles pour les nœuds &lt;strong&gt;Worker&lt;/strong&gt; de notre cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Utilise aussi une boucle &lt;code&gt;for_each&lt;/code&gt;, mais cette fois sur la map &lt;code&gt;workers&lt;/code&gt; de &lt;code&gt;var.node_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration clé :&lt;/strong&gt; Globalement identique aux control planes (même image, type, keypair, réseau), mais :&lt;ul&gt;
&lt;li&gt;&lt;code&gt;private_ips = [each.key]&lt;/code&gt; : Attribue l'IP privée fixe venant de la clé de la map &lt;code&gt;var.node_data.workers&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt;: Le tag "name" utilise ici le &lt;code&gt;hostname&lt;/code&gt; défini dans la valeur de la map (ex: &lt;code&gt;talos-worker-worker-1&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "numspot_load_balancer" "load-balancer"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Crée un &lt;strong&gt;Load Balancer&lt;/strong&gt; réseau (NLB) sur NumSpot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Il va répartir le trafic entrant destiné à l'API Kubernetes (sur le port 6443) entre les différentes VMs Control Plane que nous avons créées. C'est essentiel pour la haute disponibilité et pour avoir un point d'entrée unique (&lt;code&gt;vip&lt;/code&gt;) pour le cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration clé :&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name = "nlb001"&lt;/code&gt; : Je donne un nom fixe au Load Balancer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;listeners&lt;/code&gt;: Je configure l'écouteur pour recevoir du trafic TCP sur le port 6443 et le transférer vers les backends (nos control planes) sur le port 6443 également.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subnets&lt;/code&gt; &amp;amp; &lt;code&gt;security_groups&lt;/code&gt;: Je place le LB dans notre sous-réseau et lui associe notre groupe de sécurité (il faut que ce groupe autorise le trafic sur le port 6443).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backend_vm_ids&lt;/code&gt;: C'est ici que je connecte le LB aux VMs control plane. J'utilise une expression &lt;code&gt;for&lt;/code&gt; pour récupérer dynamiquement les IDs de toutes les VMs créées par le bloc &lt;code&gt;numspot_vm.talos-cp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public_ip&lt;/code&gt;: &lt;strong&gt;Note importante :&lt;/strong&gt; J'ai commenté cette ligne (&lt;code&gt;// invalide à l'heure actuelle - public_ip = ...&lt;/code&gt;). Cela suggère qu'au moment où j'ai écrit ce code, l'assignation directe d'une IP publique via cet attribut n'était pas fonctionnelle ou supportée par le provider NumSpot pour ce type de LB. Le LB sera donc probablement accessible via une IP publique assignée automatiquement ou nécessitera une étape manuelle/supplémentaire pour l'exposition sur Internet si &lt;code&gt;type = "internet-facing"&lt;/code&gt; fonctionne comme attendu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type = "internet-facing"&lt;/code&gt;: Indique que je veux que ce LB soit potentiellement accessible depuis Internet (même si l'IP publique n'est pas explicitement définie ici).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;health_check&lt;/code&gt;: Je définis comment le LB vérifie si les control planes sont opérationnels. Il essaie de contacter un endpoint spécifique de l'API Kubernetes (&lt;code&gt;/api/v1/.../cluster-info&lt;/code&gt;) sur le port 6443 en HTTPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "numspot_load_balancers" "load-balancer"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ce bloc ne &lt;em&gt;crée&lt;/em&gt; rien, il &lt;em&gt;lit&lt;/em&gt; des informations sur le Load Balancer que nous venons juste de définir dans le bloc &lt;code&gt;resource&lt;/code&gt; précédent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Il recherche un LB ayant le nom &lt;code&gt;nlb001&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Souvent, on utilise une source de données comme celle-ci juste après avoir créé une ressource pour récupérer des attributs qui ne sont connus qu'après la création (comme un DNS Name généré automatiquement par NumSpot pour le LB). Le &lt;code&gt;depends_on = [numspot_load_balancer.load-balancer]&lt;/code&gt; est crucial : il garantit que Terraform essaiera de lire ces informations &lt;em&gt;seulement après&lt;/em&gt; que la création du LB soit terminée. Cela évite les erreurs si on essayait de lire trop tôt. Dans ce code précis, les informations lues ne semblent pas être utilisées immédiatement, mais c'est une bonne pratique de l'avoir si on prévoit d'utiliser des attributs dynamiques du LB plus tard (par exemple dans un fichier d'output).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2.5 La configuration du cluster Talos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Créez un fichier talos-cluster.tf avec le code suivant :&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_secrets&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;this&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_configuration&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;controlplane&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;numspot_load_balancer.load-balancer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;cluster_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.cluster_name&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;cluster_endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://10.0.1.230:6443&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_type&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;controlplane&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_secrets&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.machine_secrets&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_configuration&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;worker&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;numspot_load_balancer.load-balancer&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;cluster_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.cluster_name&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;cluster_endpoint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://10.0.1.230:6443&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_type&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;worker&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_secrets&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.machine_secrets&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_client_configuration&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;this&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;cluster_name&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.cluster_name&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.client_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;endpoints&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_configuration_apply&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;controlplane&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_configuration&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.client_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_configuration_input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.talos_machine_configuration.controlplane.machine_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;for_each&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;config_patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nf"&gt;templatefile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${path.module}/templates/node-configuration.yaml.tmpl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%s-cp-%s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.cluster_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.hostname&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.install_disk&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;vip&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.vip&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;public_ip&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_load_balancers.load-balancer.items.0.public_ip&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;dns_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_load_balancers.load-balancer.items.0.dns_name&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nf"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${path.module}/files/cp-scheduling.yaml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_configuration_apply&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;worker&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_configuration&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.client_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;machine_configuration_input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.talos_machine_configuration.worker.machine_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;for_each&lt;/span&gt;&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.workers&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;config_patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nf"&gt;templatefile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${path.module}/templates/node-configuration.yaml.tmpl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%s-worker-%s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.cluster_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;var.node_data.workers&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.key&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.hostname&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;install_disk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;each.value.install_disk&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;vip&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;public_ip&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_load_balancers.load-balancer.items.0.public_ip&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="na"&gt;dns_name&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.numspot_load_balancers.load-balancer.items.0.dns_name&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_machine_bootstrap&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;this&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;talos_machine_configuration_apply.controlplane&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.client_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;talos_cluster_kubeconfig&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;this&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;talos_machine_bootstrap.this&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;client_configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_machine_secrets.this.client_configuration&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;var.node_data.controlplanes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;k&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;local_file&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;talosconfig&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;data.talos_client_configuration.this.talos_config&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${path.module}/${var.cluster_name}/talosconfig&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;&amp;quot;local_file&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;&amp;quot;kubeconfig&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;talos_cluster_kubeconfig.this.kubeconfig_raw&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${path.module}/${var.cluster_name}/kubeconfig&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ce fichier est entièrement dédié à l'interaction avec Talos lui-même, une fois que les VMs de base sont (ou sont en train d'être) créées par infra.tf. J'utilise ici le provider Terraform siderolabs/talos pour générer les configurations spécifiques à Talos, les appliquer aux nœuds, et finalement bootstrapper le cluster Kubernetes. C'est ici que la "magie" Talos opère.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "talos_machine_secrets" "this"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; C'est la première étape essentielle pour Talos. Je demande au provider de générer tous les secrets cryptographiques nécessaires (certificats PKI, clés) pour sécuriser le cluster et les communications entre les nœuds et avec le client (&lt;code&gt;talosctl&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Talos est sécurisé par défaut et repose sur mTLS. Cette ressource gère toute la complexité de la génération de cette PKI.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "talos_machine_configuration" "controlplane"&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;data "talos_machine_configuration" "worker"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Ces blocs &lt;em&gt;ne créent rien&lt;/em&gt; sur les machines, ils utilisent des &lt;em&gt;data sources&lt;/em&gt; du provider Talos pour générer les &lt;strong&gt;fichiers de configuration de base&lt;/strong&gt; pour les control planes et les workers, mais &lt;em&gt;en mémoire&lt;/em&gt;. C'est l'équivalent de ce que &lt;code&gt;talosctl gen config&lt;/code&gt; ferait, mais intégré à Terraform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; J'ai besoin d'une configuration standard pour chaque type de nœud, basée sur le nom du cluster (&lt;code&gt;var.cluster_name&lt;/code&gt;), l'endpoint (j'utilise ici directement la VIP &lt;code&gt;10.0.1.230&lt;/code&gt; définie dans &lt;code&gt;vars.tf&lt;/code&gt; – assurez-vous qu'elle correspond à votre &lt;code&gt;var.vip&lt;/code&gt;!), le type de machine (&lt;code&gt;controlplane&lt;/code&gt; ou &lt;code&gt;worker&lt;/code&gt;) et les secrets générés juste avant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépendance :&lt;/strong&gt; J'ai mis &lt;code&gt;depends_on = [numspot_load_balancer.load-balancer]&lt;/code&gt; pour m'assurer que la génération de cette config (même si elle n'utilise pas &lt;em&gt;directement&lt;/em&gt; le LB &lt;em&gt;ici&lt;/em&gt;) n'ait lieu qu'après la création du LB, car les étapes suivantes &lt;em&gt;vont&lt;/em&gt; utiliser les informations du LB.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;data "talos_client_configuration" "this"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Génère, toujours en mémoire, la configuration client (&lt;code&gt;talosconfig&lt;/code&gt;) nécessaire pour que &lt;code&gt;talosctl&lt;/code&gt; (et le provider Terraform lui-même) puisse communiquer avec les nœuds Talos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Pour appliquer les configurations et lancer le bootstrap, le provider a besoin de savoir comment s'authentifier auprès des nœuds Talos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; J'utilise le nom du cluster, la partie "client" des secrets générés, et je lui fournis la liste des IPs des control planes comme points d'accès initiaux (&lt;code&gt;endpoints&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "talos_machine_configuration_apply" "controlplane"&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;resource "talos_machine_configuration_apply" "worker"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; C'est l'étape où j'applique &lt;strong&gt;effectivement&lt;/strong&gt; la configuration sur chaque nœud (VM). Le provider Terraform se connecte à l'API Talos de chaque machine (sur le port 50000) en utilisant la configuration client générée, et lui envoie sa configuration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; J'utilise &lt;code&gt;for_each&lt;/code&gt; pour boucler sur les IPs définies dans &lt;code&gt;var.node_data&lt;/code&gt; (comme pour la création des VMs). Pour chaque nœud (&lt;code&gt;node = each.key&lt;/code&gt;), je prends la configuration de base générée (&lt;code&gt;machine_configuration_input&lt;/code&gt;) et j'y ajoute des &lt;strong&gt;patchs&lt;/strong&gt; (&lt;code&gt;config_patches&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les Patchs (&lt;code&gt;config_patches&lt;/code&gt;) :&lt;/strong&gt; C'est là que je personnalise la configuration pour chaque nœud spécifique :&lt;ul&gt;
&lt;li&gt;J'utilise &lt;code&gt;templatefile&lt;/code&gt; pour lire un fichier modèle (&lt;code&gt;templates/node-configuration.yaml.tmpl&lt;/code&gt;) et y injecter des valeurs dynamiques :&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;hostname&lt;/code&gt; : soit celui défini dans &lt;code&gt;var.node_data&lt;/code&gt;, soit un nom généré automatiquement (ex: &lt;code&gt;numspot-talos-cp-0&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Le disque d'installation (&lt;code&gt;install_disk&lt;/code&gt;) pris depuis &lt;code&gt;var.node_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;La VIP (&lt;code&gt;var.vip&lt;/code&gt;) pour les control planes (vide pour les workers).&lt;/li&gt;
&lt;li&gt;L'IP publique (&lt;code&gt;public_ip&lt;/code&gt;) et le nom DNS (&lt;code&gt;dns_name&lt;/code&gt;) récupérés depuis le Load Balancer NumSpot (via la source de données &lt;code&gt;data.numspot_load_balancers.load-balancer&lt;/code&gt; que j'avais définie dans &lt;code&gt;infra.tf&lt;/code&gt; - c'est pour ça que la dépendance et la data source étaient importantes !).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pour les control planes, j'ajoute aussi un patch statique (&lt;code&gt;files/cp-scheduling.yaml&lt;/code&gt;), qui contient probablement des configurations spécifiques aux CPs (peut-être pour autoriser l'exécution de pods dessus, ou définir des taints/labels).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Important :&lt;/strong&gt; Ces blocs nécessitent que les fichiers &lt;code&gt;templates/node-configuration.yaml.tmpl&lt;/code&gt; et &lt;code&gt;files/cp-scheduling.yaml&lt;/code&gt; existent aux chemins indiqués.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "talos_machine_bootstrap" "this"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Une fois que tous les control planes ont leur configuration appliquée, je déclenche le processus de bootstrap sur &lt;strong&gt;un seul&lt;/strong&gt; des control planes. C'est l'équivalent de la commande &lt;code&gt;talosctl bootstrap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Cette étape initialise le cluster etcd et démarre réellement le control plane Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Je cible le premier control plane de ma liste (&lt;code&gt;[for k, v in var.node_data.controlplanes : k][0]&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépendance :&lt;/strong&gt; &lt;code&gt;depends_on = [talos_machine_configuration_apply.controlplane]&lt;/code&gt; garantit que je n'essaie pas de bootstrapper avant que les CPs soient configurés.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "talos_cluster_kubeconfig" "this"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Une fois le cluster bootstrappé, je demande à Talos (via le provider et en me connectant au premier control plane) de générer le fichier &lt;code&gt;kubeconfig&lt;/code&gt; pour pouvoir interagir avec le cluster Kubernetes via &lt;code&gt;kubectl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; C'est le sésame pour utiliser notre nouveau cluster !&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dépendance :&lt;/strong&gt; &lt;code&gt;depends_on = [talos_machine_bootstrap.this]&lt;/code&gt; assure que le bootstrap est terminé.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resource "local_file" "talosconfig"&lt;/code&gt;&lt;/strong&gt; et &lt;strong&gt;&lt;code&gt;resource "local_file" "kubeconfig"&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ce que ça fait :&lt;/strong&gt; Je prends les configurations client Talos (&lt;code&gt;talosconfig&lt;/code&gt;) et Kubernetes (&lt;code&gt;kubeconfig&lt;/code&gt;) qui ont été générées par les ressources précédentes, et je les écris dans des fichiers locaux sur la machine où Terraform est exécuté.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pourquoi :&lt;/strong&gt; Pour que vous puissiez facilement utiliser &lt;code&gt;talosctl --talosconfig=./numspot-talos/talosconfig ...&lt;/code&gt; et &lt;code&gt;kubectl --kubeconfig=./numspot-talos/kubeconfig ...&lt;/code&gt; après l'exécution de Terraform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comment :&lt;/strong&gt; Je les sauvegarde dans un sous-dossier portant le nom du cluster (ex: &lt;code&gt;./numspot-talos/&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Let's GO !&lt;/h2&gt;
&lt;h3&gt;3.1 Terraform init&lt;/h3&gt;
&lt;p&gt;Lancez la commande :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;terraform&lt;span class="w"&gt; &lt;/span&gt;init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La commande &lt;code&gt;terraform init&lt;/code&gt; est la &lt;strong&gt;première étape fondamentale&lt;/strong&gt; que vous devez exécuter lorsque vous commencez à travailler avec une nouvelle configuration Terraform ou lorsque vous modifiez certains aspects fondamentaux d'une configuration existante (comme les fournisseurs, les modules ou le backend).&lt;/p&gt;
&lt;p&gt;Son rôle principal est de &lt;strong&gt;préparer ton répertoire de travail&lt;/strong&gt; pour que Terraform puisse exécuter les autres commandes (&lt;code&gt;plan&lt;/code&gt;, &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;p&gt;Voici ce que &lt;code&gt;terraform init&lt;/code&gt; fait exactement :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialisation du Backend :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform lit le bloc &lt;code&gt;backend&lt;/code&gt; (s'il existe) dans ta configuration (généralement dans un fichier &lt;code&gt;terraform.tf&lt;/code&gt; ou &lt;code&gt;providers.tf&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Il configure la manière dont Terraform va stocker et accéder au &lt;strong&gt;fichier d'état&lt;/strong&gt; (&lt;code&gt;terraform.tfstate&lt;/code&gt;). Ce fichier est crucial car il contient la correspondance entre tes ressources Terraform et l'infrastructure réelle.&lt;/li&gt;
&lt;li&gt;Si aucun backend n'est spécifié, il utilise le backend local par défaut (le fichier &lt;code&gt;terraform.tfstate&lt;/code&gt; est stocké dans le même répertoire).&lt;/li&gt;
&lt;li&gt;Si un backend distant est configuré (comme S3, Azure Blob Storage, Terraform Cloud, etc.), &lt;code&gt;init&lt;/code&gt; vérifie la configuration et établit la connexion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Téléchargement des Fournisseurs (Providers) :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform analyse tes fichiers de configuration (&lt;code&gt;.tf&lt;/code&gt;) pour identifier tous les fournisseurs requis, déclarés dans les blocs &lt;code&gt;required_providers&lt;/code&gt; (comme &lt;code&gt;numspot/numspot&lt;/code&gt; ou &lt;code&gt;siderolabs/talos&lt;/code&gt; dans tes exemples).&lt;/li&gt;
&lt;li&gt;Il se connecte au &lt;strong&gt;Registre Terraform&lt;/strong&gt; (ou à une autre source spécifiée) pour trouver et télécharger le code exécutable (le plugin) de chaque fournisseur nécessaire, en respectant les contraintes de version que vous avez spécifiées (&lt;code&gt;version = "&amp;gt;= 1.0"&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Ces plugins sont stockés localement dans un sous-répertoire caché nommé &lt;code&gt;.terraform/providers&lt;/code&gt;. C'est ce code qui permet à Terraform de communiquer avec les API des différents services (NumSpot, Talos, AWS, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installation des Modules :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si ta configuration utilise des &lt;strong&gt;modules&lt;/strong&gt; (référencés via des blocs &lt;code&gt;module&lt;/code&gt;), &lt;code&gt;terraform init&lt;/code&gt; va les télécharger ou les copier.&lt;/li&gt;
&lt;li&gt;Les modules peuvent provenir de différentes sources :&lt;ul&gt;
&lt;li&gt;Registre Terraform&lt;/li&gt;
&lt;li&gt;Dépôts Git (comme GitHub)&lt;/li&gt;
&lt;li&gt;Chemins locaux sur ton disque dur&lt;/li&gt;
&lt;li&gt;Archives HTTP&lt;/li&gt;
&lt;li&gt;Buckets S3, GCS...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Les modules téléchargés sont également stockés dans le répertoire &lt;code&gt;.terraform/modules&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Initialisation des Modules Enfants :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si les modules que vous utilisez contiennent eux-mêmes des blocs &lt;code&gt;required_providers&lt;/code&gt; ou référencent d'autres modules, &lt;code&gt;terraform init&lt;/code&gt; s'occupe de ces dépendances de manière récursive.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Quand faut-il exécuter &lt;code&gt;terraform init&lt;/code&gt; ?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La &lt;strong&gt;première fois&lt;/strong&gt; que vous clonez ou crées une configuration Terraform.&lt;/li&gt;
&lt;li&gt;Chaque fois que vous &lt;strong&gt;ajoutez ou supprimes un fournisseur&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Chaque fois que vous &lt;strong&gt;ajoutez ou supprimes un module&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Chaque fois que vous &lt;strong&gt;modifiez la configuration du backend&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Il est souvent sûr et recommandé de l'exécuter si vous n'êtes pas sûr de l'état de ton répertoire de travail.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est une commande &lt;strong&gt;idempotente&lt;/strong&gt;, ce qui signifie que vous ouvez l'exécuter plusieurs fois sans effet négatif ; elle ne refera que ce qui est nécessaire.&lt;/p&gt;
&lt;h3&gt;3.2 Terraform apply&lt;/h3&gt;
&lt;p&gt;lancez la commande &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;terraform&lt;span class="w"&gt; &lt;/span&gt;apply
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La commande &lt;code&gt;terraform apply&lt;/code&gt; est l'étape où vous &lt;strong&gt;concrétisez les changements&lt;/strong&gt; décrits dans ta configuration Terraform. Après avoir potentiellement vérifié ce qui allait se passer avec &lt;code&gt;terraform plan&lt;/code&gt;, &lt;code&gt;terraform apply&lt;/code&gt; est la commande qui &lt;strong&gt;applique réellement ces changements à ton infrastructure réelle&lt;/strong&gt; (sur NumSpot, Talos, etc.).&lt;/p&gt;
&lt;p&gt;Voici ce que &lt;code&gt;terraform apply&lt;/code&gt; fait en détail :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lecture de la Configuration :&lt;/strong&gt; Comme &lt;code&gt;plan&lt;/code&gt;, il lit tous tes fichiers &lt;code&gt;.tf&lt;/code&gt; dans le répertoire courant pour comprendre l'état désiré de ton infrastructure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lecture de l'État Existant :&lt;/strong&gt; Il lit le fichier d'état (&lt;code&gt;terraform.tfstate&lt;/code&gt;, qu'il soit local ou distant via un backend) pour savoir quelles ressources Terraform gère déjà et comment elles sont configurées selon la &lt;em&gt;dernière&lt;/em&gt; exécution réussie.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Génération d'un Plan d'Exécution :&lt;/strong&gt; Il compare l'état désiré (issu de ta configuration) avec l'état actuel (issu du fichier d'état et potentiellement en interrogeant les fournisseurs pour vérifier l'état réel des ressources). Sur la base de cette comparaison, il détermine les actions nécessaires :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Créer&lt;/strong&gt; de nouvelles ressources qui sont dans ta configuration mais pas dans l'état.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mettre à jour&lt;/strong&gt; des ressources existantes dont la configuration a changé.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Détruire&lt;/strong&gt; des ressources qui sont dans l'état mais ne sont plus dans ta configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Affichage du Plan et Demande de Confirmation :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terraform te &lt;strong&gt;montre le plan d'exécution&lt;/strong&gt; qu'il vient de générer (exactement comme le ferait &lt;code&gt;terraform plan&lt;/code&gt;). Il liste toutes les ressources qui seront créées, modifiées ou détruites, avec les détails des changements.&lt;/li&gt;
&lt;li&gt;Ensuite, il te &lt;strong&gt;demande explicitement de confirmer&lt;/strong&gt; que vous souhaitez appliquer ce plan en tapant &lt;code&gt;yes&lt;/code&gt;. C'est une étape de sécurité cruciale pour éviter des modifications accidentelles.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exécution des Actions (si confirmé) :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si vous tapez &lt;code&gt;yes&lt;/code&gt;, Terraform commence à exécuter les actions listées dans le plan, dans l'ordre correct en respectant les dépendances entre les ressources.&lt;/li&gt;
&lt;li&gt;Il communique avec les &lt;strong&gt;fournisseurs&lt;/strong&gt; (NumSpot, Talos, etc.) via leurs API pour leur demander de créer, modifier ou supprimer les ressources réelles.&lt;/li&gt;
&lt;li&gt;Il affiche la progression de ces opérations en temps réel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mise à Jour du Fichier d'État :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Au fur et à mesure que les opérations réussissent, Terraform &lt;strong&gt;met à jour le fichier d'état (&lt;code&gt;terraform.tfstate&lt;/code&gt;)&lt;/strong&gt; pour refléter le nouvel état de l'infrastructure. Par exemple, si une nouvelle VM est créée, son ID unique fourni par NumSpot sera enregistré dans le fichier d'état. Cette mise à jour est &lt;em&gt;essentielle&lt;/em&gt; pour que les prochaines exécutions de Terraform sachent ce qui existe réellement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Affichage des Sorties (Outputs) :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une fois toutes les actions terminées avec succès, Terraform affiche les valeurs des éventuelles &lt;strong&gt;sorties&lt;/strong&gt; (&lt;code&gt;output&lt;/code&gt;) que vous avez définies dans ta configuration (comme le chemin du &lt;code&gt;kubeconfig&lt;/code&gt; ou l'IP du load balancer dans tes exemples).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est la commande principale pour &lt;strong&gt;gérer le cycle de vie de ton infrastructure&lt;/strong&gt; avec Terraform.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option importante :&lt;/strong&gt;
*   &lt;code&gt;terraform apply -auto-approve&lt;/code&gt; : Permet de sauter l'étape de confirmation manuelle (&lt;code&gt;yes&lt;/code&gt;). &lt;strong&gt;À utiliser avec prudence&lt;/strong&gt;, principalement dans des scripts d'automatisation (CI/CD) où un &lt;code&gt;terraform plan&lt;/code&gt; a déjà été validé au préalable.&lt;/p&gt;
&lt;h3&gt;3.3 Utilisation du cluster&lt;/h3&gt;
&lt;p&gt;L'apply est très rapide, par contre, la configuration sous-jacente de Talos peut être assez longue.&lt;/p&gt;
&lt;p&gt;Donc comment contrôler que tout va bien !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dashboard Talos &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans le répertoire  &lt;code&gt;numspot-talos&lt;/code&gt; vous avez ces fichiers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kubeconfig &lt;/li&gt;
&lt;li&gt;talosconfig&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exécutez la commande :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;talosctl&lt;span class="w"&gt; &lt;/span&gt;--talosconfig&lt;span class="w"&gt; &lt;/span&gt;numspot-talos/talosconfig&lt;span class="w"&gt; &lt;/span&gt;dashboard&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.1.234&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.1.234
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez faire cela sur l'ensemble des nœuds du cluster&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/numspot/t1.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accès à kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rien de plus simple !&lt;/p&gt;
&lt;p&gt;Exécutez la commande :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;numspot-talos/kubeconfig

kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes&lt;span class="w"&gt; &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl get nodes
NAME                 STATUS   ROLES           AGE    VERSION
numspot-talos-cp-0   Ready    control-plane   3d1h   v1.32.0
numspot-talos-cp-1   Ready    control-plane   3d1h   v1.32.0
numspot-talos-cp-2   Ready    control-plane   3d1h   v1.32.0
worker-1             Ready    &amp;lt;none&amp;gt;          3d1h   v1.32.0
worker-2             Ready    &amp;lt;none&amp;gt;          3d1h   v1.32.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si vous souhaitez utiliser le cluster avec l'API publique de votre loadbalancer &lt;/p&gt;
&lt;p&gt;Modifiez dans le kubeconfig &lt;code&gt;server: https://10.0.1.230:6443&lt;/code&gt; en  server: https://nlb001-CXXXX.cloudgouv-eu-west-1.lbu.outscale.com:6443&lt;/p&gt;
&lt;p&gt;Retrouvez l'URL dans le portail Numspot &lt;/p&gt;
&lt;p&gt;Pour que ça fonctionne il faut patcher le healthcheck du loadbalancer pour faire un ping TCP sur le port 6443.&lt;/p&gt;
&lt;p&gt;Créez un script update-lb.sh avec le contenu suivant :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c1"&gt;# Il faudra adapter si vous avez plusieurs LB&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;auth.sh

&lt;span class="nv"&gt;LBID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://api.cloudgouv-eu-west-1.numspot.com/compute/spaces/A MODIFIER/loadBalancers&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;GET&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.items[0].name&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;


curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://api.cloudgouv-eu-west-1.numspot.com/compute/spaces/A MODIFIER/&lt;/span&gt;&lt;span class="nv"&gt;$LBID&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--request&lt;span class="w"&gt; &lt;/span&gt;PUT&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--header&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Authorization: Bearer &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--data&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&lt;/span&gt;
&lt;span class="s1"&gt;  &amp;quot;healthCheck&amp;quot;: {&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;checkInterval&amp;quot;: 10,&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;healthyThreshold&amp;quot;: 3,&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;port&amp;quot;: 6443,&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;protocol&amp;quot;: &amp;quot;TCP&amp;quot;,&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;timeout&amp;quot;: 5,&lt;/span&gt;
&lt;span class="s1"&gt;    &amp;quot;unhealthyThreshold&amp;quot;: 5&lt;/span&gt;
&lt;span class="s1"&gt;  }&lt;/span&gt;
&lt;span class="s1"&gt;}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h2&gt;4. Améliorations&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Plein de choses à prévoir !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ce POC est un quick and dirty pour montrer qu'il est tout à fait possible de créer son propre cluster Talos sur Numspot.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il faudrait retravailler les configurations Terraform pour variabiliser les différents ID passés "en dur" !&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Conclusions&lt;/h2&gt;
&lt;p&gt;​NumSpot continue de gagner en maturité, offrant des solutions cloud souveraines de plus en plus robustes et adaptées aux besoins des entreprises. La plateforme propose une interface web intuitive, le portail, qui permet de gérer les ressources cloud de manière centralisée et sécurisée. &lt;/p&gt;
&lt;p&gt;Ce portail est conçu pour évoluer progressivement, intégrant de nouvelles fonctionnalités d'observabilité et de gestion des opérations afin de fournir une vue unifiée des services déployés.&lt;/p&gt;
&lt;p&gt;Par ailleurs, NumSpot adopte une approche « Infrastructure as Code » (IaC), offrant des interfaces standardisées compatibles avec des outils du marché tels que Terraform. &lt;/p&gt;
&lt;p&gt;Cette compatibilité permet aux ingénieurs de définir et de gérer l'infrastructure informatique à l'aide de fichiers de script ou de code, facilitant ainsi l'automatisation des actions sur le cloud&lt;/p&gt;
&lt;p&gt;Cependant, bien que ces avancées soient prometteuses, il est important de noter que le portail et le provider Terraform de NumSpot nécessitent encore des enrichissements pour exploiter pleinement toutes les fonctionnalités de l'API.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Maîtriser l'Affinité et l'Anti-Affinité Pod/Node</title><link href="https://blogppr.alterway.fr/maitriser-laffinite-et-lanti-affinite-podnode.html" rel="alternate"></link><published>2025-04-02T10:00:00+02:00</published><updated>2025-04-02T10:00:00+02:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-04-02:/maitriser-laffinite-et-lanti-affinite-podnode.html</id><summary type="html">&lt;p&gt;Kubernetes : Maîtriser l'Affinité et l'Anti-Affinité Pod/Node&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Kubernetes : Maîtriser l'Affinité et l'Anti-Affinité Pod/Node&lt;/h1&gt;
&lt;p&gt;Kubernetes est un formidable orchestrateur, mais par défaut, son scheduler place les pods là où il y a des ressources disponibles, sans forcément prendre en compte des contraintes plus fines. &lt;/p&gt;
&lt;p&gt;C'est là qu'interviennent les mécanismes d'&lt;strong&gt;Affinité&lt;/strong&gt; et d'&lt;strong&gt;Anti-Affinité&lt;/strong&gt;, des outils puissants pour influencer la décision du scheduler et placer vos pods de manière plus intelligente.&lt;/p&gt;
&lt;p&gt;Dans cet article, nous allons démystifier ces concepts, en expliquant simplement comment ils fonctionnent au niveau des Nœuds (Nodes) et des Pods, avec des exemples concrets et des cas d'usage.&lt;/p&gt;
&lt;h2&gt;Pourquoi aller au-delà du Scheduling par Défaut ?&lt;/h2&gt;
&lt;p&gt;Le scheduler de Kubernetes fait un bon travail pour répartir la charge, mais parfois, vous avez besoin de plus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance :&lt;/strong&gt; Placer un pod applicatif près de sa base de données ou de son cache pour réduire la latence réseau.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Haute Disponibilité (HA) :&lt;/strong&gt; S'assurer que les réplikas d'une application critique ne tournent pas tous sur la même machine physique (ou dans la même zone de disponibilité) pour éviter un point unique de défaillance (SPOF).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contraintes Matérielles/Logicielles :&lt;/strong&gt; Forcer un pod à tourner sur un nœud disposant d'un matériel spécifique (GPU, SSD rapide) ou d'une licence particulière.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolation :&lt;/strong&gt; Éviter que des pods très consommateurs en ressources ne se retrouvent sur le même nœud et ne s'impactent mutuellement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Réglementation/Localisation :&lt;/strong&gt; Contraindre des pods à s'exécuter dans une région géographique spécifique.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est pour répondre à ces besoins que l'Affinité et l'Anti-Affinité existent.&lt;/p&gt;
&lt;h2&gt;Comprendre les Concepts Clés&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Affinité (Affinity) :&lt;/strong&gt; Règle qui &lt;em&gt;attire&lt;/em&gt; des pods vers certaines cibles (nœuds ou autres pods). "Je &lt;em&gt;veux&lt;/em&gt; tourner ici, ou près de ce pod."&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Anti-Affinité (Anti-Affinity) :&lt;/strong&gt; Règle qui &lt;em&gt;repousse&lt;/em&gt; des pods de certaines cibles. "Je &lt;em&gt;ne veux pas&lt;/em&gt; tourner ici, ou près de ce pod."&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Niveau Node :&lt;/strong&gt; Les règles concernent les caractéristiques des nœuds (labels).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Niveau Pod :&lt;/strong&gt; Les règles concernent la présence d'autres pods sur les nœuds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Labels &amp;amp; Selectors :&lt;/strong&gt; Le cœur du système. Les nœuds et les pods sont identifiés par des labels (paires clé/valeur), et les règles d'affinité/anti-affinité utilisent des selectors pour cibler ces labels.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;topologyKey&lt;/code&gt; :&lt;/strong&gt; Utilisé pour l'affinité/anti-affinité de pods. Définit le "domaine" de la règle : est-ce que les pods doivent être sur le &lt;em&gt;même nœud&lt;/em&gt; (&lt;code&gt;kubernetes.io/hostname&lt;/code&gt;), dans la &lt;em&gt;même zone&lt;/em&gt; (&lt;code&gt;topology.kubernetes.io/zone&lt;/code&gt;), ou dans la &lt;em&gt;même région&lt;/em&gt; (&lt;code&gt;topology.kubernetes.io/region&lt;/code&gt;) ?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Types de Règles :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;requiredDuringSchedulingIgnoredDuringExecution&lt;/code&gt; : Règle &lt;strong&gt;stricte&lt;/strong&gt;. Le pod ne sera &lt;em&gt;pas&lt;/em&gt; schedulé si la règle ne peut être satisfaite. Si les conditions changent &lt;em&gt;après&lt;/em&gt; le scheduling (ex: label de nœud modifié), le pod continue de tourner (IgnoredDuringExecution). C'est la plus courante.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/code&gt; : Règle &lt;strong&gt;préférentielle&lt;/strong&gt; (soft). Le scheduler &lt;em&gt;essaiera&lt;/em&gt; de satisfaire la règle, mais placera le pod ailleurs si ce n'est pas possible. Un poids (&lt;code&gt;weight&lt;/code&gt;, entre 1 et 100) permet de prioriser plusieurs règles préférentielles.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(Note : Il existe aussi &lt;code&gt;requiredDuringSchedulingRequiredDuringExecution&lt;/code&gt;, mais il est moins courant et peut causer des évictions de pods si les conditions changent, ce qui peut être perturbateur).&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;1. Affinité de Nœud (Node Affinity)&lt;/h2&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/affantiaff/node-affinity.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Attirer un pod vers des nœuds ayant des caractéristiques spécifiques (labels).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Syntaxe :&lt;/strong&gt; Se configure dans le &lt;code&gt;spec.affinity.nodeAffinity&lt;/code&gt; du Pod.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Pod&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-pod-rapide&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;affinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;nodeAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Règle STRICTE&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;requiredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;nodeSelectorTerms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;disktype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Le label du nœud&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# L&amp;#39;opérateur (In, NotIn, Exists, DoesNotExist, Gt, Lt)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ssd&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# La valeur recherchée&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Règle PRÉFÉRENTIELLE&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;50&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# Poids de la préférence (1-100)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;preference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;topology.kubernetes.io/zone&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eu-west-1a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Préfère cette zone&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;30&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;preference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;topology.kubernetes.io/zone&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;eu-west-1b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Sinon, préfère celle-ci&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-conteneur&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nginx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication des Exemples :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required...&lt;/code&gt; :&lt;/strong&gt; Ce pod &lt;strong&gt;doit&lt;/strong&gt; être placé sur un nœud ayant le label &lt;code&gt;disktype=ssd&lt;/code&gt;. Si aucun nœud ne correspond, le pod restera en attente (Pending).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;preferred...&lt;/code&gt; :&lt;/strong&gt; Le scheduler &lt;strong&gt;préférera&lt;/strong&gt; (avec un poids de 50) placer le pod sur un nœud dans la zone &lt;code&gt;eu-west-1a&lt;/code&gt;. S'il ne peut pas, il essaiera (avec un poids de 30) la zone &lt;code&gt;eu-west-1b&lt;/code&gt;. S'il ne peut toujours pas, il le placera sur n'importe quel autre nœud disponible répondant à la règle &lt;code&gt;required&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Schéma Conceptuel :&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; Pod (veut disktype=ssd)   ─────►   Node 1 (disktype=ssd)  [OK]
                              │
                              └─X──►   Node 2 (disktype=hdd)  [Ignoré par &amp;#39;required&amp;#39;]

 Pod (préfère zone=a)      ───(Poids 50)───► Node 3 (zone=a) [Choix préféré]
                              │
                              ───(Poids 30)───► Node 4 (zone=b) [Second choix]
                              │
                              ───(Poids 0)────► Node 5 (zone=c) [Dernier recours]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cas d'Usage :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Placer des pods nécessitant des I/O rapides sur des nœuds avec SSD (&lt;code&gt;disktype=ssd&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Placer des pods nécessitant des GPU sur des nœuds équipés (&lt;code&gt;hardware=gpu-tesla-v100&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Contraindre des pods à une zone ou région spécifique pour des raisons de latence ou de conformité (&lt;code&gt;topology.kubernetes.io/zone=us-east-1&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Utiliser des nœuds avec des licences logicielles spécifiques.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Anti-Affinité de Nœud (Node Anti-Affinity)&lt;/h2&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/affantiaff/node-anti-affinity.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Empêcher un pod d'être schedulé sur des nœuds ayant certaines caractéristiques.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note importante :&lt;/strong&gt; Il n'existe pas de section &lt;code&gt;nodeAntiAffinity&lt;/code&gt; dédiée. L'anti-affinité de nœud est réalisée en utilisant &lt;code&gt;nodeAffinity&lt;/code&gt; avec les opérateurs &lt;code&gt;NotIn&lt;/code&gt; ou &lt;code&gt;DoesNotExist&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Syntaxe :&lt;/strong&gt; Toujours dans &lt;code&gt;spec.affinity.nodeAffinity&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Pod&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pod-sans-gpu&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;affinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;nodeAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;requiredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;nodeSelectorTerms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;hardware&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Le label du nœud&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;DoesNotExist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Ne doit PAS avoir ce label&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;gpu-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Ou, si le label existe...&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;NotIn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Sa valeur ne doit PAS être celles-ci&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nvidia-a100&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nvidia-v100&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;80&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;preference&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;maintenance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Label indiquant une maintenance prévue&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;DoesNotExist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Préfère éviter les nœuds en maintenance&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-conteneur&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;busybox&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sleep&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;3600&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication des Exemples :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required...&lt;/code&gt; :&lt;/strong&gt; Ce pod &lt;strong&gt;ne doit pas&lt;/strong&gt; être placé sur un nœud ayant le label &lt;code&gt;hardware&lt;/code&gt; (quelque soit sa valeur) OU sur un nœud dont le label &lt;code&gt;gpu-type&lt;/code&gt; a la valeur &lt;code&gt;nvidia-a100&lt;/code&gt; ou &lt;code&gt;nvidia-v100&lt;/code&gt;. Utile si le pod n'a pas besoin de GPU et que vous voulez réserver ces nœuds coûteux.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;preferred...&lt;/code&gt; :&lt;/strong&gt; Le scheduler &lt;strong&gt;évitera&lt;/strong&gt; (avec un poids élevé de 80) de placer le pod sur des nœuds ayant le label &lt;code&gt;maintenance&lt;/code&gt;. S'il ne trouve que des nœuds avec ce label (et qui satisfont la règle &lt;code&gt;required&lt;/code&gt;), il le placera quand même là.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Schéma Conceptuel :&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; Pod (ne veut pas gpu=nvidia) ───X──► Node 1 (gpu-type=nvidia-a100) [Rejeté par &amp;#39;required&amp;#39;]
                              │
                              └───►   Node 2 (pas de label gpu)   [OK]


 Pod (préfère éviter maintenance=true) ───(Poids 80 Éviter)───► Node 3 (maintenance=true) [Choix évité si possible]
                                     │
                                     ───(Poids 0)──────────► Node 4 (pas de label maintenance) [Choix préféré]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cas d'Usage :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Éviter de placer des pods "normaux" sur des nœuds coûteux (GPU, grosse mémoire) réservés à des tâches spécifiques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Éviter des nœuds marqués pour maintenance (&lt;code&gt;maintenance=true&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Éviter des nœuds avec une architecture CPU spécifique si l'application n'est pas compatible (&lt;code&gt;kubernetes.io/arch != arm64&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;3. Affinité de Pod (Pod Affinity)&lt;/h2&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/affantiaff/pod-affinity.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Attirer un pod vers des nœuds où &lt;em&gt;d'autres pods&lt;/em&gt; (correspondant à certains labels) sont déjà en cours d'exécution. Idéal pour la co-localisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Syntaxe :&lt;/strong&gt; Se configure dans le &lt;code&gt;spec.affinity.podAffinity&lt;/code&gt; du Pod. Nécessite un &lt;code&gt;topologyKey&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Pod&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;web-server&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;frontend&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Label pour être ciblé par d&amp;#39;autres&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;affinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;podAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Règle STRICTE&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;requiredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labelSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;app&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# Cherche des pods avec ce label...&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;cache&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="c1"&gt;# ...et cette valeur (le pod cache)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;topologyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kubernetes.io/hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Doit être sur le MÊME NŒUD&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Règle PRÉFÉRENTIELLE&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;70&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;podAffinityTerm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;labelSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;app&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;api-gateway&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;topologyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;topology.kubernetes.io/zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Préfère être dans la MÊME ZONE que l&amp;#39;API Gateway&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;web-container&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nginx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication des Exemples :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required...&lt;/code&gt; :&lt;/strong&gt; Ce pod &lt;code&gt;web-server&lt;/code&gt; &lt;strong&gt;doit&lt;/strong&gt; être schedulé sur un nœud (&lt;code&gt;topologyKey: kubernetes.io/hostname&lt;/code&gt;) où au moins un pod ayant le label &lt;code&gt;app=cache&lt;/code&gt; est déjà en cours d'exécution. Si aucun nœud ne remplit cette condition, le pod restera Pending.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;preferred...&lt;/code&gt; :&lt;/strong&gt; Le scheduler &lt;strong&gt;préférera&lt;/strong&gt; (poids 70) placer ce pod dans la même zone de disponibilité (&lt;code&gt;topologyKey: topology.kubernetes.io/zone&lt;/code&gt;) qu'un pod ayant le label &lt;code&gt;app=api-gateway&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Schéma Conceptuel :&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; Pod Web (veut app=cache, même nœud)   ─────► Node 1 (contient Pod Cache (app=cache)) [OK]
                                       │
                                       └─X──► Node 2 (pas de Pod Cache)         [Ignoré par &amp;#39;required&amp;#39;]


 Pod Web (préfère app=api, même zone) ───(Poids 70)───► Node 3 (Zone A, contient Pod API (app=api)) [Choix préféré]
                                      │
                                      ───(Poids 0)────► Node 4 (Zone B, pas de Pod API)      [Moins préféré]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cas d'Usage :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance :&lt;/strong&gt; Placer un serveur web (&lt;code&gt;app=frontend&lt;/code&gt;) sur le même nœud (&lt;code&gt;topologyKey: kubernetes.io/hostname&lt;/code&gt;) qu'un cache en mémoire (&lt;code&gt;app=cache&lt;/code&gt;) pour une latence minimale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Localité des données :&lt;/strong&gt; Placer des pods de traitement analytique (&lt;code&gt;app=analytics&lt;/code&gt;) dans la même zone (&lt;code&gt;topologyKey: topology.kubernetes.io/zone&lt;/code&gt;) que les pods de base de données (&lt;code&gt;app=database&lt;/code&gt;) qu'ils interrogent fréquemment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regrouper des microservices très communicants.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Anti-Affinité de Pod (Pod Anti-Affinity)&lt;/h2&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/affantiaff/pod-anti-affinity.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Empêcher un pod d'être schedulé sur des nœuds où &lt;em&gt;d'autres pods&lt;/em&gt; (correspondant à certains labels) sont déjà en cours d'exécution. Idéal pour la haute disponibilité et l'isolation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Syntaxe :&lt;/strong&gt; Se configure dans le &lt;code&gt;spec.affinity.podAntiAffinity&lt;/code&gt; du Pod. Nécessite aussi un &lt;code&gt;topologyKey&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deployment&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ma-db-ha&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;3&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Important pour que l&amp;#39;anti-affinité se cible elle-même&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Le template du Pod&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Le label que l&amp;#39;anti-affinité va rechercher&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;affinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;podAntiAffinity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Règle STRICTE pour la Haute Disponibilité&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;requiredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;labelSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;app&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Cherche des pods avec ce label...&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;database&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# ...et cette valeur (les autres réplikas de moi-même)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;topologyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kubernetes.io/hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# NE PAS être sur le MÊME NŒUD&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;# Règle PRÉFÉRENTIELLE pour encore plus de résilience&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;preferredDuringSchedulingIgnoredDuringExecution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;100&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;podAffinityTerm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;labelSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;matchExpressions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;app&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;In&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;database&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;topologyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;topology.kubernetes.io/zone&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Préfère NE PAS être dans la MÊME ZONE&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;db-container&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;postgres:15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication des Exemples :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;required...&lt;/code&gt; :&lt;/strong&gt; Chaque nouveau pod de ce Deployment (&lt;code&gt;app=database&lt;/code&gt;) &lt;strong&gt;ne doit pas&lt;/strong&gt; être placé sur un nœud (&lt;code&gt;topologyKey: kubernetes.io/hostname&lt;/code&gt;) où un autre pod avec le label &lt;code&gt;app=database&lt;/code&gt; est déjà présent. Cela garantit que les 3 réplikas seront sur 3 nœuds distincts (si possible).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;preferred...&lt;/code&gt; :&lt;/strong&gt; De plus, le scheduler &lt;strong&gt;tentera fortement&lt;/strong&gt; (poids 100) d'éviter de placer les réplikas dans la même zone de disponibilité (&lt;code&gt;topologyKey: topology.kubernetes.io/zone&lt;/code&gt;). Si vous avez assez de nœuds répartis sur plusieurs zones, cela augmente encore la résilience. Si tous les nœuds disponibles sont dans la même zone, cette règle "soft" sera ignorée, mais la règle "hard" sur les nœuds sera toujours respectée.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Schéma Conceptuel :&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; Pod DB Replica 1 ────► Node 1 (Zone A)

 Pod DB Replica 2 ───X──► Node 1 (déjà un Pod DB)
                  │
                  └───► Node 2 (Zone A) [OK pour &amp;#39;required&amp;#39;, mais pas idéal pour &amp;#39;preferred&amp;#39;]


 Pod DB Replica 3 ───X──► Node 1 (déjà un Pod DB)
                  │
                  ───X──► Node 2 (déjà un Pod DB)
                  │
                  └───► Node 3 (Zone B) [OK pour &amp;#39;required&amp;#39;, et OK pour &amp;#39;preferred&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cas d'Usage :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Haute Disponibilité :&lt;/strong&gt; Assurer que les réplikas d'une application stateful (ex: base de données, etcd) sont répartis sur différents nœuds physiques (&lt;code&gt;topologyKey: kubernetes.io/hostname&lt;/code&gt;) ou même différentes zones/régions (&lt;code&gt;topologyKey: topology.kubernetes.io/zone&lt;/code&gt;) pour survivre à une panne matérielle ou de zone. C'est le cas d'usage le plus fréquent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolation des Ressources :&lt;/strong&gt; Éviter que plusieurs instances d'un pod très gourmand en CPU ou mémoire ne tournent sur le même nœud et ne se concurrencent (`topologyKey: &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Sécurité :&lt;/strong&gt; Répartir les composants d'une application pour limiter l'impact d'une compromission d'un nœud.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bonnes Pratiques et Points d'Attention&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicité :&lt;/strong&gt; N'abusez pas des règles complexes. Trop de contraintes peuvent rendre le scheduling difficile, voire impossible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Labels Cohérents :&lt;/strong&gt; La puissance de ces mécanismes repose sur une stratégie de labeling claire et cohérente pour vos nœuds et vos pods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choix du &lt;code&gt;topologyKey&lt;/code&gt; :&lt;/strong&gt; Réfléchissez bien au domaine d'application de vos règles de Pod (Anti-)Affinity (&lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;zone&lt;/code&gt;, &lt;code&gt;region&lt;/code&gt;, ou même des labels custom sur vos nœuds).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;IgnoredDuringExecution&lt;/code&gt; :&lt;/strong&gt; Rappelez-vous que ces règles sont évaluées &lt;em&gt;au moment du scheduling&lt;/em&gt;. Si les conditions changent après (un label de nœud est retiré, un pod co-localisé est supprimé), le pod ne sera pas automatiquement déplacé ou supprimé (sauf si vous utilisez les règles &lt;code&gt;RequiredDuringExecution&lt;/code&gt;, moins courantes).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance du Scheduler :&lt;/strong&gt; Des règles d'anti-affinité complexes sur un grand nombre de pods peuvent ralentir le scheduler. Utilisez-les judicieusement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Combinaison :&lt;/strong&gt; Vous pouvez combiner plusieurs types d'affinité (node, pod, anti-affinité) dans un même Pod spec pour des scénarios avancés.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;L'Affinité et l'Anti-Affinité Node/Pod sont des outils essentiels dans la boîte à outils de tout administrateur ou développeur Kubernetes souhaitant optimiser le placement de ses charges de travail. &lt;/p&gt;
&lt;p&gt;En maîtrisant les règles &lt;code&gt;required&lt;/code&gt; et &lt;code&gt;preferred&lt;/code&gt;, les &lt;code&gt;labelSelectors&lt;/code&gt; et les &lt;code&gt;topologyKeys&lt;/code&gt;, vous pouvez aller bien au-delà du scheduling par défaut pour améliorer la performance, la résilience et l'efficacité de vos applications conteneurisées.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Kubernetes 1.33</title><link href="https://blogppr.alterway.fr/kubernetes-133.html" rel="alternate"></link><published>2025-03-31T10:00:00+02:00</published><updated>2025-03-31T10:00:00+02:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-03-31:/kubernetes-133.html</id><summary type="html">&lt;p&gt;Kubernetes 1.33 : Nouveautés Réseau, Sécurité et Expérience Admin&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Kubernetes 1.33 : Nouveautés Réseau, Sécurité et Expérience Admin&lt;/h1&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kubernetes 1.33 doit sortir le Mercredi 23 avril 2025&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kubernetes continue son évolution rapide avec la sortie de la version 1.33. &lt;/p&gt;
&lt;p&gt;Cette nouvelle itération apporte son lot de fonctionnalités graduées vers la stabilité (GA), de nouvelles capacités en bêta et alpha, ainsi que des améliorations de performance et de sécurité notables. &lt;/p&gt;
&lt;p&gt;Voici les points les plus importants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kubernetes 1.33 stabilise les Sidecars, le proxy nftables et l'API ServiceCIDR. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'API v1 Endpoints est dépréciée, les fournisseurs cloud intégrés sont retirés. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sécurité et performances renforcées incluses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Explorons les autres points forts de cette version.&lt;/p&gt;
&lt;h2&gt;Kubernetes 1.33 : Points les plus structurants&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dépréciation Officielle de l'API v1 Endpoints&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Très élevé. Bien que l'API ne soit pas supprimée immédiatement, c'est un signal fort pour &lt;strong&gt;migrer impérativement vers l'API EndpointSlice&lt;/strong&gt;. Toutes les nouvelles fonctionnalités et optimisations réseau se concentreront sur EndpointSlice. Les utilisateurs et les outils doivent planifier cette transition.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.3)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suppression Finale des Flags Cloud Provider In-Tree (&lt;code&gt;--cloud-provider&lt;/code&gt;, &lt;code&gt;--cloud-config&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Très élevé pour ceux qui n'ont pas encore migré. Cela marque la fin de l'intégration directe des fournisseurs de cloud dans les composants principaux comme &lt;code&gt;kube-apiserver&lt;/code&gt;. Il est &lt;strong&gt;obligatoire&lt;/strong&gt; d'utiliser les fournisseurs de cloud externes (out-of-tree).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.3)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion des CIDR de Service via l'API (&lt;code&gt;MultiCIDRServiceAllocator&lt;/code&gt; GA)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Élevé pour les administrateurs et les distributions Kubernetes. La configuration des plages d'IP pour les services passe des flags de ligne de commande à un objet API (&lt;code&gt;ServiceCIDR&lt;/code&gt;). Cela offre plus de flexibilité (multi-CIDR) mais &lt;strong&gt;nécessite une nouvelle façon de gérer et de valider&lt;/strong&gt; ces plages (potentiellement via &lt;code&gt;ValidatingAdmissionPolicy&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.1)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Conteneurs Sidecar (&lt;code&gt;SidecarContainers&lt;/code&gt;) en GA&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Élevé pour les développeurs d'applications. Cette fonctionnalité &lt;strong&gt;change la sémantique&lt;/strong&gt; des conteneurs &lt;code&gt;init&lt;/code&gt; avec &lt;code&gt;restartPolicy: Always&lt;/code&gt;. Elle stabilise la manière native de gérer les sidecars, simplifiant les déploiements qui en dépendent fortement.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.1)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mode &lt;code&gt;nftables&lt;/code&gt; pour Kube-proxy en GA&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Élevé pour les performances et l'administration réseau. Offre une &lt;strong&gt;alternative stable et potentiellement plus performante&lt;/strong&gt; au mode &lt;code&gt;iptables&lt;/code&gt; par défaut. Les administrateurs peuvent désormais l'adopter en production en toute confiance.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.2)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liaison des Tokens de Service Account au Nœud (&lt;code&gt;ServiceAccountTokenNodeBinding&lt;/code&gt;) en GA et Verrouillée&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Élevé (Sécurité). Cette fonctionnalité de sécurité, qui empêche l'utilisation abusive de tokens de service account volés sur d'autres nœuds, est &lt;strong&gt;désormais toujours activée et non désactivable&lt;/strong&gt;. Cela renforce la sécurité par défaut.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.1)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Changement de Comportement du CPU Manager (Static Policy &amp;amp; CFS Quota)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Potentiellement élevé pour les workloads sensibles aux performances CPU. Le fait de ne plus appliquer de quota CFS aux conteneurs avec des CPUs exclusifs (policy &lt;code&gt;static&lt;/code&gt;) &lt;strong&gt;change un comportement établi de longue date&lt;/strong&gt;. Bien que probablement plus correct, cela pourrait causer des régressions pour certains. Une feature gate (&lt;code&gt;DisableCPUQuotaWithExclusiveCPUs&lt;/code&gt;) permet de revenir à l'ancien comportement si nécessaire.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-alpha.2)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Validation et Avertissements pour les IP/CIDR Non Standards&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact&lt;/strong&gt;: Moyen à élevé (Compatibilité future). L'API server émettra des avertissements pour les formats non canoniques (ex: &lt;code&gt;192.168.000.1&lt;/code&gt;). C'est un &lt;strong&gt;précurseur d'une application plus stricte&lt;/strong&gt; dans les futures versions, incitant les utilisateurs à nettoyer leurs configurations et manifests.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Introduit dans v1.33.0-beta.0)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ces points représentent les changements les plus structurants, nécessitant une attention particulière lors de la planification de la mise à niveau vers Kubernetes 1.33, que ce soit en termes d'action requise, de changement de comportement fondamental ou de stabilisation majeure d'une fonctionnalité clé.&lt;/p&gt;
&lt;h2&gt;Kuberenetes 1.33 : Détail complet des changements&lt;/h2&gt;
&lt;h3&gt;Graduations vers la Stabilité (GA)&lt;/h3&gt;
&lt;p&gt;Plusieurs fonctionnalités importantes atteignent la disponibilité générale (GA) dans la v1.33, signifiant qu'elles sont considérées comme stables et prêtes pour la production :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sidecar Containers (&lt;code&gt;SidecarContainers&lt;/code&gt;)&lt;/strong&gt;: La gestion native des conteneurs sidecar est désormais stable. Cette fonctionnalité simplifie la gestion du cycle de vie des conteneurs auxiliaires qui doivent démarrer avant les conteneurs principaux d'un pod et rester actifs pendant toute la durée de vie du pod. (&lt;em&gt;Initialement dans v1.33.0-alpha.1, confirmé GA&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Montages Récursifs en Lecture Seule (&lt;code&gt;RecursiveReadOnlyMounts&lt;/code&gt;)&lt;/strong&gt;: La possibilité de monter des volumes en lecture seule de manière récursive est maintenant GA, améliorant la sécurité en empêchant les écritures accidentelles dans les sous-répertoires des volumes montés. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Politique de Récupération des PV (&lt;code&gt;HonorPVReclaimPolicy&lt;/code&gt;)&lt;/strong&gt;: Le respect de la politique de récupération ( &lt;code&gt;Retain&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Recycle&lt;/code&gt;) définie sur un PersistentVolume (PV) lors de la suppression de la PersistentVolumeClaim (PVC) associée est maintenant stable. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source de Données pour Volumes (&lt;code&gt;AnyVolumeDataSource&lt;/code&gt;)&lt;/strong&gt;: La capacité d'utiliser n'importe quelle ressource API comme source de données pour provisionner un volume via une PVC est désormais GA, offrant plus de flexibilité pour la création de volumes pré-remplis. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation des CRD avec Ratcheting (&lt;code&gt;CRDValidationRatcheting&lt;/code&gt;)&lt;/strong&gt;: Cette fonctionnalité, qui permet des mises à jour d'objets personnalisés même si l'objet existant n'est pas valide selon les nouvelles règles de validation (tant que la mise à jour ne rend pas l'objet &lt;em&gt;plus&lt;/em&gt; invalide), est désormais stable. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limite de Backoff par Index pour les Jobs (&lt;code&gt;JobBackoffLimitPerIndex&lt;/code&gt;)&lt;/strong&gt;: La configuration fine du nombre de tentatives par index pour les Jobs indexés est maintenant stable. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode nftables pour Kube-proxy&lt;/strong&gt;: Le backend &lt;code&gt;nftables&lt;/code&gt; pour &lt;code&gt;kube-proxy&lt;/code&gt; passe en GA. Bien que &lt;code&gt;iptables&lt;/code&gt; reste le mode par défaut, &lt;code&gt;nftables&lt;/code&gt; offre une alternative potentiellement plus performante et flexible. (&lt;em&gt;v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Liaison des Tokens de Service Account au Nœud (&lt;code&gt;ServiceAccountTokenNodeBinding&lt;/code&gt;)&lt;/strong&gt;: Cette fonctionnalité de sécurité, qui lie les tokens de service account éphémères au nœud qui les demande, est désormais GA et activée par défaut. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration CSI pour Portworx (&lt;code&gt;CSIMigrationPortworx&lt;/code&gt;)&lt;/strong&gt;: La migration automatique des volumes in-tree Portworx vers le driver CSI correspondant est stable. Assurez-vous que le driver CSI Portworx est installé avant la mise à niveau. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flag &lt;code&gt;--subresource&lt;/code&gt; pour Kubectl&lt;/strong&gt;: La possibilité de cibler des sous-ressources (comme &lt;code&gt;status&lt;/code&gt; ou &lt;code&gt;scale&lt;/code&gt;) via &lt;code&gt;kubectl patch&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, etc., est maintenant stable. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache de Watch basé sur B-tree (&lt;code&gt;BtreeWatchCache&lt;/code&gt;)&lt;/strong&gt;: Cette optimisation interne du cache de l'API server est désormais GA. (&lt;em&gt;v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allocation Multi-CIDR pour les Services (&lt;code&gt;MultiCIDRServiceAllocator&lt;/code&gt;)&lt;/strong&gt;: Permet de définir plusieurs plages CIDR pour les Services ClusterIP, améliorant la flexibilité de l'adressage IP. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Fonctionnalités Promues en Bêta&lt;/h3&gt;
&lt;p&gt;Des fonctionnalités prometteuses passent en bêta, se rapprochant de la stabilité :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Validation Assouplie des Domaines de Recherche DNS (&lt;code&gt;RelaxedDNSSearchValidation&lt;/code&gt;)&lt;/strong&gt;: Autorise désormais les domaines de recherche DNS contenant un simple point (&lt;code&gt;.&lt;/code&gt;) ou un underscore (&lt;code&gt;_&lt;/code&gt;), activé par défaut. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autorisation Fine du Kubelet (&lt;code&gt;KubeletFineGrainedAuthz&lt;/code&gt;)&lt;/strong&gt;: Permet un contrôle d'accès plus granulaire pour les endpoints de l'API du Kubelet, activé par défaut. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode Local pour le Kubelet du Control Plane (kubeadm)&lt;/strong&gt; (&lt;code&gt;ControlPlaneKubeletLocalMode&lt;/code&gt;): Kubeadm configure désormais par défaut le kubelet des nœuds master pour communiquer directement avec l'API server local, améliorant la résilience. (&lt;em&gt;v1.33.0-alpha.2, v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attente de Tous les Composants du Control Plane (kubeadm)&lt;/strong&gt; (&lt;code&gt;WaitForAllControlPlaneComponents&lt;/code&gt;): Kubeadm vérifie la santé des composants du control plane en utilisant les adresses et ports configurés dans leurs manifestes statiques. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Désactivation de l'Écriture Double pour l'Allocateur de Service CIDR&lt;/strong&gt; (&lt;code&gt;DisableAllocatorDualWrite&lt;/code&gt;): Désactivé par défaut, ce flag prépare la suppression de l'ancienne méthode d'écriture du CIDR de service via les arguments de l'API server. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Nouvelles Fonctionnalités Alpha et Améliorations Clés&lt;/h3&gt;
&lt;p&gt;La version 1.33 introduit également de nouvelles capacités expérimentales et des améliorations significatives :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API Server &amp;amp; Core&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suivi de Génération Observée pour les Pods (&lt;code&gt;PodObservedGenerationTracking&lt;/code&gt;)&lt;/strong&gt;: Le Kubelet remplit &lt;code&gt;status.observedGeneration&lt;/code&gt; pour indiquer la dernière &lt;code&gt;metadata.generation&lt;/code&gt; du Pod qu'il a prise en compte (Alpha). (&lt;em&gt;v1.33.0-beta.0&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation et Canonicalisation des IP/CIDR&lt;/strong&gt;: Des avertissements sont émis pour les formats IP/CIDR non standards (ex: zéros non significatifs), et les composants écrivent désormais ces valeurs sous forme canonique. (&lt;em&gt;v1.33.0-beta.0, v1.33.0-alpha.3, v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encodage JSON en Streaming pour les Listes (&lt;code&gt;StreamingJSONListEncoding&lt;/code&gt;)&lt;/strong&gt;: Réduit drastiquement l'utilisation mémoire de l'API server lors du renvoi de grandes listes en JSON (Alpha, activé par défaut). (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespace Ordonné (&lt;code&gt;OrderedNamespaceDeletion&lt;/code&gt;)&lt;/strong&gt;: Nouvelle feature gate (Alpha, désactivée par défaut) qui supprime d'abord les pods lors de la suppression d'un namespace pour renforcer la sécurité. (&lt;em&gt;v1.33.0-beta.0, v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Métriques et Observabilité&lt;/strong&gt;: Introduction d'une métrique de "digest" pour comparer le contenu d'etcd et du cache (&lt;code&gt;apiserver_storage_digest&lt;/code&gt;), ajout d'annotations de latence d'authentification/autorisation aux logs d'audit, et ajout d'endpoints &lt;code&gt;/statusz&lt;/code&gt; pour &lt;code&gt;kube-scheduler&lt;/code&gt; et &lt;code&gt;kube-controller-manager&lt;/code&gt;. (&lt;em&gt;v1.33.0-beta.0, v1.33.0-alpha.3, v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node &amp;amp; Kubelet&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mise à l'échelle Verticale In-Place (&lt;code&gt;InPlacePodVerticalScaling&lt;/code&gt;)&lt;/strong&gt;: Améliorations continues, notamment la gestion des sidecars et des politiques de redimensionnement mémoire. (&lt;em&gt;v1.33.0-beta.0, v1.33.0-alpha.3, v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU Manager Static Policy&lt;/strong&gt;: Possibilité de désactiver le quota CFS pour les conteneurs avec des CPUs exclusifs via la feature gate &lt;code&gt;DisableCPUQuotaWithExclusiveCPUs&lt;/code&gt; (Alpha, activé par défaut). (&lt;em&gt;v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheduling&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Exposition de NodeInfo&lt;/strong&gt;: Le &lt;code&gt;NodeInfo&lt;/code&gt; complet est exposé aux plugins de Score pour des décisions plus fines. (&lt;em&gt;v1.33.0-beta.0&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Améliorations de Performance&lt;/strong&gt;: Calculs de ressources de pods mis en cache et amélioration pour les contraintes de topologie requises. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Réseau (Kube-proxy)&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Améliorations &lt;code&gt;nftables&lt;/code&gt;&lt;/strong&gt;: Outre la GA, des améliorations de logging pour le débuggage. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observabilité&lt;/strong&gt;: Endpoints &lt;code&gt;/flagz&lt;/code&gt;, &lt;code&gt;/statusz&lt;/code&gt;, et métriques/health checks enrichis avec l'information de famille IP. Métriques pour le suivi de la réconciliation conntrack. (&lt;em&gt;v1.33.0-alpha.2, v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correction de Bugs&lt;/strong&gt;: Résolution d'une fuite mémoire potentielle et d'une consommation CPU excessive avec les services UDP et IP externes/LB. (&lt;em&gt;v1.33.0-alpha.3, v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stockage&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suivi de Progression&lt;/strong&gt;: Le changement de permissions/propriétaire des volumes indique désormais sa progression. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests E2E&lt;/strong&gt;: Ajout de tests pour les snapshots de groupes de volumes. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sécurité&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Restriction d'Audience pour les Nœuds&lt;/strong&gt;: Configuration dynamique de l'audience/nom de compte de service demandée par le kubelet (Alpha). (&lt;em&gt;v1.33.0-beta.0&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UID Utilisateur depuis Certificat&lt;/strong&gt;: Possibilité d'extraire l'UID utilisateur depuis un OID spécifique dans le sujet d'un certificat client (Bêta). (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allocation Dynamique de Ressources (DRA)&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Critères Priorisés&lt;/strong&gt;: Support d'une liste ordonnée de critères de sélection pour satisfaire une demande de ressource. (&lt;em&gt;v1.33.0-beta.0&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limite de Pods Augmentée&lt;/strong&gt;: Un &lt;code&gt;ResourceClaim&lt;/code&gt; peut maintenant être réservé pour 256 pods (contre 32). (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI (kubectl)&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fichier &lt;code&gt;kuberc&lt;/code&gt;&lt;/strong&gt;: Support alpha pour personnaliser le comportement de kubectl via un fichier &lt;code&gt;kuberc&lt;/code&gt; distinct du &lt;code&gt;kubeconfig&lt;/code&gt;. (&lt;em&gt;v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;kubectl autoscale&lt;/code&gt;&lt;/strong&gt;: Utilise désormais l'API &lt;code&gt;autoscaling/v2&lt;/code&gt; par défaut. (&lt;em&gt;v1.33.0-alpha.1&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubeadm&lt;/strong&gt;: Nombreuses améliorations sur les pré-vérifications, la gestion des feature gates (ControlPlaneKubeletLocalMode, WaitForAllControlPlaneComponents), les messages d'erreur, et la gestion des mises à niveau. (&lt;em&gt;Multiples PRs&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Dépréciations et Suppressions Notables&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;L'&lt;strong&gt;API v1 Endpoints&lt;/strong&gt; est officiellement dépréciée. Il est fortement recommandé d'utiliser l'API EndpointSlice à la place. L'API Endpoints ne sera pas supprimée mais n'est plus la méthode privilégiée. (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Les feature gates &lt;code&gt;AppArmor&lt;/code&gt;, &lt;code&gt;AppArmorFields&lt;/code&gt;, &lt;code&gt;JobPodFailurePolicy&lt;/code&gt;, &lt;code&gt;PDBUnhealthyPodEvictionPolicy&lt;/code&gt;, &lt;code&gt;KubeProxyDrainingTerminatingNodes&lt;/code&gt; et &lt;code&gt;ServiceAccountTokenNodeBinding&lt;/code&gt; ont été supprimées car elles étaient déjà GA et activées par défaut.&lt;/li&gt;
&lt;li&gt;Les feature gates &lt;code&gt;StorageNamespaceIndex&lt;/code&gt; et &lt;code&gt;SeparateCacheWatchRPC&lt;/code&gt; sont dépréciées et désactivées/non activables. (&lt;em&gt;v1.33.0-alpha.2&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Les flags CLI &lt;code&gt;--cloud-provider&lt;/code&gt; et &lt;code&gt;--cloud-config&lt;/code&gt; de l'API Server sont supprimés, ainsi que les feature gates associées (&lt;code&gt;DisableCloudProviders&lt;/code&gt;, &lt;code&gt;DisableKubeletCloudCredentialProviders&lt;/code&gt;). (&lt;em&gt;v1.33.0-alpha.3&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.33 continue de renforcer la plateforme en stabilisant des fonctionnalités clés (Sidecars, RRO Mounts, nftables proxy, Multi-CIDR Services) tout en introduisant des améliorations significatives en termes de performance, de sécurité et d'opérabilité. Les avancées dans le scheduling, l'allocation dynamique de ressources et la gestion in-place des pods ouvrent de nouvelles perspectives. Comme toujours, il est recommandé de consulter les notes de version complètes ([lien vers les notes officielles si disponible]) avant de mettre à niveau et de tester attentivement les nouvelles fonctionnalités, en particulier celles en Alpha et Bêta.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Kubernetes et ses Ressources</title><link href="https://blogppr.alterway.fr/kubernetes-et-ses-ressources.html" rel="alternate"></link><published>2025-03-27T10:00:00+01:00</published><updated>2025-03-27T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-03-27:/kubernetes-et-ses-ressources.html</id><summary type="html">&lt;p&gt;Kubernetes et ses Ressources : Confessions d'un Kubelet au bord de la crise de nerfs&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Kubernetes et ses Ressources : Confessions d'un Kubelet au bord de la crise de nerfs&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Introduction : Le grand malentendu cosmique des millicores&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ah, Kubernetes. Notre sauveur, notre plateforme rutilante, notre promesse d'un monde où les déploiements se font en musique et où les conteneurs gambadent joyeusement dans des prés de Nodes verdoyants. Et puis... il y a la gestion des ressources. Les fameux &lt;code&gt;requests&lt;/code&gt; et &lt;code&gt;limits&lt;/code&gt;. C'est là que le rêve DevOps rencontre la dure réalité, un peu comme quand on commande un plat magnifique sur Instagram et qu'on reçoit une bouillie triste dans une barquette en alu.&lt;/p&gt;
&lt;p&gt;Avouons-le, expliquer les &lt;code&gt;requests&lt;/code&gt; et &lt;code&gt;limits&lt;/code&gt; à un nouveau venu, c'est comme essayer d'expliquer la règle du hors-jeu avec des marionnettes : ça semble simple en théorie, mais ça finit toujours en chaos et en pleurs.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/drakeposting.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Chapitre 1 : Les &lt;code&gt;Requests&lt;/code&gt; - La liste au Père Noël (ou au kube-scheduler)&lt;/h2&gt;
&lt;p&gt;Imaginez votre conteneur comme un enfant un peu capricieux avant son anniversaire. Le &lt;code&gt;request&lt;/code&gt;, c'est sa liste de souhaits :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"Je VEUX &lt;em&gt;au moins&lt;/em&gt; 100 millicores de CPU pour pouvoir... euh... afficher 'Hello World' de manière &lt;em&gt;très&lt;/em&gt; optimisée."&lt;/li&gt;
&lt;li&gt;"Et il me FAUT &lt;em&gt;absolument&lt;/em&gt; 128Mi de RAM, sinon mes variables vont se sentir à l'étroit et faire une dépression."&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le &lt;strong&gt;kube-scheduler&lt;/strong&gt;, ce grand organisateur bienveillant mais un peu débordé (pensez à un animateur de colo avec 300 gamins hyperactifs), regarde cette liste. Il parcourt ses Nodes disponibles, en marmonnant : "Voyons voir... Tatie Node-01 a encore de la place à côté du conteneur Nginx qui ronfle... Oui, ça devrait passer. Allez hop, casé !"&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Voix tremblante d&amp;#39;un Kubelet Anonyme (Kubelet-7b3f sur Node-Stresstest-04) :
&amp;quot;L&amp;#39;autre jour, le Scheduler m&amp;#39;a refilé un Pod qui demandait &amp;#39;10m&amp;#39; de CPU. Dix ! 
Pour une application qui, je le jure, essayait de calculer Pi jusqu&amp;#39;à la dernière décimale. 
Je l&amp;#39;ai vu venir gros comme une maison que ça allait mal finir. 
Mais bon, le request était satisfait, alors j&amp;#39;ai dû le prendre...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le &lt;code&gt;request&lt;/code&gt;, c'est la &lt;strong&gt;promesse minimum garantie&lt;/strong&gt;. C'est le siège réservé dans le train Kube. Si le Node ne peut même pas &lt;em&gt;garantir&lt;/em&gt; ce minimum vital, votre Pod restera sur le quai, regardant les autres partir vers la gloire (ou vers une boucle infinie, on sait jamais).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le drame des &lt;code&gt;requests&lt;/code&gt; mal calibrées :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trop basses :&lt;/strong&gt; Votre Pod se retrouve sur un Node déjà bondé, partageant son CPU avec un voisin bruyant qui compile le noyau Linux en boucle. Résultat : votre application rame comme un galérien sous Prozac.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trop hautes :&lt;/strong&gt; Votre Pod devient une diva insupportable. "QUOI ? Pas de Node avec 8 coeurs dédiés juste pour mon script batch qui tourne 5 minutes par jour ? Scandaleux ! Je refuse de démarrer." Et il boude en état &lt;code&gt;Pending&lt;/code&gt; pendant des heures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/bill.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Chapitre 2 : Les &lt;code&gt;Limits&lt;/code&gt; - La Laisse Électronique (et parfois mortelle)&lt;/h2&gt;
&lt;p&gt;Ah, les &lt;code&gt;limits&lt;/code&gt;. Si le &lt;code&gt;request&lt;/code&gt; était la liste au Père Noël, le &lt;code&gt;limit&lt;/code&gt; c'est le budget réel que Papa Maman Kubelet vous accorde. C'est la dure réalité après les rêves de grandeur.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"Ok, tu as demandé 100m de CPU, mais écoute coco, tu n'auras &lt;strong&gt;JAMAIS PLUS&lt;/strong&gt; que 500m. Si tu dépasses, on va commencer à te ralentir TRES fort." (C'est le &lt;strong&gt;CPU Throttling&lt;/strong&gt;, l'équivalent de devoir courir un 100m dans de la mélasse).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Confession d&amp;#39;un Kubelet Blasé (Kubelet-c4f8 sur Node-Production-Critical-66) :
&amp;quot;Regarder un Pod taper son limit CPU et commencer à se faire throttler... 
C&amp;#39;est mon petit plaisir coupable.
Ça rame, ça supplie, ça envoie des signaux de détresse dans les logs... 
et moi je suis là, imperturbable : &amp;#39;Désolé mon grand, la limite, c&amp;#39;est la limite. 
Fallait pas être si gourmand.&amp;#39;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/brain.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"Et pour la RAM, tu voulais 128Mi ? Adorable. Mais si tu oses toucher à &lt;strong&gt;1 Mi de plus&lt;/strong&gt; que tes 256Mi de &lt;code&gt;limit&lt;/code&gt;, &lt;em&gt;pouf&lt;/em&gt;, tu disparais." (Ça, mes amis, c'est le célèbre et redouté &lt;strong&gt;OOMKiller&lt;/strong&gt;, l'ange exterminateur de Kubernetes, aussi subtil qu'un coup de bazooka pour écraser une mouche).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Témoignage Anonyme d&amp;#39;un Kubelet Traumatisé (Kubelet-9a1d sur Node-Dev-Chaos-01) :
&amp;quot;&amp;#39;Limit Exceeded: 256Mi&amp;#39;. Ah, cette ligne dans mes logs... c&amp;#39;est le son de l&amp;#39;inévitable.
J&amp;#39;ai même pas le temps de dire &amp;#39;OOM...&amp;#39; que l&amp;#39;autre psychopathe (l&amp;#39;OOMKiller, ndlr) 
est déjà passé et a tout nettoyé. 
Parfois, la nuit, j&amp;#39;entends encore les cris des processus terminés...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/cat.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Le Kubelet, maintenant transformé en videur de boîte de nuit fatigué, surveille tout le monde. Dès qu'un conteneur devient trop gourmand en CPU, il lui tire l'oreille numériquement (throttling). Si un autre se goinfre de RAM comme s'il n'y avait pas de lendemain, le Kubelet appelle son pote OOMKiller, qui arrive avec sa faux et... &lt;em&gt;Terminé bonsoir&lt;/em&gt;. Votre Pod est &lt;code&gt;OOMKilled&lt;/code&gt;, laissant derrière lui un message cryptique dans les logs et une équipe d'astreinte en sueur à 3h du matin.&lt;/p&gt;
&lt;h2&gt;Chapitre 3 : Les Classes de QoS - Le Club VIP, la Classe Éco et... les autres&lt;/h2&gt;
&lt;p&gt;Pour ajouter un peu de piment (comme s'il en manquait), Kubernetes classe vos Pods en fonction de comment vous avez défini (ou pas) ces &lt;code&gt;requests&lt;/code&gt; et &lt;code&gt;limits&lt;/code&gt;. C'est une sorte de hiérarchie sociale pour conteneurs :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Guaranteed&lt;/code&gt; (Le VIP) :&lt;/strong&gt; Vous avez défini des &lt;code&gt;requests&lt;/code&gt; ET des &lt;code&gt;limits&lt;/code&gt;, et (attention, subtilité) ils sont &lt;strong&gt;égaux&lt;/strong&gt; pour le CPU et la RAM. Ce Pod est un membre du Gotha. Il a une place réservée et un traitement de faveur. L'OOMKiller ira voir ailleurs en premier. C'est le Pod qui sirote du champagne dans le carré VIP du Node.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Burstable&lt;/code&gt; (La Classe Éco Confort) :&lt;/strong&gt; Vous avez défini des &lt;code&gt;requests&lt;/code&gt;, mais les &lt;code&gt;limits&lt;/code&gt; sont plus hauts (ou absents pour une ressource mais pas l'autre). Ce Pod a sa place assise (&lt;code&gt;request&lt;/code&gt;), mais il peut essayer de s'étaler un peu plus si personne ne regarde (&lt;code&gt;limit&lt;/code&gt; &amp;gt; &lt;code&gt;request&lt;/code&gt;). Attention, il est moins protégé que le VIP. Si ça chauffe, il risque de se faire &lt;code&gt;throttler&lt;/code&gt; ou même &lt;code&gt;OOMKiller&lt;/code&gt; avant les &lt;code&gt;Guaranteed&lt;/code&gt;. C'est le passager qui espère secrètement que le siège à côté reste vide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;BestEffort&lt;/code&gt; (Le Stagiaire / Le Squatteur) :&lt;/strong&gt; Vous n'avez défini &lt;strong&gt;AUCUN&lt;/strong&gt; &lt;code&gt;request&lt;/code&gt; ni &lt;code&gt;limit&lt;/code&gt;. Ce Pod vit dangereusement. Il n'a aucune garantie, il prend ce qui reste. C'est le premier à se faire éjecter sans ménagement si les ressources viennent à manquer. L'OOMKiller le regarde avec un sourire carnassier dès son démarrage. C'est celui qui essaie de rentrer gratos à la soirée et qui se fait sortir par la sécurité à la première occasion.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/dog.jpg"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Soupir d&amp;#39;un Kubelet Fataliste (Kubelet-f8g2 sur Node-Shared-08) :
&amp;quot;Quand je vois arriver un Pod BestEffort, je ne m&amp;#39;attache pas. Vraiment.
C&amp;#39;est comme accueillir un poisson rouge dans un aquarium de piranhas.
On sait tous comment ça va finir. 
Je prépare déjà le message &amp;#39;Evicted&amp;#39;...&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Chapitre 4 : Le Grand Bazar - Pourquoi on se plante tous (avec amour)&lt;/h2&gt;
&lt;p&gt;Personne n'est parfait. Voici le florilège des erreurs classiques qui transforment nos clusters en joyeux chaos :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Le " YOLO Driven Development " :&lt;/strong&gt; Ne mettre aucun &lt;code&gt;request&lt;/code&gt; ni &lt;code&gt;limit&lt;/code&gt;. Vos Pods sont en mode &lt;code&gt;BestEffort&lt;/code&gt;, le Node devient une jungle où seule la loi du plus fort (ou du plus rapide à consommer la RAM) s'applique. Les OOMKills pleuvent comme à Gravelotte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le " Copier-Coller Sans Réfléchir " :&lt;/strong&gt; Prendre les &lt;code&gt;requests/limits&lt;/code&gt; d'un exemple sur Stack Overflow pour votre application Java ultra-gourmande. Spoiler : ça finit mal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le " Optimiste Pathologique " :&lt;/strong&gt; Mettre des &lt;code&gt;requests&lt;/code&gt; ridicules ("Mon appli utilise à peine 10m de CPU !") et des &lt;code&gt;limits&lt;/code&gt; stratosphériques ("Mais au cas où, donnons-lui 4 coeurs !"). Résultat : vos Nodes sont pleins à craquer (basé sur les &lt;code&gt;requests&lt;/code&gt; faibles), mais en réalité, ils sont constamment au bord de l'implosion car tout le monde dépasse allègrement. C'est l'overbooking aérien appliqué aux serveurs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le " Pessimiste Anxieux " :&lt;/strong&gt; Mettre &lt;code&gt;requests&lt;/code&gt; = &lt;code&gt;limits&lt;/code&gt; partout, très haut "pour être sûr". Félicitations, vos Pods sont &lt;code&gt;Guaranteed&lt;/code&gt;, mais vous utilisez 3 Nodes là où un seul aurait suffi. Votre DSI vous regarde avec des yeux qui lancent des éclairs (de factures Cloud).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/dev.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Rire nerveux d&amp;#39;un Kubelet Développeur-Sympathisant (Kubelet-a2b5 sur Node-CI-CD-02) :
&amp;quot;Parfois, je vois des requests et limits arriver... et je me dis &amp;#39;Ok, 
ce dev a clairement utilisé un générateur de nombres aléatoires&amp;#39;. 
J&amp;#39;ai vu des requests plus grands que les limits ! 
J&amp;#39;ai vu des demandes de &amp;#39;0.0001m&amp;#39; de CPU ! 
J&amp;#39;essaie de rester pro, mais des fois, 
j&amp;#39;aimerais pouvoir envoyer un &amp;#39;LOL&amp;#39; dans les events du Pod.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Conclusion : Rire pour ne pas pleurer (et mettre des métriques)&lt;/h2&gt;
&lt;p&gt;La gestion des ressources dans Kubernetes, c'est un art subtil. Un mélange de science (monitoring, profiling), de doigt mouillé (estimations initiales) et parfois, de pure chance. C'est une source inépuisable de maux de tête, de crises de nerfs nocturnes, mais aussi, avouons-le, de bonnes tranches de rigolade (après coup, généralement).&lt;/p&gt;
&lt;p&gt;Alors la prochaine fois que votre Pod se fait OOMKiller pour la 5ème fois de la journée, respirez un grand coup. Rappelez-vous que vous n'êtes pas seul. Nous sommes tous dans cette galère magnifique qu'est Kubernetes. Et n'oubliez pas : mettez des métriques partout, observez vos applications comme un stalker professionnel, ajustez vos &lt;code&gt;requests&lt;/code&gt; et &lt;code&gt;limits&lt;/code&gt; avec la précision d'un horloger suisse (ou au moins, avec un peu moins de "YOLO"), et peut-être, juste peut-être, votre Kubelet arrêtera de pleurer la nuit.&lt;/p&gt;
&lt;p&gt;Et si ça ne marche toujours pas ? Blâmez le YAML. Ça marche toujours.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Dernier mot d&amp;#39;un Kubelet Philosophe (Kubelet-1c9e sur Node-Zen-Garden-00) :
&amp;quot;Au fond, nous les Kubelets, 
on est juste là pour essayer de maintenir un semblant d&amp;#39;ordre dans le chaos créatif des développeurs. 
On jongle avec des millicores et des mébioctets comme on peut. 
Alors oui, parfois on râle, parfois on throttle, parfois on appelle le grand méchant OOMKiller... 
mais c&amp;#39;est pour le bien du cluster. 
Enfin... on espère.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/resources/batman.png"&gt;
&lt;/center&gt;&lt;/p&gt;</content><category term="Kubernetes, tutos"></category></entry><entry><title>Nelm le futur de Helm ?</title><link href="https://blogppr.alterway.fr/nelm-le-futur-de-helm.html" rel="alternate"></link><published>2025-03-26T10:00:00+01:00</published><updated>2025-03-26T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-03-26:/nelm-le-futur-de-helm.html</id><summary type="html">&lt;p&gt;Nelm : Redécouvrez le Déploiement de Charts Helm sur Kubernetes&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Nelm : Redécouvrez le Déploiement de Charts Helm sur Kubernetes&lt;/h1&gt;
&lt;p&gt;Dans l'écosystème Kubernetes, Helm s'est imposé comme le gestionnaire de paquets de facto, simplifiant la définition, l'installation et la mise à niveau des applications. Cependant, malgré ses qualités, Helm 3 présente certaines limitations et complexités qui peuvent frustrer les équipes DevOps. C'est là qu'intervient &lt;strong&gt;Nelm&lt;/strong&gt;, une alternative open-source construite sur les fondations de Helm 3, mais repensée pour offrir plus de contrôle, de prévisibilité et de robustesse dans vos déploiements.&lt;/p&gt;
&lt;p&gt;Utilisé comme moteur de déploiement principal par l'outil CI/CD &lt;a href="https://github.com/werf/werf/"&gt;werf&lt;/a&gt;, Nelm conserve une compatibilité de premier ordre avec les Charts Helm existants tout en introduisant des fonctionnalités puissantes inspirées d'autres outils éprouvés comme Terraform.&lt;/p&gt;
&lt;p&gt;Ce billet explore en profondeur ce qu'est Nelm, pourquoi vous pourriez l'envisager à la place de Helm, et comment ses fonctionnalités clés peuvent améliorer vos workflows de déploiement Kubernetes.&lt;/p&gt;
&lt;h3&gt;Qu'est-ce que Nelm ? Une Alternative Améliorée à Helm 3&lt;/h3&gt;
&lt;p&gt;Nelm n'est pas une réécriture complète de Helm, mais plutôt une évolution. Il reprend la base de code de Helm 3, assure la compatibilité avec ses concepts fondamentaux (Charts, Releases), mais réimplémente ou améliore des parties cruciales, notamment le moteur de déploiement.&lt;/p&gt;
&lt;p&gt;Les objectifs principaux de Nelm sont de résoudre des problèmes connus de Helm 3 et d'introduire des capacités plus avancées :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prévisualisation Fiable des Changements :&lt;/strong&gt; Offrir une fonctionnalité similaire à &lt;code&gt;terraform plan&lt;/code&gt; pour savoir &lt;em&gt;exactement&lt;/em&gt; ce qui va changer dans le cluster avant d'appliquer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion des Mises à Jour Robuste :&lt;/strong&gt; Remplacer le mécanisme de "Fusion à Trois Voies" (3-Way Merge) de Helm par l'&lt;strong&gt;Application Côté Serveur&lt;/strong&gt; (Server-Side Apply) de Kubernetes, plus fiable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ordonnancement Avancé :&lt;/strong&gt; Permettre un contrôle fin sur l'ordre de déploiement des ressources, y compris les dépendances externes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion Sécurisée des Secrets :&lt;/strong&gt; Intégrer nativement le chiffrement des fichiers de valeurs ou de fichiers arbitraires.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suivi Détaillé et Visibilité :&lt;/strong&gt; Améliorer le suivi de l'état des ressources, afficher les logs et événements en continu pendant le déploiement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Correction de Bugs Helm :&lt;/strong&gt; Résoudre des problèmes récurrents de Helm, comme les erreurs liées aux versions d'API obsolètes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tout en offrant ces améliorations, Nelm maintient la compatibilité avec le format des Charts Helm et le stockage des informations de release (Secrets Kubernetes), permettant une transition potentielle depuis Helm.&lt;/p&gt;
&lt;h3&gt;Pourquoi Envisager Nelm ? Les Fonctionnalités Clés&lt;/h3&gt;
&lt;p&gt;Explorons les aspects qui différencient Nelm et peuvent apporter une valeur significative à vos processus de déploiement.&lt;/p&gt;
&lt;h3&gt;1. Planification Précise avec &lt;code&gt;nelm release plan install&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;L'un des défis avec Helm est de comprendre précisément l'impact d'une commande &lt;code&gt;helm upgrade&lt;/code&gt;. Nelm s'attaque à ce problème avec &lt;code&gt;nelm release plan install&lt;/code&gt;. Cette commande utilise un dry-run basé sur Server-Side Apply pour générer un diff fiable entre l'état actuel dans le cluster et l'état désiré après application du Chart.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple : Planifier la mise à jour d'une application web&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imaginons un Chart simple pour une application web &lt;code&gt;my-webapp&lt;/code&gt; avec un Déploiement et un Service.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Chart.yaml&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v2&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-webapp&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;0.1.0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;appVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;values.yaml&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;replicaCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-registry/my-webapp&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ClusterIP&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;templates/deployment.yaml&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deployment&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;-app&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;replicas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Values.replicaCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;web&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.Values.image.repository&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}:{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;.Values.image.tag&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;containerPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;8080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Supposons que l&amp;#39;app écoute sur 8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;templates/service.yaml&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Service&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;-svc&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Values.service.type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Values.service.port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;targetPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;8080&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Port du container&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Après un premier déploiement (&lt;code&gt;nelm release install -n web -r myapp ./my-webapp&lt;/code&gt;), nous voulons mettre à jour l'image vers la version "1.1" et passer à 2 réplicas. Planifions ce changement :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;plan&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;myapp&lt;span class="w"&gt; &lt;/span&gt;./my-webapp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--set&lt;span class="w"&gt; &lt;/span&gt;image.tag&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--set&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;replicaCount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nelm affichera un résultat clair, indiquant &lt;em&gt;uniquement&lt;/em&gt; les modifications prévues sur le Déploiement :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Planning release install &amp;quot;myapp&amp;quot; (namespace: &amp;quot;web&amp;quot;)

┌ Update Deployment/myapp-app
│     namespace: web
│   spec:
│ -   replicas: 1
│ +   replicas: 2
│     template:
│       spec:
│         containers:
│           - name: web
│ -           image: &amp;quot;my-registry/my-webapp:1.0&amp;quot;
│ +           image: &amp;quot;my-registry/my-webapp:1.1&amp;quot;
│             ports:
└ Update Deployment/myapp-app

Planned changes summary for release &amp;quot;myapp&amp;quot; (namespace: &amp;quot;web&amp;quot;):
- update: 1 resource(s)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cette clarté permet d'éviter les surprises et de valider les changements avant de les appliquer réellement avec &lt;code&gt;nelm release install&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;2. Server-Side Apply (SSA) au lieu de 3-Way Merge&lt;/h3&gt;
&lt;p&gt;Le mécanisme de "Fusion à Trois Voies" (3-Way Merge) utilisé par Helm pour calculer les patchs de mise à jour est basé sur l'état connu de la &lt;em&gt;dernière release Helm réussie&lt;/em&gt;. Si des modifications manuelles ont eu lieu (&lt;code&gt;kubectl edit&lt;/code&gt;), ou si une release précédente a échoué partiellement, Helm peut générer des patchs incorrects ou écraser des changements inattendus.&lt;/p&gt;
&lt;p&gt;Nelm utilise l'&lt;strong&gt;Application Côté Serveur&lt;/strong&gt; (Server-Side Apply), une fonctionnalité native de Kubernetes. Avec SSA, c'est le serveur d'API Kubernetes lui-même qui calcule le patch en se basant sur l'état &lt;em&gt;réel&lt;/em&gt; de la ressource dans le cluster et l'état désiré soumis par Nelm. Chaque champ est "possédé" par un gestionnaire (ici, Nelm). Cela résout les problèmes de désynchronisation et assure des mises à jour beaucoup plus robustes et prévisibles. C'est la méthode adoptée par des outils modernes comme FluxCD.&lt;/p&gt;
&lt;h3&gt;3. Ordonnancement Avancé des Ressources&lt;/h3&gt;
&lt;p&gt;Helm propose un ordonnancement basique via les Hooks et leurs poids (&lt;code&gt;helm.sh/hook-weight&lt;/code&gt;). Nelm étend considérablement ces capacités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Annotation &lt;code&gt;werf.io/weight&lt;/code&gt; :&lt;/strong&gt; Similaire à &lt;code&gt;helm.sh/hook-weight&lt;/code&gt;, mais applicable à &lt;strong&gt;toutes&lt;/strong&gt; les ressources (pas seulement les hooks). Les ressources avec le même poids sont déployées en parallèle. Les groupes de poids sont déployés séquentiellement (du plus petit au plus grand).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt; Déployer une ConfigMap avant un Déploiement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/configmap.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ConfigMap&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-config&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;werf.io/weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;-10&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Déployé en premier&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;config.json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;{&amp;quot;setting&amp;quot;: &amp;quot;value&amp;quot;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/deployment.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deployment&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-deployment&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;werf.io/weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Déployé après la ConfigMap&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ... spec utilisant la ConfigMap&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Annotation &lt;code&gt;werf.io/deploy-dependency-&amp;lt;id&amp;gt;&lt;/code&gt; :&lt;/strong&gt; La méthode la plus puissante. Permet à une ressource d'attendre qu'une &lt;em&gt;autre ressource de la même release&lt;/em&gt; atteigne un état spécifique (&lt;code&gt;present&lt;/code&gt; ou &lt;code&gt;ready&lt;/code&gt;) avant de se déployer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt; Un Job qui initialise une base de données (StatefulSet) avant le démarrage de l'application (Deployment).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/database-sts.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;StatefulSet&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-db&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ... spec du StatefulSet&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/init-db-job.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;batch/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Job&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-init-db&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Attend que le StatefulSet soit prêt avant de lancer le Job&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;werf.io/deploy-dependency-db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;state=ready,kind=StatefulSet,name=myapp-db&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Note: Le Job lui-même est souvent un hook Helm (pre-install/pre-upgrade)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;helm.sh/hook&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;pre-install, pre-upgrade&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;helm.sh/hook-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Exécuté après le STS mais avant le déploiement applicatif&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ... spec du Job d&amp;#39;initialisation&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/app-deployment.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Deployment&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-app&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Attend que le Job d&amp;#39;initialisation soit terminé (présent suffit souvent pour un Job)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Ou si le Job doit absolument réussir, on pourrait pointer vers un état Ready hypothétique si le Job le supportait.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Ici, on suppose que la présence du Job terminé est suffisante.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Alternativement, si le Job crée une ressource signal (comme un Secret), on pourrait dépendre de cette ressource.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Pour cet exemple, nous allons supposer que le hook Helm suffit à séquencer.&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Si le Job n&amp;#39;était PAS un hook, cette dépendance serait cruciale :&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# werf.io/deploy-dependency-init: &amp;quot;state=present,kind=Job,name=myapp-init-db&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;werf.io/weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;10&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Assure qu&amp;#39;il se déploie après les hooks de poids inférieur&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ... spec de l&amp;#39;application&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;(Note : L'exemple combine hooks Helm et dépendances Nelm pour illustrer. Souvent, &lt;code&gt;deploy-dependency&lt;/code&gt; 
remplace le besoin de certains hooks complexes.)*&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Annotations &lt;code&gt;*.external-dependency.werf.io/*&lt;/code&gt; :&lt;/strong&gt; Permet d'attendre la disponibilité de ressources &lt;em&gt;hors&lt;/em&gt; de la release actuelle, typiquement gérées par des opérateurs (ex: un &lt;code&gt;ClusterIssuer&lt;/code&gt; de cert-manager, une &lt;code&gt;Database&lt;/code&gt; de KubeDB).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt; Une Ingress qui nécessite un &lt;code&gt;ClusterIssuer&lt;/code&gt; géré séparément.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/ingress.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Ingress&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;myapp-ingress&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# ID unique pour cette dépendance externe&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;certissuer.external-dependency.werf.io/resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ClusterIssuer.v1.cert-manager.io/letsencrypt-prod&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Si le ClusterIssuer était dans un namespace spécifique (non applicable ici car ClusterIssuer est cluster-scoped) :&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# certissuer.external-dependency.werf.io/namespace: &amp;quot;cert-manager&amp;quot;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# Annotation standard pour utiliser le ClusterIssuer&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;cert-manager.io/cluster-issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;letsencrypt-prod&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# ... spec de l&amp;#39;Ingress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Nelm attendra que la ressource &lt;code&gt;ClusterIssuer&lt;/code&gt; nommée &lt;code&gt;letsencrypt-prod&lt;/code&gt; (avec le groupe d'API &lt;code&gt;cert-manager.io/v1&lt;/code&gt;) soit prête avant de créer l'Ingress.&lt;/p&gt;
&lt;h3&gt;4. Suivi Amélioré des Ressources et Affichage des Logs&lt;/h3&gt;
&lt;p&gt;Pendant une commande &lt;code&gt;nelm release install&lt;/code&gt;, Nelm fournit une sortie beaucoup plus riche que Helm :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tableau de Suivi :&lt;/strong&gt; Un tableau est affiché périodiquement, montrant l'état de chaque ressource gérée (Waiting, Progressing, Ready, Failed). Pour les ressources comme les Déploiements ou StatefulSets, il suit aussi l'état des Pods sous-jacents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Détection Heuristique pour les CRDs :&lt;/strong&gt; Nelm tente de déterminer l'état "Ready" de nombreuses Custom Resources en analysant leurs champs &lt;code&gt;status&lt;/code&gt;, ce qui fonctionne pour environ la moitié des CRDs sans configuration supplémentaire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Affichage des Logs en Continu :&lt;/strong&gt; Nelm récupère et affiche les logs des conteneurs des Pods créés ou mis à jour pendant le déploiement. Très utile pour déboguer rapidement les problèmes de démarrage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Affichage des Événements :&lt;/strong&gt; En ajoutant l'annotation &lt;code&gt;werf.io/show-service-messages: "true"&lt;/code&gt; à une ressource, Nelm affichera également les événements Kubernetes associés à cette ressource pendant le déploiement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Des annotations permettent de personnaliser ce comportement (filtrer les logs par regex, skipper les logs pour certains conteneurs, ignorer les échecs pour des ressources non critiques, etc.). Voir la section Documentation du README pour la liste complète (&lt;code&gt;werf.io/log-regex&lt;/code&gt;, &lt;code&gt;werf.io/skip-logs&lt;/code&gt;, &lt;code&gt;werf.io/fail-mode&lt;/code&gt;, etc.).&lt;/p&gt;
&lt;h3&gt;5. Gestion Native des Secrets Chiffrés&lt;/h3&gt;
&lt;p&gt;Gérer les secrets (mots de passe, clés d'API) dans Git est toujours délicat. Nelm intègre une solution inspirée de &lt;code&gt;helm-secrets&lt;/code&gt;, mais nativement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fichiers de Valeurs Chiffrés :&lt;/strong&gt; Vous pouvez créer des fichiers comme &lt;code&gt;secret-values.yaml&lt;/code&gt; qui sont chiffrés sur disque mais déchiffrés en mémoire lors du &lt;code&gt;nelm install&lt;/code&gt; ou &lt;code&gt;nelm render&lt;/code&gt;. Leurs valeurs sont accessibles via &lt;code&gt;.Values&lt;/code&gt; comme d'habitude.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fichiers Arbitraires Chiffrés :&lt;/strong&gt; Vous pouvez chiffrer n'importe quel fichier (ex: &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;cert.pem&lt;/code&gt;) et le placer dans un répertoire &lt;code&gt;secret/&lt;/code&gt; à la racine du Chart. Ces fichiers peuvent être injectés dans les templates via la fonction &lt;code&gt;{{ werf_secret_file "monfichier.txt" }}&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le chiffrement utilise une clé AES-256-GCM générée via &lt;code&gt;nelm chart secret key create&lt;/code&gt; et fournie via la variable d'environnement &lt;code&gt;NELM_SECRET_KEY&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple : Utiliser des identifiants de base de données chiffrés&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Générer une clé (à faire une seule fois et à stocker de manière sécurisée) :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NELM_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;chart&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;key&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Stocker cette clé quelque part (ex: variable CI/CD, gestionnaire de secrets)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$NELM_SECRET_KEY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Créer/éditer un fichier de valeurs secret :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Ouvre $EDITOR pour créer/modifier le fichier, le chiffre à la sauvegarde&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;chart&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;values-file&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;my-webapp/secret-values.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Contenu de &lt;code&gt;secret-values.yaml&lt;/code&gt; (dans l'éditeur) :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;dbuser&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;SecurePassword123!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le fichier &lt;code&gt;my-webapp/secret-values.yaml&lt;/code&gt; sur disque contiendra des données chiffrées.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Utiliser les valeurs dans un template (ex: pour créer un Secret Kubernetes) :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/db-secret.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Secret&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;-db-credentials&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Opaque&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;stringData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Values.database.username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Values.database.password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Déployer (Nelm utilisera &lt;code&gt;secret-values.yaml&lt;/code&gt; automatiquement si &lt;code&gt;NELM_SECRET_KEY&lt;/code&gt; est définie) :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NELM_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Fournir la clé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;myapp&lt;span class="w"&gt; &lt;/span&gt;./my-webapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple : Utiliser un fichier de configuration API chiffré&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Créer/éditer un fichier secret dans le répertoire &lt;code&gt;secret/&lt;/code&gt; :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Assurez-vous que NELM_SECRET_KEY est définie&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;my-webapp/secret
&lt;span class="w"&gt;    &lt;/span&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;chart&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;file&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;my-webapp/secret/api-config.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Contenu de &lt;code&gt;api-config.json&lt;/code&gt; (dans l'éditeur) :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;apiKey&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abcdef123456&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;endpoint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://api.example.com/v1&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le fichier &lt;code&gt;my-webapp/secret/api-config.json&lt;/code&gt; sur disque sera chiffré.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Injecter le contenu dans une ConfigMap :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# templates/api-configmap.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ConfigMap&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;.Release.Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;}}&lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;-api-config&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;config.json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="no"&gt;{{- werf_secret_file &amp;quot;api-config.json&amp;quot; | nindent 8 }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Déployer :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;NELM_SECRET_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Fournir la clé&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;nelm&lt;span class="w"&gt; &lt;/span&gt;release&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;myapp&lt;span class="w"&gt; &lt;/span&gt;./my-webapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La ConfigMap dans Kubernetes contiendra le JSON déchiffré.&lt;/p&gt;
&lt;h3&gt;Compatibilité avec Helm&lt;/h3&gt;
&lt;p&gt;Nelm se veut un remplacement "drop-in" pour de nombreux cas d'usage de Helm :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Charts :&lt;/strong&gt; Les Charts Helm 3 sont directement utilisables avec Nelm sans modification. Toutes les fonctionnalités de templating, y compris les fonctions &lt;code&gt;lookup&lt;/code&gt;, sont supportées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Releases :&lt;/strong&gt; Nelm utilise le même format de stockage des releases (Secrets dans le namespace de la release) que Helm 3. Théoriquement, vous pouvez alterner entre &lt;code&gt;helm&lt;/code&gt; et &lt;code&gt;nelm&lt;/code&gt; pour gérer la même release (bien que ce ne soit généralement pas recommandé en production).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commandes CLI :&lt;/strong&gt; La structure des commandes est différente, mais les fonctionnalités sont largement équivalentes. Voici une correspondance rapide :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Helm Command&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Nelm Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm upgrade --install --atomic --wait -n ns rel ./c&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm release install --auto-rollback -n ns -r rel ./c&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm uninstall -n ns release&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm release uninstall -n ns -r release&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm template ./chart&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm chart render ./chart&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm lint ./chart&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm chart lint ./chart&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm dependency build ./chart&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm chart dependency download ./chart&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;helm get values -n ns release&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;nelm release get values -n ns -r release&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;(Plugin helm-diff) &lt;code&gt;helm diff upgrade ...&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;(Natif) &lt;code&gt;nelm release plan install ...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;(Plugin helm-secrets) &lt;code&gt;helm secrets ...&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;(Natif) &lt;code&gt;nelm chart secret ...&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Plugins Helm :&lt;/strong&gt; Non supportés directement. Nelm privilégie l'intégration native des fonctionnalités utiles (comme &lt;code&gt;plan&lt;/code&gt; et &lt;code&gt;secret&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La migration consiste principalement à adapter vos scripts CI/CD pour utiliser les commandes Nelm équivalentes.&lt;/p&gt;
&lt;h3&gt;Conclusion : Plus de Contrôle et de Fiabilité pour vos Déploiements&lt;/h3&gt;
&lt;p&gt;Nelm se présente comme une alternative sérieuse et réfléchie à Helm 3 pour les équipes qui recherchent plus de prévisibilité, de contrôle et de robustesse dans leurs déploiements Kubernetes. En remplaçant le 3-Way Merge par Server-Side Apply, en offrant une planification détaillée des changements, un ordonnancement avancé des ressources, un suivi amélioré et une gestion native des secrets, Nelm répond à plusieurs points de douleur courants rencontrés avec Helm.&lt;/p&gt;
&lt;p&gt;Sa compatibilité avec les Charts Helm existants facilite son adoption. Si vous utilisez déjà &lt;code&gt;werf&lt;/code&gt;, vous bénéficiez déjà de Nelm. Sinon, et si les fonctionnalités décrites ici vous semblent pertinentes pour vos défis de déploiement, Nelm mérite assurément d'être exploré.&lt;/p&gt;
&lt;p&gt;Pour commencer, consultez les &lt;a href="https://github.com/werf/nelm/releases"&gt;instructions d'installation&lt;/a&gt; et essayez-le sur un projet de test !&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Accélérer la migration et la modernisation dans le cloud</title><link href="https://blogppr.alterway.fr/accelerer-la-migration-et-la-modernisation-dans-le-cloud.html" rel="alternate"></link><published>2025-03-24T10:00:00+01:00</published><updated>2025-03-24T10:00:00+01:00</updated><author><name>Flavio Pastore</name></author><id>tag:blogppr.alterway.fr,2025-03-24:/accelerer-la-migration-et-la-modernisation-dans-le-cloud.html</id><summary type="html">&lt;p&gt;Accélérer la migration et la modernisation dans le cloud : approches techniques et outils avancés selon AWS&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Accélérer la migration et la modernisation dans le cloud : approches techniques et outils avancés selon AWS&lt;/h1&gt;
&lt;p&gt;Dans un contexte où un nombre significatif de workloads demeure sur site, AWS propose une méthodologie robuste pour migrer depuis des infrastructures on-premise (move to the cloud). Certains sujet abordé dans cet événement, comme EKS, sont valables aussi pour moderniser des infrastructures aws existants. Les sessions de l'AWS MAP Academy Technical Track qui se sont tenues à Paris le dernier 13 Mars (&lt;a href="https://aws-experience.com/emea/smb/e/7954a/map-academy-technical-track--france"&gt;source&lt;/a&gt;) ont présenté en détail des stratégies basées sur des processus rigoureux, des outils d'automatisation et des techniques d'optimisation avancées. Voici une synthèse technique des principaux points abordés.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AWS MAP" src="/images/aws-map-2025/aws_map_presentation.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Intervenants&lt;/h2&gt;
&lt;p&gt;Parmi les intervenants, on trouvait :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sid Ahmed&lt;/strong&gt;, Partner SA &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clément Lebra&lt;/strong&gt;, Migration and Modernization SA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gengis Birsen&lt;/strong&gt;, Partner SA&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pragnesh Shah&lt;/strong&gt;, Migration and Modernization Sr. Partner SA&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Opportunités de migration et approches stratégiques&lt;/h2&gt;
&lt;h3&gt;Identification et évaluation des workloads&lt;/h3&gt;
&lt;p&gt;La migration vers AWS est perçue comme une opportunité majeure, car de nombreuses charges de travail restent non migrées. Les conférences ont insisté sur l'importance d'une analyse approfondie pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identifier les workloads non migrés et évaluer leur criticité.&lt;/li&gt;
&lt;li&gt;Appliquer des techniques de migration industrielle afin d'optimiser la rapidité et la robustesse du transfert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le &lt;strong&gt;Migration Acceleration Program (MAP)&lt;/strong&gt; s’articule notamment autour de trois étapes clés :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Assess (Évaluation)&lt;/strong&gt;&lt;br /&gt;
    Cette phase consiste dans l'analyse des workloads existants et dans l'évaluation de leur préparation à la migration. Il y a notamment un étude du Total Cost of Ownership (TCO) pour estimer les économies potentielles. Des services comme Application Discovery Service sont mis à disposition pour recenser les serveurs, les applications et les métriques (CPU, mémoire, I/O disque) avec ou sans agent. Ces données permettent un right-sizing précis pour adapter les ressources AWS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mobilize (Mobilisation)&lt;/strong&gt;&lt;br /&gt;
   Élaboration d’un plan de migration détaillé intégrant allocation des ressources, gestion des risques et calendrier précis. Il y a l'élaboration d’un business case avec des outils comme OLA (Optimizing and Licensing Assessment) pour l’optimisation des licences et MPA (Migration Planning Assessment) pour la planification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Migrate &amp;amp; Modernize (Migration et Modernisation)&lt;/strong&gt;&lt;br /&gt;
   Réalisation de la migration avec des outils comme AWS Application Migration Service (MGN) pour la réplication continue des serveurs et AWS Migration Hub Orchestrator pour gérer les workflows complexes. La modernisation peut inclure la conteneurisation avec Amazon ECS/EKS, l’utilisation de bases de données gérées comme Amazon RDS, ou l’adoption d’architectures serverless avec AWS Lambda.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="AWS MAP" src="/images/aws-map-2025/migration_and_modernization.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Modernisation applicative : analyse et transformation technique&lt;/h2&gt;
&lt;h3&gt;Analyse du portefeuille applicatif&lt;/h3&gt;
&lt;p&gt;Des outils comme &lt;strong&gt;CAST Highlight&lt;/strong&gt; et &lt;strong&gt;CAST Imaging&lt;/strong&gt;, en partenariat avec AWS, facilitent l’analyse du portefeuille applicatif en fournissant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une évaluation de la taille du code (lignes, complexité).&lt;/li&gt;
&lt;li&gt;Une cartographie des dépendances techniques (bibliothèques, API obsolètes) et des contraintes (ex. : compatibilité DLL).&lt;/li&gt;
&lt;li&gt;Des recommandations pour choisir entre lift &amp;amp; shift, conteneurisation, refactoring ou réécriture complète.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Évaluation des risques et planification technique&lt;/h3&gt;
&lt;p&gt;L’analyse des niveaux de maturité technologique et des besoins métier permet d’évaluer les risques et de planifier la transformation. Cela aboutit à une feuille de route pour convertir les applications legacy en microservices ou architectures serverless, en intégrant les meilleures pratiques de sécurité et de conformité. Par exemple, le refactoring peut s’appuyer sur &lt;strong&gt;AWS Mainframe Modernization&lt;/strong&gt; pour les workloads mainframe.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AWS MAP" src="/images/aws-map-2025/cast.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Planification de la transformation cloud&lt;/h2&gt;
&lt;h3&gt;Approche multi-dimensionnelle&lt;/h3&gt;
&lt;p&gt;Au-delà des aspects techniques, la planification doit intégrer des facteurs humains et des processus opérationnels. L'utilisation d'outils tel que &lt;strong&gt;Migration Readiness Assessment (MRA)&lt;/strong&gt; permet de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cartographier l’état actuel de l’infrastructure et des applications&lt;/li&gt;
&lt;li&gt;Impliquer les équipes opérationnelles et de gouvernance&lt;/li&gt;
&lt;li&gt;Prioriser les actions et générer des rapports d’alignement stratégique (notamment pour définir des business cases et des stratégies d'optimisation)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Feuille de route opérationnelle&lt;/h3&gt;
&lt;p&gt;Les workflows de migration sont conçus pour gérer des projets à grande échelle. Des outils tels que AWS &lt;strong&gt;Migration Hub&lt;/strong&gt; et ses Journey templates offrent une visibilité centralisée sur l'ensemble du processus, depuis l'inventaire initial jusqu'au cut-over final, en automatisant la gestion destâches et en facilitant la collaboration entre les parties prenantes.&lt;/p&gt;
&lt;h2&gt;Optimisation de l’infrastructure et techniques de Right-Sizing&lt;/h2&gt;
&lt;h3&gt;Dimensionnement précis, automatisation et réduction des coûts&lt;/h3&gt;
&lt;p&gt;L'optimisation des ressources AWS repose sur des techniques de right-sizing et d'analyse fine des métriques de consommation. Des outils comme AWS &lt;strong&gt;Application Discovery Service&lt;/strong&gt;, combinés à des exports de données manuels ou automatisés, permettent de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analyser la charge réelle des serveurs on-premise,&lt;/li&gt;
&lt;li&gt;Simuler différents scénarios de provisionnement (on-demand, spot instances, savings plans),&lt;/li&gt;
&lt;li&gt;Générer des rapports détaillés sur TCO et identifier des opportunités de réduction de coûts, par exemple par le passage à des instances basées sur graviton (en architecture ARM) qui offrent un excellent rapport prix-performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour les clusters Amazon EKS, des outils comme &lt;strong&gt;Karpenter&lt;/strong&gt; optimisent les ressources Kubernetes en consolidant les pods pour maximiser l’utilisation des ressources, en remplaçant dynamiquement les instances EC2 sous-utilisées (nœuds en termes d’EKS) par des options plus efficaces, tout en gérant les transitions vers des spot instances avec une tolérance aux interruptions.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Exemple d’automatisation pour EKS via l’outil &lt;a href="https://k9scli.io/"&gt;K9S&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="AWS MAP" src="/images/aws-map-2025/karpenter.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Et ensuite le mécanisme &lt;strong&gt;EKS Auto mode&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="AWS MAP" src="/images/aws-map-2025/eks_auto_mode.png" /&gt;&lt;/p&gt;
&lt;h2&gt;L’Impact de la GenAI dans la migration et la modernisation&lt;/h2&gt;
&lt;h3&gt;Augmentation de la productivité par l’automatisation&lt;/h3&gt;
&lt;p&gt;L’intégration de solutions de GenAI dans les projets de migration permet de réduire significativement les tâches répétitives. Des outils comme &lt;strong&gt;Amazon Bedrock&lt;/strong&gt; et &lt;strong&gt;Amazon Q Developer&lt;/strong&gt; génèrent automatiquement des drafts de documentation, des schémas architecturaux, et même du code. Ces outils offrent un premier niveau d’analyse pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Valider les business cases&lt;/li&gt;
&lt;li&gt;Générer des tests unitaire&lt;/li&gt;
&lt;li&gt;Faciliter la code review&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ils permettent aussi d’activer des agents intelligents qui complètent ou refactorisent le code en se basant sur une base de connaissances entraînéesur les meilleures pratiques AWS. La Next Generation Developer Experience and Productivity redéfinit ainsi le cycle de vie du développement logiciel en offrant une automatisation complète des phases de build, test et déploiement grâce à des intégrations avec des pipelines DevOps (GitLab, Jenkins, GitHub, etc.) et des mécanismes de feedback en temps réel pour l’audit de sécurité et l’optimisation des performances, améliorant ainsi la qualité du code et réduisant le time-to-market.&lt;/p&gt;
&lt;h3&gt;Accélération de la migration et de la modernisation par l’utilisation d’outils avancés&lt;/h3&gt;
&lt;h4&gt;Une palette d’outils pour tous les cas d’usage&lt;/h4&gt;
&lt;p&gt;Les projets de migration et de modernisation bénéficient donc d’un écosystème riche d’outils qui permettent de couvrir l’ensemble du processus :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OLA&lt;/strong&gt; et &lt;strong&gt;MPA&lt;/strong&gt; pour la construction rapide de business cases et l’analyse du TCO&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migration Hub&lt;/strong&gt; et ses Journey Templates pour la gestion centralisée du projet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MGN&lt;/strong&gt; pour la réplication en continu et le basculement minimaliste des serveurs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMS (Database Migration Service)&lt;/strong&gt; avec Schema Conversion intégrant la GenAI pour automatiser la conversion de schémas et le refactoring de code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon QDeveloper&lt;/strong&gt; pour moderniser et adapter le code aux nouvelles architectures (par exemple, migration de .NET vers .NET Core sur Linux)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Automatisation et orchestration des workflows&lt;/h4&gt;
&lt;p&gt;Les outils d'orchestration, tels que &lt;strong&gt;Migration Hub Orchestrator&lt;/strong&gt;, permettent de créer des workflows personnalisés qui automatisent les étapes de migration (ex. containerisation via App2Container) tout en intégrant des interventions manuelles lorsque nécessaire. Cette automatisation assure une réduction des erreurs et une accélération des délais de migration.&lt;/p&gt;
&lt;h4&gt;Expérience développeur de nouvelle génération dans les projets de migration et modernisation&lt;/h4&gt;
&lt;h5&gt;Réinventer le cycle de vie du développement&lt;/h5&gt;
&lt;p&gt;Les solutions de nouvelle génération visent à optimiser l'expérience développeur en intégrant la GenAI à toutes les étapes du cycle de développement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Planification et Requirements Analysis&lt;/strong&gt; : L’IA assiste dans la création de drafts de documents techniques et l’élaboration de schémas d’architecture à partir d’un simple prompt&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Génération et refactoring du code&lt;/strong&gt; : Amazon QDeveloper permet de générer du code, d’effectuer des revues automatisées et de proposer des corrections basées sur une analyse contextuelle approfondie de la base de code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration dans les pipelines CI/CD&lt;/strong&gt; : Les agents intelligents interagissent avec les systèmes de versionning (ex. Gitlab Duo with AmazonQ) pour automatiser les commits, les tests unitaires et les déploiements ansi que les upgrades (Java), tout en assurant des audits de sécurité en continu&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Collaboration et productivité optimisée&lt;/h5&gt;
&lt;p&gt;L'objectif est de permettre aux développeurs de se concentrer sur la création de valeur en réduisant le temps passé sur des tâches répétitives et administratives. Les outils de génération de documentation, de tests et de transformation de code fournissent une première couche d'analyse et d'optimisation, sur laquelle les experts peuvent ensuite itérer pour affiner les résultats.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;L'approche AWS pour la migration et la modernisation se distingue par une méthodologie intégrée et des outils avancés qui couvrent l'ensemble du processus, depuis l'évaluation initiale et la planification jusqu'à l'exécution, l'optimisation et la modernisation applicative. En combinant des techniques de right-sizing, des workflows automatisés et l'intégration de la GenAI en continue évolution, AWS offre aux entreprises la possibilité de réduire significativement le TCO, d'améliorer la productivité et de transformer sa propre infrastructure en un levier stratégique de compétitivité.&lt;/p&gt;
&lt;p&gt;Cette vision technologique, soutenue par les nombreux outils préséntés dans cet articles et bien d'autres, permet de répondre aux défis complexes des projets de transformation numérique en garantissant une transition rapide, sécurisée et optimisée vers le cloud.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Q &amp;amp; A&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q :&lt;/strong&gt; Dans le cadre de notre partenariat avec AWS, nous disposons d’un outil officiel pour VMware qui facilite l’import/export vers des instances EC2. Toutefois, pour les migrations vers le Cloud depuis des hyperviseurs de type KVM (comme Proxmox ou oVirt) pour lesquels il n’existe pas d’outils de migration directe à ce jour, faut-il encore recourir exclusivement à trouver la bonne instance EC2 baremetal (avec les drivers compatibles pour KVM) et procéder manuellement à la migration, ou existe-t-il une solution plus simple ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A :&lt;/strong&gt; Même s’il n’y a toujours pas d’outils directs comme pour VMware, &lt;strong&gt;AWS Migration Evaluator&lt;/strong&gt; permet de construire des templates personnalisés qui définissent les étapes du processus de migration depuis des environnements KVM. Grâce à ces templates, on peut définir des workflows de migration adaptés à vos besoins, simplifiant ainsi la transition et réduisant le temps et l’effort requis pour migrer vos workloads.&lt;/p&gt;</content><category term="AWS"></category></entry><entry><title>Sécurisez vos CI/CD avec Trivy</title><link href="https://blogppr.alterway.fr/securisez-vos-cicd-avec-trivy.html" rel="alternate"></link><published>2025-02-25T16:00:00+01:00</published><updated>2025-02-25T16:00:00+01:00</updated><author><name>Vincent Jacquet</name></author><id>tag:blogppr.alterway.fr,2025-02-25:/securisez-vos-cicd-avec-trivy.html</id><summary type="html">&lt;p&gt;Trivy permet de détecter des vulnérabilités dans vos projets. Nous allons voir comment l'utiliser avec des exemples concrets.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Sécurisez vos CI/CD avec Trivy&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Des études récentes révèlent que &lt;strong&gt;75 % des conteneurs contiennent des vulnérabilités critiques ou élevées&lt;/strong&gt;, et 85 % des images en production présentent au moins une vulnérabilité non corrigée. &lt;a href="https://www.lemondeinformatique.fr/actualites/lire-la-securite-des-conteneurs-sacrifiee-par-les-developpeurs-85630.html"&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un &lt;a href="https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/"&gt;pipeline CI/CD&lt;/a&gt;, c'est un ensemble d'outils qui automatisent le développement, les tests et le déploiement des applications. Ça permet de rendre tout ce processus plus rapide et plus fiable. Cependant, pour que cela soit véritablement efficace, il est nécessaire de considérer la sécurité dès le début. C'est ce qu'on appelle le "&lt;a href="https://www.redhat.com/fr/topics/devops/shift-left-vs-shift-right"&gt;Shift Left Security&lt;/a&gt;".&lt;/p&gt;
&lt;p&gt;C'est à ce moment précis que &lt;a href="https://trivy.dev/latest/"&gt;Trivy&lt;/a&gt; prend le relais ! Trivy est un outil de détection des vulnérabilités open source qui inspecte les conteneurs, le code et même les dépendances. Il est rapide, intuitif, et s'adapte à beaucoup d'outils DevOps connus. Trivy vous offre la possibilité de détecter des vulnérabilités dès leur apparition, améliorant ainsi considérablement la sécurité de vos applications.&lt;/p&gt;
&lt;h2&gt;Pourquoi utiliser Trivy dans une CI/CD ?&lt;/h2&gt;
&lt;p&gt;Je vais essayer de vous convaincre : &lt;/p&gt;
&lt;p&gt;• &lt;strong&gt;Identification anticipée des vulnérabilités&lt;/strong&gt; : Trivy repère les failles de sécurité basé sur les &lt;a href="https://www.cvedetails.com/"&gt;CVE&lt;/a&gt; et les mauvaises configurations, dès les premières étapes du développement (selon votre CI). &lt;em&gt;Les problèmes n'ont plus de retard, ils arrivent dès qu'on commence à respirer !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;• &lt;strong&gt;Prise en charge multi-cibles&lt;/strong&gt; : Que vous utilisiez &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;, &lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; ou que vous développiez du code applicatif, Trivy répond à toutes vos exigences. Trivy peut aussi bien scanner votre repo pour savoir si un mot de passe y est en clair, comme scanner une image docker et y trouver des éventuelles vulnérabilités, ou encore scanner votre cluster. Une solution unique pour tous vos projets… &lt;em&gt;et pas besoin de consulter 15 experts qui ne sont jamais d’accord !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;• &lt;strong&gt;Intégration transparente&lt;/strong&gt; : Trivy se couple aisément avec vos outils de prédilection tels que &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/ci/"&gt;GitLab CI&lt;/a&gt;, &lt;a href="https://www.jenkins.io/"&gt;Jenkins&lt;/a&gt;, et bien d'autres. Pas besoin de changer vos habitudes, Trivy s'ajoute en douceur à votre workflow, &lt;em&gt;comme un ninja discret… mais efficace !&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Alors convaincu ? Aller on continue …&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Tester rapidement Trivy avec Docker&lt;/h2&gt;
&lt;h3&gt;Étape 1 : Télécharger Trivy (Docker)&lt;/h3&gt;
&lt;p&gt;Pour commencer, vous pouvez utiliser Docker pour télécharger rapidement Trivy. Ouvrez votre terminal et exécutez la commande suivante :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;aquasec/trivy:0.18.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cette commande télécharge l'image Docker de Trivy version 0.18.3. Une fois le téléchargement terminé, vous êtes prêt à scanner !&lt;/p&gt;
&lt;h3&gt;Étape 2 : Scanner une image Docker&lt;/h3&gt;
&lt;p&gt;Pour scanner une image Docker, utilisez la commande suivante. Remplacez &lt;em&gt;&lt;strong&gt;\&amp;lt;nom-image&amp;gt;&lt;/strong&gt;&lt;/em&gt; par le nom de l'image que vous souhaitez analyser. Par exemple, pour scanner une image nommée &lt;code&gt;nginx:latest&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;--rm&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;span class="w"&gt; &lt;/span&gt;aquasec/trivy:0.18.3&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;nginx:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cette commande lance Trivy dans un conteneur Docker et scanne l'image &lt;code&gt;nginx:latest&lt;/code&gt; pour détecter les vulnérabilités.&lt;/p&gt;
&lt;h2&gt;Tester Trivy en local&lt;/h2&gt;
&lt;h3&gt;Installer Trivy&lt;/h3&gt;
&lt;p&gt;Il suffit de suivre la documentation officielle : https://trivy.dev/v0.18.3/installation/&lt;/p&gt;
&lt;p&gt;Mais en résumé, sous linux un simple &lt;code&gt;apt-get install trivy&lt;/code&gt; devrait suffire.&lt;/p&gt;
&lt;h3&gt;Scanner une image docker&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;trivy&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;nginx:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Tout simplement :)&lt;/p&gt;
&lt;h4&gt;Résultat avec un template&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;trivy&lt;span class="w"&gt; &lt;/span&gt;image&lt;span class="w"&gt; &lt;/span&gt;--format&lt;span class="w"&gt; &lt;/span&gt;template&lt;span class="w"&gt; &lt;/span&gt;--template&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@contrib/html.tpl&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;report.html&lt;span class="w"&gt; &lt;/span&gt;nginx:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ici la commande va sortir le résultat sous forme de fichier &lt;code&gt;html&lt;/code&gt;. Pour cela, il faut au préalable avoir le template sur sa machine grâce à la commande &lt;code&gt;wget https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/html.tpl -P contrib/&lt;/code&gt;. Et voici le résultat : &lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot" src="images/trivy-screenshot.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;Intégrer Trivy dans une CI/CD&lt;/h2&gt;
&lt;p&gt;Dans cet exemple, nous allons utiliser GitLab CI pour illustrer l'intégration d'une étape de scan de sécurité avec Trivy : &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;build&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deploy&lt;/span&gt;

&lt;span class="nt"&gt;trivy-scan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;test&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker.io/aquasec/trivy:latest&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;trivy image --clear-cache&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;trivy image --download-db-only&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;trivy image --severity HIGH,CRITICAL nginx:latest&lt;/span&gt;

&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker:latest&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;build&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;echo &amp;quot;Building the project...&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker build -t nginx:latest .&lt;/span&gt;

&lt;span class="nt"&gt;deploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker:latest&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;stage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deploy&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;echo &amp;quot;Deploying the project...&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;docker run -d --name my-app nginx:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ce fichier &lt;code&gt;.gitlab-ci.yml&lt;/code&gt; standard inclut un stage &lt;code&gt;test&lt;/code&gt;, avec un job &lt;code&gt;trivy-scan&lt;/code&gt;. Celui-ci utilise l'image Docker de Trivy pour analyser les vulnérabilités de l'image &lt;code&gt;nginx:latest&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;trivy image --clear-cache&lt;/code&gt; : &lt;ul&gt;
&lt;li&gt;Efface le cache local de Trivy, ce qui garantit l'utilisation des dernières bases de données de vulnérabilités.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trivy image --download-db-only&lt;/code&gt;:&lt;ul&gt;
&lt;li&gt;Télécharge uniquement la base de données des vulnérabilités sans effectuer de scan, pour s'assurer qu'elle est bien à jour.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;trivy image --severity HIGH,CRITICAL nginx:latest&lt;/code&gt; :&lt;ul&gt;
&lt;li&gt;Analyse l’image &lt;code&gt;nginx:latest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ne signale que les vulnérabilités de sévérité &lt;code&gt;HIGH&lt;/code&gt; et &lt;code&gt;CRITICAL&lt;/code&gt;, pour se concentrer sur les plus critiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Note&lt;/h4&gt;
&lt;p&gt;Depuis la version &lt;strong&gt;15.0&lt;/strong&gt; de GitLab CI, des composants officiels sont mis à disposition des développeurs. Parmi eux, on trouve le composant &lt;a href="https://docs.gitlab.com/user/application_security/container_scanning/"&gt;Container Scanning&lt;/a&gt;, qui permet d’analyser automatiquement les images Docker à la recherche de vulnérabilités.&lt;/p&gt;
&lt;p&gt;Avant la version &lt;strong&gt;15.0&lt;/strong&gt;, cette fonctionnalité était exclusivement réservée aux utilisateurs de &lt;em&gt;GitLab Ultimate&lt;/em&gt;. Désormais, elle est disponible gratuitement pour toutes les éditions de GitLab, offrant ainsi un accès élargi aux outils de sécurité des conteneurs.&lt;/p&gt;
&lt;p&gt;Ce composant s’intègre facilement dans un pipeline GitLab CI/CD et repose sur des outils de sécurité comme &lt;strong&gt;Trivy&lt;/strong&gt; ou &lt;strong&gt;Clair&lt;/strong&gt;. Il offre une solution native pour renforcer la sécurité des conteneurs avant leur déploiement.&lt;/p&gt;
&lt;h3&gt;Bonus&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--severity&lt;/code&gt; : Filtre les vulnérabilités par niveau de gravité. Par exemple, &lt;code&gt;--severity CRITICAL,HIGH&lt;/code&gt; pour ne voir que les vulnérabilités critiques et élevées.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ignore-unfixed&lt;/code&gt; : Ignore les vulnérabilités qui n'ont pas de correctif disponible. Utile pour se concentrer sur les problèmes que vous pouvez réellement résoudre.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exit-code&lt;/code&gt; : Définit le code de sortie en fonction de la gravité des vulnérabilités trouvées. Par exemple, &lt;code&gt;--exit-code 1&lt;/code&gt; pour faire échouer le pipeline CI/CD si des vulnérabilités critiques sont détectées.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--format&lt;/code&gt; : Spécifie le format de sortie du rapport. Options incluent table, json, sarif, etc. Par exemple, &lt;code&gt;--format json&lt;/code&gt; pour obtenir un rapport au format JSON.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--ignorefile&lt;/code&gt; : Spécifie un fichier contenant des vulnérabilités à ignorer. Par exemple, &lt;code&gt;--ignorefile .trivyignore&lt;/code&gt; pour utiliser un fichier .trivyignore à la racine de votre projet.&lt;/li&gt;
&lt;li&gt;Trivy a aussi sa propre &lt;a href="https://github.com/aquasecurity/trivy-vscode-extension"&gt;extention Vscode&lt;/a&gt;, ça peut-être super utile en local !&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Les bonnes pratiques&lt;/h2&gt;
&lt;p&gt;La règle numéro 1 : Scannez tôt et souvent ! Ajoutez Trivy dans votre pipeline CI/CD et faites un scan à chaque commit. Comme ça, vous repérez les vulnérabilités avant qu’elles ne fassent trop de dégâts. Votre code reste sécurisé et vous évitez les mauvaises surprises.&lt;/p&gt;
&lt;p&gt;Ensuite, l’automatisation des corrections, c’est toujours une bonne idée. En automatisant les mises à jour et les corrections des dépendances vulnérables, vous réduisez la charge de travail manuelle et vous assurez que votre code est toujours au top sans devoir y penser à chaque instant.&lt;/p&gt;
&lt;h2&gt;Les pièges courants&lt;/h2&gt;
&lt;p&gt;Mais attention, il y a quelques pièges à éviter. Les faux positifs, par exemple, peuvent surgir comme des fantômes. Ne perdez pas de temps à les poursuivre ! Vérifiez chaque alerte pour ne pas partir dans une chasse aux chimères. Un bon processus pour trier les alertes est essentiel pour garder votre esprit clair.&lt;/p&gt;
&lt;p&gt;Les performances, ça peut aussi devenir un casse-tête. Les scans de sécurité peuvent être gourmands en ressources. Mais pas de panique ! Avec des techniques comme le cache et les scans incrémentaux, vous pouvez accélérer tout ça et éviter que votre machine n'implose sous la pression.&lt;/p&gt;
&lt;p&gt;Enfin, n’oubliez pas que Trivy, aussi puissant soit-il, ne doit pas être votre seul bouclier. Pour une sécurité à toute épreuve, n’hésitez pas à combiner plusieurs outils et pratiques. La défense multicouche, c’est la clé pour protéger vos applications des vilaines attaques !&lt;/p&gt;
&lt;p&gt;Voilà, vous êtes prêt à déployer &lt;strong&gt;Trivy&lt;/strong&gt; sans crainte et à garder un oeil sur les pièges !&lt;/p&gt;</content><category term="Security"></category></entry><entry><title>Les Services Template de k0rdent</title><link href="https://blogppr.alterway.fr/les-services-template-de-k0rdent.html" rel="alternate"></link><published>2025-02-20T10:00:00+01:00</published><updated>2025-02-20T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-02-20:/les-services-template-de-k0rdent.html</id><summary type="html">&lt;p&gt;Comprendre les Service Templates dans k0rdent : Une Approche Technique&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Comprendre les Service Templates dans k0rdent : Une Approche Technique&lt;/h1&gt;
&lt;p&gt;Dans l’univers de la gestion de clusters Kubernetes à grande échelle, k0rdent se distingue par sa capacité à orchestrer de multiples plans de contrôle via une approche déclarative et modulaire. &lt;/p&gt;
&lt;p&gt;Parmi ses outils avancés, les service templates jouent un rôle crucial en permettant de déployer et de gérer des services de manière standardisée et réutilisable. &lt;/p&gt;
&lt;p&gt;Cet article technique explore en profondeur ce que sont les service templates dans k0rdent, comment ils sont structurés et comment ils s’intègrent dans l’architecture globale de la plateforme.&lt;/p&gt;
&lt;p&gt;Dans k0rdent, l'utilisation de flux constitue la clé de voûte de l'automatisation et de l'orchestration des déploiements Kubernetes. &lt;/p&gt;
&lt;p&gt;La plateforme s'appuie sur un flux de travail déclaratif qui commence par la définition de la configuration du cluster via des fichiers YAML, garantissant une spécification précise de l'infrastructure souhaitée. &lt;/p&gt;
&lt;p&gt;Le k0rdent Cluster Manager (kcm) prend ensuite le relais pour déployer automatiquement le cluster, en intégrant des outils comme FluxCD et Helm afin d'installer les composants nécessaires. &lt;/p&gt;
&lt;p&gt;Par la suite, le k0rdent State Manager (ksm) configure les politiques de sécurité et déploie les services à travers des « ServiceTemplate », assurant ainsi une cohérence et une conformité optimales sur l'ensemble de l'environnement. &lt;/p&gt;
&lt;p&gt;Ce modèle de flux interconnecté permet non seulement une gestion centralisée et transparente, mais aussi une synchronisation continue avec les dépôts Git, facilitant l'adaptation dynamique aux évolutions des environnements multi-cloud et hybrides. &lt;/p&gt;
&lt;p&gt;Cette approche permet à k0rdent de simplifier la complexité inhérente à la gestion des clusters tout en offrant une solution robuste et scalable pour les équipes DevOps.&lt;/p&gt;
&lt;h3&gt;1. Contexte et Objectifs de k0rdent&lt;/h3&gt;
&lt;p&gt;k0rdent se présente comme un « super control plane » conçu pour centraliser la gestion de clusters Kubernetes, que ce soit sur le cloud, sur site ou dans des environnements hybrides. &lt;/p&gt;
&lt;p&gt;Grâce à une architecture reposant sur des Custom Resource Definitions (CRD) et sur les principes de Kubernetes Cluster API (CAPI), k0rdent offre un moyen déclaratif de décrire et de gérer à la fois l’infrastructure des clusters et les services qui y sont déployés.&lt;/p&gt;
&lt;p&gt;Dans ce cadre, les service templates apportent une abstraction qui permet de définir et de déployer des services de manière standardisée, tout en tirant parti de la puissance des Helm charts.&lt;/p&gt;
&lt;h3&gt;2. Qu’est-ce qu’un Service Template ?&lt;/h3&gt;
&lt;p&gt;Un service template dans k0rdent est un objet Kubernetes personnalisé qui encapsule la définition d’un service à déployer. 
Il s’appuie principalement sur un Helm chart afin d’automatiser l’installation, la configuration et la mise à jour des composants applicatifs ou de contrôle.&lt;/p&gt;
&lt;p&gt;2.1 Structure Technique d’un Service Template
Le service template est une Custom Resource défini en YAML et se présente sous la forme d’un objet de type &lt;strong&gt;ServiceTemplate&lt;/strong&gt; . &lt;/p&gt;
&lt;p&gt;Un exemple de definition de service template :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplate&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus-27.3.1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-prometheus&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;helm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;chartSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;27.3.1&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10m0s&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;sourceRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;HelmRepository&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-prometheus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Avec une custom resource HelmRepository de flux:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;source.toolkit.fluxcd.io/v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;HelmRepository&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-prometheus&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-prometheus&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;k0rdent.mirantis.com/managed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10m0s&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://prometheus-community.github.io/helm-charts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dans cet exemple, plusieurs points techniques sont à noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Helm Integration&lt;/em&gt;&lt;/strong&gt; : La section helm.chartSpec définit le chart à utiliser, sa version ainsi que la fréquence de réconciliation (ici toutes les 10 minutes).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Source de Chart&lt;/strong&gt; : La clé sourceRef référence un objet de type HelmRepository, garantissant que le chart est récupéré depuis une source centralisée et validée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Déploiement déclaratif&lt;/strong&gt; : En définissant l’état souhaité via un CRD, k0rdent s’assure que la configuration du service reste conforme, même en cas de dérive (drift).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au niveau de la custom resource : HelmRepository&lt;/p&gt;
&lt;p&gt;Ce manifeste YAML définit une ressource de type HelmRepository qui fait partie du toolkit FluxCD, utilisé ici pour intégrer et gérer un dépôt de charts Helm dans un environnement GitOps consommé par k0rdent.&lt;/p&gt;
&lt;p&gt;Voici une explication détaillée des différentes sections :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;kind&lt;/strong&gt;: HelmRepository
Le type de ressource est un HelmRepository, ce qui signifie que Flux va interroger ce dépôt pour récupérer les charts Helm disponibles. Cela permet d’automatiser la mise à jour et le déploiement des applications via ces charts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;labels&lt;/strong&gt;:
Le label k0rdent.mirantis.com/managed: "true" peut être utilisé pour identifier que ce HelmRepository est géré ou supervisé par le système k0rdent. Cela facilite le filtrage et la gestion des ressources dans un environnement multi-clusters ou multi-projets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;interval&lt;/strong&gt;: 10m0s
Cela spécifie que Flux va vérifier le dépôt toutes les 10 minutes pour détecter d’éventuelles mises à jour des charts. Ce mécanisme de polling permet d’assurer que les dernières versions ou modifications sont prises en compte de manière automatique.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;url&lt;/strong&gt;: https://prometheus-community.github.io/helm-charts
C’est l’URL du dépôt Helm hébergeant les charts de la communauté Prometheus. Ce dépôt contient une collection de charts pour déployer Prometheus, Grafana, Alertmanager et d’autres outils liés à la surveillance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. L’Extension avec le ServiceTemplateChain&lt;/h3&gt;
&lt;p&gt;Pour renforcer la gestion des versions et faciliter l’évolution des déploiements, k0rdent introduit le concept de &lt;strong&gt;ServiceTemplateChain&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Cet objet est également défini via une CRD et permet de lister ou de valider les templates pris en charge dans une chaîne de déploiement.&lt;/p&gt;
&lt;p&gt;Un exemple simple de définition est le suivant&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplateChain&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus-27.3.1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-prometheus&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;supportedTemplates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus-27.3.1&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus-26.5.1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;availableUpgrades&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;prometheus-27.3.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le &lt;strong&gt;ServiceTemplateChain&lt;/strong&gt; est une ressource personnalisée (CRD) utilisée par k0rdent pour définir quels templates de service sont autorisés dans un certain namespace et comment ils s’enchaînent pour gérer les mises à jour (upgrade paths) d’une application déployée. Autrement dit, il s’agit d’un mécanisme permettant de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Déclarer les templates supportés&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dans le champ spec.supportedTemplates, on liste les noms des ServiceTemplates qui peuvent être utilisés pour déployer un service. Par exemple, dans l’exemple précédent, le template prometheus-27.3.1 est explicitement supporté.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gérer les chemins de mise à jour
  Pour certains templates, il est possible de spécifier des upgrades. Ainsi, dans l’exemple, le template prometheus-26.5.1 dispose d’un chemin de mise à jour vers prometheus-27.3.1. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cela permet à k0rdent de savoir qu’une version antérieure (ici la 26.5.1) peut être mise à jour vers la version 27.3.1.&lt;/p&gt;
&lt;h3&gt;4. Demo sur 2 clusters déployés sur azure&lt;/h3&gt;
&lt;p&gt;Nous allons réaliser une démonstration de la mise en œuvre des service templates en déployant deux clusters AKS à partir du template clustertemplate.k0rdent.mirantis.com/azure-aks-0-1-0. &lt;/p&gt;
&lt;p&gt;Ce template permet de provisionner des clusters Azure Kubernetes Service (AKS) de manière déclarative et conforme aux bonnes pratiques de k0rdent. &lt;/p&gt;
&lt;p&gt;Pour en savoir plus sur l’intégration de k0rdent avec Azure, vous pouvez consulter l’article dédié : &lt;a href="https://blog.alterway.fr/k0rdent-on-azure.html"&gt;k0rdent on Azure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dans cette démonstration, nous allons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Déployer le chart helm cert-manager sur tous les cluster à partir du catalogue d'application de k0rdent (https://catalog.k0rdent.io/) via &lt;code&gt;MultiClusterService&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Déployer buildkit-service uniquement sur le cluster de développemnt (aks-dev-001)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4.1 Pré-requis&lt;/h3&gt;
&lt;p&gt;Pour réaliser cette démonstration de service templates en déployant deux clusters AKS à partir du template clustertemplate.k0rdent.mirantis.com/azure-aks-0-1-0, voici les principaux prérequis à prévoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accès à Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un compte Azure valide, avec un abonnement actif et suffisamment de quota pour créer deux clusters AKS.
  Des droits suffisants (Owner ou Contributor) pour provisionner des ressources dans l’abonnement cible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identifiants Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une Azure Service Principal (SP) configurée avec les rôles adéquats pour déployer des clusters AKS.
  Les variables d’environnement généralement requises par le provider Azure (CAPI) :
  AZURE_SP_APP_ID (client ID de la SP)
  AZURE_SP_PASSWORD (secret de la SP)
  AZURE_SP_TENANT_ID (tenant ID Azure)
  AZURE_SUBSCRIPTION_ID (ID de l’abonnement)
  Ces identifiants seront ensuite stockés dans un objet Credential dans k0rdent, afin d’automatiser le déploiement.&lt;/p&gt;
&lt;p&gt;Voir le point 2. de l'article &lt;a href="https://blog.alterway.fr/k0rdent-on-azure.html"&gt;k0rdent sur Azure&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Management Cluster k0rdent&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un cluster de management Kubernetes (pouvant être un cluster local via kind, un cluster existant, etc.) sur lequel k0rdent est déjà installé et opérationnel.
  Le composant k0rdent Cluster Manager (KCM) doit y être déployé pour gérer la création et la mise à jour des clusters cibles.&lt;/p&gt;
&lt;p&gt;Voir le point 1. de l'article &lt;a href="https://blog.alterway.fr/k0rdent-on-azure.html"&gt;k0rdent sur Azure&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4.2 Création de 2 cluster AKS&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cluster n°1&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: aks-dev-001&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-aks-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  propagateCredentials: false&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels:&lt;/span&gt;
&lt;span class="s"&gt;      cluster_id: &amp;quot;dev001&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      environment: &amp;quot;dev&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      csp: &amp;quot;microsoft-azure&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    machinePools:&lt;/span&gt;
&lt;span class="s"&gt;      system:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;      user:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;clusterdeployment.k0rdent.mirantis.com/aks-dev-001&lt;span class="w"&gt; &lt;/span&gt;created
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Cluster n°2&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: aks-stg-001&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-aks-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  propagateCredentials: false&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels:&lt;/span&gt;
&lt;span class="s"&gt;      cluster_id: &amp;quot;stg001&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      environment: &amp;quot;stg&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      csp: &amp;quot;microsoft-azure&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    machinePools:&lt;/span&gt;
&lt;span class="s"&gt;      system:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;      user:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;ClusterDeployment
NAME&lt;span class="w"&gt;          &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS
aks-dev-001&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;ClusterDeployment&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ready
aks-stg-001&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;ClusterDeployment&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ready
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;managedclusters
NAME&lt;span class="w"&gt;          &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
aks-dev-001&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
aks-stg-001&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/aks-2-by-k0rdent.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h3&gt;4.3  Créer le HelmRepository pour buildkit-service&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: source.toolkit.fluxcd.io/v1&lt;/span&gt;
&lt;span class="s"&gt;kind: HelmRepository&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: buildkit-service&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;  labels:&lt;/span&gt;
&lt;span class="s"&gt;    k0rdent.mirantis.com/managed: &amp;quot;true&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  provider: generic&lt;/span&gt;
&lt;span class="s"&gt;  type: default&lt;/span&gt;
&lt;span class="s"&gt;  url: https://andrcuns.github.io/charts&lt;/span&gt;
&lt;span class="s"&gt;  interval: 10m0s&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Vérification &lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;get&lt;span class="w"&gt; &lt;/span&gt;helmrepositories
NAME&lt;span class="w"&gt;               &lt;/span&gt;URL&lt;span class="w"&gt;                                    &lt;/span&gt;AGE&lt;span class="w"&gt;    &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS
buildkit-service&lt;span class="w"&gt;   &lt;/span&gt;https://andrcuns.github.io/charts&lt;span class="w"&gt;      &lt;/span&gt;28m&lt;span class="w"&gt;    &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;stored&lt;span class="w"&gt; &lt;/span&gt;artifact:&lt;span class="w"&gt; &lt;/span&gt;revision&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sha256:...95a9db4&amp;#39;&lt;/span&gt;
catalog-core&lt;span class="w"&gt;       &lt;/span&gt;oci://ghcr.io/k0rdent/catalog/charts&lt;span class="w"&gt;   &lt;/span&gt;7d4h
kcm-templates&lt;span class="w"&gt;      &lt;/span&gt;oci://ghcr.io/k0rdent/kcm/charts&lt;span class="w"&gt;       &lt;/span&gt;7d4h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;4.4 Déploiement  buildkit-service&lt;/h3&gt;
&lt;h4&gt;4.4.1 Préparation du service template&lt;/h4&gt;
&lt;p&gt;L'objet ServiceTemplate qui référence le chart buildkit-service. 
Dans cet exemple, nous utilisons la version 0.9.0&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;&amp;lt;EOF

apiVersion:&lt;span class="w"&gt; &lt;/span&gt;k0rdent.mirantis.com/v1alpha1
kind:&lt;span class="w"&gt; &lt;/span&gt;ServiceTemplate
metadata:
&lt;span class="w"&gt;  &lt;/span&gt;name:&lt;span class="w"&gt; &lt;/span&gt;buildkit-service-0-9-0
&lt;span class="w"&gt;  &lt;/span&gt;namespace:&lt;span class="w"&gt; &lt;/span&gt;kcm-system
spec:
&lt;span class="w"&gt;  &lt;/span&gt;helm:
&lt;span class="w"&gt;    &lt;/span&gt;chartSpec:
&lt;span class="w"&gt;      &lt;/span&gt;chart:&lt;span class="w"&gt; &lt;/span&gt;buildkit-service
&lt;span class="w"&gt;      &lt;/span&gt;version:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.9.0
&lt;span class="w"&gt;      &lt;/span&gt;interval:&lt;span class="w"&gt; &lt;/span&gt;10m0s
&lt;span class="w"&gt;      &lt;/span&gt;sourceRef:
&lt;span class="w"&gt;        &lt;/span&gt;kind:&lt;span class="w"&gt; &lt;/span&gt;HelmRepository
&lt;span class="w"&gt;        &lt;/span&gt;name:&lt;span class="w"&gt; &lt;/span&gt;buildkit-service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;4.4.2 Préparation du service template chain&lt;/h4&gt;
&lt;p&gt;L’objet ServiceTemplateChain permet de définir la ou les versions disponibles et, éventuellement, les chemins de mise à niveau. 
Dans cet exemple, nous définissons une chaîne simple contenant uniquement le template de buildkit-service créé :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ServiceTemplateChain&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: buildkit-service-chain&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;

&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  supportedTemplates:&lt;/span&gt;
&lt;span class="s"&gt;    - name: buildkit-service-0-9-0&lt;/span&gt;
&lt;span class="s"&gt;      # Vous pouvez ajouter ici d&amp;#39;autres templates et définir des availableUpgrades si vous prévoyez des mises à niveau&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Vérifications&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;ServiceTemplate&lt;span class="w"&gt; &lt;/span&gt;buildkit-service-0-9-0&lt;span class="w"&gt; &lt;/span&gt;
NAME&lt;span class="w"&gt;                      &lt;/span&gt;VALID
buildkit-service-0-9-0&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;ServiceTemplateChain&lt;span class="w"&gt; &lt;/span&gt;buildkit-service-ServiceTemplateChain
NAME&lt;span class="w"&gt;                     &lt;/span&gt;AGE
buildkit-service-chain&lt;span class="w"&gt;   &lt;/span&gt;7s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;4.4.3 Déploiement sur le cluster de dev&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: aks-dev-001&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-aks-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  propagateCredentials: false&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels:&lt;/span&gt;
&lt;span class="s"&gt;      cluster_id: &amp;quot;dev001&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      environment: &amp;quot;dev&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      csp: &amp;quot;microsoft-azure&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    machinePools:&lt;/span&gt;
&lt;span class="s"&gt;      system:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;      user:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_B2s_v2&lt;/span&gt;
&lt;span class="s"&gt;  serviceSpec:&lt;/span&gt;
&lt;span class="s"&gt;    services:&lt;/span&gt;
&lt;span class="s"&gt;      - template: buildkit-service-0-9-0&lt;/span&gt;
&lt;span class="s"&gt;        name: buildkit-service&lt;/span&gt;
&lt;span class="s"&gt;        namespace: buildkit-service&lt;/span&gt;
&lt;span class="s"&gt;    priority: 100&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Vérifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Namespace buildkit-service créé sur le cluster de dev&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/buildkit-service-chain-ns.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Application buildkit-service créé sur le cluster de dev
&lt;center&gt;
&lt;image src="/images/k0rdent/buildkit-service-chain-po.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h3&gt;4.5 Déploiement de cert-manager via MultiClusterService&lt;/h3&gt;
&lt;h4&gt;4.5.1 Rappel&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;servicetemplate
NAME&lt;span class="w"&gt;                      &lt;/span&gt;VALID
buildkit-service-0-9-0&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
cert-manager-1-16-2&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;va&lt;span class="w"&gt; &lt;/span&gt;déployer&lt;span class="w"&gt; &lt;/span&gt;ce&lt;span class="w"&gt; &lt;/span&gt;chart
dex-0-19-1&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
external-secrets-0-11-0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
ingress-nginx-4-11-0&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
ingress-nginx-4-11-3&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
kyverno-3-2-6&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
velero-8-1-0&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;4.5.2 Déployement du MultiClusterService&lt;/h4&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: MultiClusterService&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: global-cert-manager&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  clusterSelector:&lt;/span&gt;
&lt;span class="s"&gt;    matchLabels:&lt;/span&gt;
&lt;span class="s"&gt;      csp: &amp;quot;microsoft-azure&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  serviceSpec:&lt;/span&gt;
&lt;span class="s"&gt;    services:&lt;/span&gt;
&lt;span class="s"&gt;      - name: cert-manager&lt;/span&gt;
&lt;span class="s"&gt;        namespace: cert-manager&lt;/span&gt;
&lt;span class="s"&gt;        template: cert-manager-1-16-2&lt;/span&gt;
&lt;span class="s"&gt;        values: |&lt;/span&gt;
&lt;span class="s"&gt;          installCRDs: true&lt;/span&gt;
&lt;span class="s"&gt;    priority: 300 &lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dans cet exemple, le champ clusterSelector sélectionne les clusters qui possèdent le label csp: microsoft-azure. Le serviceSpec définit le service à déployer en se référant au ServiceTemplate nommé cert-manager-1-16-2 (préalablement créé dans le namespace approprié). 
La priorité (ici à 300) permet de gérer les éventuels conflits en cas de déploiement de plusieurs sources sur le même cluster.&lt;/p&gt;
&lt;p&gt;le bloc YAML défini dans values permet de configurer l'installation des CRD et l'image utilisée par cert-manager. Vous devez adapter ces valeurs à la structure attendue par le chart Helm que vous utilisez. 
Vous pouvez également utiliser le champ valuesFrom pour référencer un ConfigMap ou un Secret contenant vos valeurs.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;multiclusterservice&lt;span class="w"&gt; &lt;/span&gt;global-cert-manager

NAME&lt;span class="w"&gt;                  &lt;/span&gt;AGE
global-cert-manager&lt;span class="w"&gt;   &lt;/span&gt;19s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Vérifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/MultiClusterService-ns.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/MultiClusterService-po.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;h3&gt;4.6 Exemples d'utilisation avancées&lt;/h3&gt;
&lt;h4&gt;4.6.1 Utilisation de valeurs externes via aluesFrom&lt;/h4&gt;
&lt;p&gt;Dans cet exemple, au lieu d’inscrire directement les paramètres dans le manifeste, on utilise valuesFrom pour récupérer les valeurs depuis un ConfigMap externe :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;MultiClusterService&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;global-external-service&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;clusterSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;production&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;serviceSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-external-service&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;external-namespace&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;external-service-1-0-0&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;valuesFrom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;configMapKeyRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;external-service-values&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;values.yaml&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;300&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ce mécanisme est particulièrement utile lorsque la configuration varie selon l’environnement ou doit être centralisée dans un ConfigMap (ou Secret).&lt;/p&gt;
&lt;h4&gt;4.6.2  Gestion des mises à jour avec Service Template Chain&lt;/h4&gt;
&lt;p&gt;Cet exemple montre deux versions d’un service et leur chaîne d’upgrade. Le ServiceTemplateChain permet de définir un chemin de mise à niveau entre la version 1.0.0 et 1.1.0 du service :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# ServiceTemplate pour la version 1.0.0&lt;/span&gt;
&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplate&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-1-0-0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app-namespace&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;helm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;chartSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1.0.0&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10m0s&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;sourceRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;HelmRepository&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-charts&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# ServiceTemplate pour la version 1.1.0&lt;/span&gt;
&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplate&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-1-1-0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app-namespace&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;helm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;chartSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1.1.0&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;10m0s&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;sourceRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;HelmRepository&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-charts&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# Chaîne d&amp;#39;upgrade entre les deux versions&lt;/span&gt;
&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplateChain&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-chain&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app-namespace&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;supportedTemplates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-1-1-0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-1-0-0&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;availableUpgrades&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-service-1-1-0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ainsi, k0rdent saura qu’une mise à niveau de la version 1.0.0 vers 1.1.0 est disponible et pourra gérer ce processus de manière automatisée.&lt;/p&gt;
&lt;h4&gt;4.6.3  Insertion dynamique de valeurs via templating&lt;/h4&gt;
&lt;p&gt;La section values d'un ClusterDeployment injecte dynamiquement des informations spécifiques du cluster (récupérées via Sveltos) dans les valeurs du chart :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ClusterDeployment&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;advanced-cluster&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kcm-system&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;clusterLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;production&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;serviceSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app-namespace&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;my-app-1-0-0&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;app:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;controlPlaneHost: {{ .Cluster.spec.controlPlaneEndpoint.host }}&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;controlPlanePort: &amp;quot;{{ .Cluster.spec.controlPlaneEndpoint.port }}&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;replicaCount: 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ici, les variables &lt;code&gt;{{ .Cluster.spec.controlPlaneEndpoint.host }}&lt;/code&gt; et &lt;code&gt;{{ .Cluster.spec.controlPlaneEndpoint.port }}&lt;/code&gt; seront remplacées par les informations du point d’accès du cluster lors du déploiement du service.&lt;/p&gt;
&lt;p&gt;Dans cet exemple, nous déployons un service ingress-nginx sur des clusters ciblés par le label app: web. &lt;/p&gt;
&lt;p&gt;On utilise le templating pour injecter dynamiquement une valeur extraite d'une annotation du cluster (par exemple, une adresse IP externe) dans les valeurs du chart &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;MultiClusterService&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;global-ingress-with-dynamic-values&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;clusterSelector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;matchLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;web&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;serviceSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ingress-nginx&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ingress-nginx&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ingress-nginx-4-11-3&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="no"&gt;controller:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;replicaCount: 2&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="no"&gt;service:&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;externalTrafficPolicy: Local&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="no"&gt;loadBalancerIP: {{ .Cluster.metadata.annotations.external-ip }}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;350&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ici, la syntaxe {{ .Cluster.metadata.annotations.external-ip }} permet de récupérer dynamiquement l’IP définie dans les annotations du cluster pour la passer au chart d’ingress-nginx&lt;/p&gt;
&lt;h3&gt;5 Conclusion&lt;/h3&gt;
&lt;p&gt;L'approche proposée par k0rdent, via l'utilisation des Services Template, Service Template Chain et MultiClusterService, offre une solution puissante pour simplifier la gestion des applications dans des environnements multi-clusters. &lt;/p&gt;
&lt;p&gt;Ces outils permettent de définir des déploiements standardisés et versionnés à l'aide de charts Helm, tout en facilitant les mises à jour et l'extension des services sur l'ensemble des clusters ciblés. &lt;/p&gt;
&lt;p&gt;En centralisant le contrôle et en automatisant le déploiement des services critiques, cette approche réduit non seulement le risque d'erreurs manuelles, mais améliore également l'agilité et la résilience de l'infrastructure Kubernetes. &lt;/p&gt;
&lt;p&gt;Ainsi, en adoptant ces concepts, les équipes DevOps disposent d'un véritable levier pour optimiser la gestion et la scalabilité de leurs environnements complexes.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>k0rdent on Azure</title><link href="https://blogppr.alterway.fr/k0rdent-on-azure.html" rel="alternate"></link><published>2025-02-13T10:00:00+01:00</published><updated>2025-02-13T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-02-13:/k0rdent-on-azure.html</id><summary type="html">&lt;p&gt;k0rdent : Tests sur Azure&lt;/p&gt;</summary><content type="html">&lt;h1&gt;k0rdent sur Azure avec AKS : Premiers pas&lt;/h1&gt;
&lt;p&gt;Les organisations doivent aujourd’hui faire face à une complexité croissante dans la gestion de leurs infrastructures. 
La centralisation du contrôle et l’automatisation des tâches récurrentes deviennent des impératifs pour assurer la scalabilité, la sécurité et l’efficacité opérationnelle. &lt;/p&gt;
&lt;p&gt;C’est ici qu’intervient &lt;strong&gt;k0rdent&lt;/strong&gt;, en offrant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un contrôle centralisé sur plusieurs clusters Kubernetes&lt;/li&gt;
&lt;li&gt;Une approche déclarative qui permet de réutiliser des templates pour une cohérence inter-environnements&lt;/li&gt;
&lt;li&gt;Une extensibilité facilitée grâce à des modules complémentaires (comme kcm pour la gestion du cycle de vie des clusters, ou kof pour l’observabilité)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce billet de blog détaille l’expérimentation de trois configurations de déploiement sur Azure en utilisant les templates préconçus par k0rdent.&lt;/p&gt;
&lt;h3&gt;1. Création d'un cluster d'administration&lt;/h3&gt;
&lt;p&gt;Pré-requis :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une VM sur Azure 22.04.5 LTS, Jammy Jellyfish&lt;/li&gt;
&lt;li&gt;Homebrew (&lt;code&gt;/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;k0s (&lt;code&gt;curl --proto '=https' --tlsv1.2 -sSf https://get.k0s.sh | sudo sh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;krew (&lt;code&gt;brew install krew&lt;/code&gt;))&lt;/li&gt;
&lt;li&gt;kubectl (&lt;code&gt;brew install kubectl&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;helm (&lt;code&gt;brew install helm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;azure CLI (az) (&lt;code&gt;brew install azure-cli&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;jq (&lt;code&gt;brew install jq&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.1 Création du cluster d'administration&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Création du cluster d&amp;#39;un seul noeud&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;k0s&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;controller&lt;span class="w"&gt; &lt;/span&gt;--single

&lt;span class="c1"&gt;# Démarrage du cluster&lt;/span&gt;
sudo&lt;span class="w"&gt; &lt;/span&gt;k0s&lt;span class="w"&gt; &lt;/span&gt;start

&lt;span class="c1"&gt;# Aliasing&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;source &amp;lt;(kubectl completion bash)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;alias k=kubectl&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;complete -o default -F __start_kubectl k&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc

&lt;span class="c1"&gt;# Copie du kubeconfig &lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;~/.kube
sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;/var/lib/k0s/pki/admin.conf&lt;span class="w"&gt; &lt;/span&gt;~/.kube/config
sudo&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;+r&lt;span class="w"&gt; &lt;/span&gt;~/.kube/config
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;devops:&lt;span class="w"&gt; &lt;/span&gt;/home/devops/.kube/config


&lt;span class="c1"&gt;# Installation des plugins krew&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;krew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ns&lt;span class="w"&gt; &lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;krew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ctx&lt;span class="w"&gt; &lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;krew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;neat
kubectl&lt;span class="w"&gt; &lt;/span&gt;krew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;view-secret
kubectl&lt;span class="w"&gt; &lt;/span&gt;krew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;stern


kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;
NAME&lt;span class="w"&gt;          &lt;/span&gt;STATUS&lt;span class="w"&gt;   &lt;/span&gt;ROLES&lt;span class="w"&gt;           &lt;/span&gt;AGE&lt;span class="w"&gt;     &lt;/span&gt;VERSION
herlec-icdc&lt;span class="w"&gt;   &lt;/span&gt;Ready&lt;span class="w"&gt;    &lt;/span&gt;control-plane&lt;span class="w"&gt;   &lt;/span&gt;6m11s&lt;span class="w"&gt;   &lt;/span&gt;v1.32.1+k0s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;1.2 Installation de k0rdent&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Récupération des valeurs par défaut(au cas ou...)&lt;/span&gt;

helm&lt;span class="w"&gt; &lt;/span&gt;inspect&lt;span class="w"&gt; &lt;/span&gt;values&lt;span class="w"&gt; &lt;/span&gt;oci://ghcr.io/k0rdent/kcm/charts/kcm&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;kcm-values.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Interroge le chart Helm disponible dans le registre OCI (ici sur ghcr.io) pour récupérer les valeurs de configuration par défaut. Le résultat est ensuite redirigé vers le fichier kcm-values.yaml, que vous pourrez modifier si nécessaire.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Installation du kcm&lt;/span&gt;
helm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;kcm&lt;span class="w"&gt; &lt;/span&gt;oci://ghcr.io/k0rdent/kcm/charts/kcm&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.1.0&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system&lt;span class="w"&gt; &lt;/span&gt;--create-namespace&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;kcm-values.yaml

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;

Pulled:&lt;span class="w"&gt; &lt;/span&gt;ghcr.io/k0rdent/kcm/charts/kcm:0.1.0
Digest:&lt;span class="w"&gt; &lt;/span&gt;sha256:accb6d1f9035d3dd46abbd86e10a7cd2c8bf235f8a77d079edeab58dfa9d38e8
NAME:&lt;span class="w"&gt; &lt;/span&gt;kcm
LAST&lt;span class="w"&gt; &lt;/span&gt;DEPLOYED:&lt;span class="w"&gt; &lt;/span&gt;Thu&lt;span class="w"&gt; &lt;/span&gt;Feb&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;08&lt;/span&gt;:02:08&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;
NAMESPACE:&lt;span class="w"&gt; &lt;/span&gt;kcm-system
STATUS:&lt;span class="w"&gt; &lt;/span&gt;deployed
REVISION:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
TEST&lt;span class="w"&gt; &lt;/span&gt;SUITE:&lt;span class="w"&gt; &lt;/span&gt;None
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Installe le chart Helm nommé kcm dans le namespace kcm-system (en créant le namespace si celui-ci n'existe pas) en utilisant la version 0.1.0 du chart. 
Elle applique également les configurations définies dans le fichier kcm-values.yaml pour personnaliser l'installation.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Check du déploiement&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pods&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system&lt;span class="w"&gt; &lt;/span&gt;

&lt;span class="c1"&gt;# Cela peut prendre du temps pour avoir tous les composants installés, &lt;/span&gt;
&lt;span class="c1"&gt;# car c&amp;#39;est le contrôleur qui les installe.&lt;/span&gt;
NAME&lt;span class="w"&gt;                                                          &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;    &lt;/span&gt;RESTARTS&lt;span class="w"&gt;   &lt;/span&gt;AGE
azureserviceoperator-controller-manager-6b4dd86894-gvz8c&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;109s
capa-controller-manager-64bbcb9f8-gx5qz&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;94s
capi-controller-manager-66f8998ff5-tt9xd&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;3m4s
capo-controller-manager-588f45c7cf-57tr2&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;76s
capv-controller-manager-69f7fc65d8-pbgmt&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;64s
capz-controller-manager-544845f786-q24nd&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;109s
helm-controller-7644c4d5c4-98ff7&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m
k0smotron-controller-manager-bootstrap-9fc48d76f-558fw&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/2&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;2m40s
k0smotron-controller-manager-control-plane-7df9bc7bf-hzlfv&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/2&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;2m37s
k0smotron-controller-manager-infrastructure-f7f94dd76-vpv8t&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;/2&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;84s
kcm-cert-manager-895954d88-pmwd4&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;5m59s
kcm-cert-manager-cainjector-685ffdf549-kz2jn&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m
kcm-cert-manager-webhook-59ddc6b56-4ld68&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m
kcm-cluster-api-operator-8487958779-ln8qd&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;3m48s
kcm-controller-manager-7998cdb69-l7ksk&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;3m48s
kcm-velero-b68fd5957-xcnrs&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m
source-controller-6cd7676f7f-25hnw&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m

&lt;span class="c1"&gt;# Verification que projectsveltos est déployé et fonctionnement&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;ns

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;
NAME&lt;span class="w"&gt;              &lt;/span&gt;STATUS&lt;span class="w"&gt;   &lt;/span&gt;AGE
default&lt;span class="w"&gt;           &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;18m
k0s-autopilot&lt;span class="w"&gt;     &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;17m
kcm-system&lt;span class="w"&gt;        &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;8m37s
kube-node-lease&lt;span class="w"&gt;   &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;18m
kube-public&lt;span class="w"&gt;       &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;18m
kube-system&lt;span class="w"&gt;       &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;18m
mgmt&lt;span class="w"&gt;              &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;4m49s
projectsveltos&lt;span class="w"&gt;    &lt;/span&gt;Active&lt;span class="w"&gt;   &lt;/span&gt;5m16s


kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;projectsveltos

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pods&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;projectsveltos&lt;span class="w"&gt;  &lt;/span&gt;
NAME&lt;span class="w"&gt;                                     &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;    &lt;/span&gt;RESTARTS&lt;span class="w"&gt;   &lt;/span&gt;AGE
access-manager-56696cc7f-plxns&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
addon-controller-7c98776c79-wqbjw&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
classifier-manager-7b85f96469-swwjk&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
event-manager-67f6db7f44-btvmj&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
hc-manager-6d579d675f-lnxvb&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
sc-manager-55c99d494b-7d5cx&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
shard-controller-5ff9cd796d-hsm48&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;6m36s
sveltos-agent-manager-7467959f4f-vd2sb&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;5m43s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si &lt;strong&gt;Projectsveltos&lt;/strong&gt; vous intéresse, vous pouvez consulter le blog d'Alter Way pour lire les articles à ce sujet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.alterway.fr/creer-une-usine-a-clusters-kubernetes-partie-1.html"&gt;Créer une usine à clusters kubernetes - partie 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.alterway.fr/creer-une-usine-a-clusters-kubernetes-partie-2.html"&gt;Créer une usine à clusters kubernetes - partie 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.alterway.fr/creer-une-usine-a-clusters-kubernetes-partie-3.html"&gt;Créer une usine à clusters kubernetes - partie 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1.3 Check des différents composant de k0rdent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il faut que tout soit à &lt;code&gt;true&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;Management,providertemplate,clustertemplate&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system

&lt;span class="c1"&gt;# Résultats :&lt;/span&gt;

NAME&lt;span class="w"&gt;                                  &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;RELEASE&lt;span class="w"&gt;     &lt;/span&gt;AGE
management.k0rdent.mirantis.com/kcm&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;kcm-0-1-0&lt;span class="w"&gt;   &lt;/span&gt;21m

NAME&lt;span class="w"&gt;                                                                         &lt;/span&gt;VALID
providertemplate.k0rdent.mirantis.com/cluster-api-0-1-0&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/cluster-api-provider-aws-0-1-0&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/cluster-api-provider-azure-0-1-0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/cluster-api-provider-openstack-0-1-0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/cluster-api-provider-vsphere-0-1-0&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/k0smotron-0-1-0&lt;span class="w"&gt;                        &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/kcm-0-1-0&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
providertemplate.k0rdent.mirantis.com/projectsveltos-0-45-0&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;

NAME&lt;span class="w"&gt;                                                                 &lt;/span&gt;VALID
clustertemplate.k0rdent.mirantis.com/adopted-cluster-0-1-0&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/aws-eks-0-1-0&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/aws-hosted-cp-0-1-0&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/aws-standalone-cp-0-1-0&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/azure-aks-0-1-0&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/azure-hosted-cp-0-1-0&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/azure-standalone-cp-0-1-0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/openstack-standalone-cp-0-1-0&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/vsphere-hosted-cp-0-1-0&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
clustertemplate.k0rdent.mirantis.com/vsphere-standalone-cp-0-1-0&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;2. Usage sur Azure&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;2.1 Connexion à votre compte Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;az&lt;span class="w"&gt; &lt;/span&gt;login&lt;span class="w"&gt; &lt;/span&gt;

To&lt;span class="w"&gt; &lt;/span&gt;sign&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;browser&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;open&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;page&lt;span class="w"&gt; &lt;/span&gt;https://microsoft.com/devicelogin&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;enter&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;code&lt;span class="w"&gt; &lt;/span&gt;C9EQUM9SG&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;authenticate.


Retrieving&lt;span class="w"&gt; &lt;/span&gt;tenants&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;subscriptions&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;selection...

&lt;span class="c1"&gt;# Choisir le tenant sur lequel vous allez manager vos AKS&lt;/span&gt;

&lt;span class="c1"&gt;# Verifier les providers disponibles&lt;/span&gt;
az&lt;span class="w"&gt; &lt;/span&gt;provider&lt;span class="w"&gt; &lt;/span&gt;list&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;[?registrationState==&amp;#39;Registered&amp;#39;]&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
grep&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Microsoft.Compute&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Microsoft.Network&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Microsoft.ContainerService&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Microsoft.ManagedIdentity&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Microsoft.Authorization&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Résultats&lt;/span&gt;
Microsoft.Compute&lt;span class="w"&gt;                   &lt;/span&gt;Registered&lt;span class="w"&gt;           &lt;/span&gt;RegistrationRequired
Microsoft.Network&lt;span class="w"&gt;                   &lt;/span&gt;Registered&lt;span class="w"&gt;           &lt;/span&gt;RegistrationRequired
Microsoft.ContainerService&lt;span class="w"&gt;          &lt;/span&gt;Registered&lt;span class="w"&gt;           &lt;/span&gt;RegistrationRequired
Microsoft.ManagedIdentity&lt;span class="w"&gt;           &lt;/span&gt;Registered&lt;span class="w"&gt;           &lt;/span&gt;RegistrationRequired
Microsoft.Authorization&lt;span class="w"&gt;             &lt;/span&gt;Registered&lt;span class="w"&gt;           &lt;/span&gt;RegistrationFree
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si vous avez déjà créé un cluster AKS sur Azure tout devrait être déjà enregistré&lt;/p&gt;
&lt;p&gt;Si ce n'est pas le cas utiliser la commande &lt;code&gt;az provider register --namespace [nom du service]&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;Par exemple &lt;code&gt;az provider register --namespace Microsoft.ContainerService&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.2 Récupérer les information de la souscription courante&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;az&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;id&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;TENANT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;az&lt;span class="w"&gt; &lt;/span&gt;account&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;--query&lt;span class="w"&gt; &lt;/span&gt;tenantId&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;tsv&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.3 Création d'un compte de service avec le role contributeur sur la souscription&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;SP_INFO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;az&lt;span class="w"&gt; &lt;/span&gt;ad&lt;span class="w"&gt; &lt;/span&gt;sp&lt;span class="w"&gt; &lt;/span&gt;create-for-rbac&lt;span class="w"&gt; &lt;/span&gt;--role&lt;span class="w"&gt; &lt;/span&gt;contributor&lt;span class="w"&gt; &lt;/span&gt;--scopes&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/subscriptions/&lt;/span&gt;&lt;span class="nv"&gt;$SUBSCRIPTION_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;json&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AZURE_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$SP_INFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.appId&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AZURE_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$SP_INFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.password&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;AZURE_TENANT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$SP_INFO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jq&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.tenant&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_CLIENT_ID&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_CLIENT_SECRET&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_TENANT_ID&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.4 Création du secret pour l'authentification de kcm&lt;/strong&gt; &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;kind: Secret&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-cluster-identity-secret&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;  labels:&lt;/span&gt;
&lt;span class="s"&gt;    k0rdent.mirantis.com/component: &amp;quot;kcm&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;stringData:&lt;/span&gt;
&lt;span class="s"&gt;  clientSecret: $AZURE_CLIENT_SECRET # Password retrieved from the Service Principal&lt;/span&gt;
&lt;span class="s"&gt;type: Opaque&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.5 Création du secret  azure-aks-credential (pour le template AKS)&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;kind: Secret&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;  labels:&lt;/span&gt;
&lt;span class="s"&gt;    k0rdent.mirantis.com/component: &amp;quot;kcm&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;stringData:&lt;/span&gt;
&lt;span class="s"&gt;  AZURE_CLIENT_ID: &amp;quot;${AZURE_CLIENT_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  AZURE_CLIENT_SECRET: &amp;quot;${AZURE_CLIENT_SECRET}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  AZURE_SUBSCRIPTION_ID: &amp;quot;${SUBSCRIPTION_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  AZURE_TENANT_ID: &amp;quot;${AZURE_TENANT_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;type: Opaque&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
secret/azure-cluster-identity-secret&lt;span class="w"&gt; &lt;/span&gt;created

&lt;span class="c1"&gt;# Vérifier le contenu du secret avec &lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;view-secret&lt;span class="w"&gt; &lt;/span&gt;azure-cluster-identity-secret&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
Viewing&lt;span class="w"&gt; &lt;/span&gt;only&lt;span class="w"&gt; &lt;/span&gt;available&lt;span class="w"&gt; &lt;/span&gt;key:&lt;span class="w"&gt; &lt;/span&gt;clientSecret
xxxxxxxxxx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.6 Création des authentifications pour k0rdent et capz.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout est fait par références ce qui permet de ne pas avoir de mot de passe dans les manifestes&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: infrastructure.cluster.x-k8s.io/v1beta1&lt;/span&gt;
&lt;span class="s"&gt;kind: AzureClusterIdentity&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-cluster-identity&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;  labels:&lt;/span&gt;
&lt;span class="s"&gt;    clusterctl.cluster.x-k8s.io/move-hierarchy: &amp;quot;true&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    k0rdent.mirantis.com/component: &amp;quot;kcm&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  allowedNamespaces: {}&lt;/span&gt;
&lt;span class="s"&gt;  clientID: $AZURE_CLIENT_ID&lt;/span&gt;
&lt;span class="s"&gt;  clientSecret:&lt;/span&gt;
&lt;span class="s"&gt;    name: azure-cluster-identity-secret&lt;/span&gt;
&lt;span class="s"&gt;    namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;  tenantID: $AZURE_TENANT_ID&lt;/span&gt;
&lt;span class="s"&gt;  type: ServicePrincipal&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
azureclusteridentity.infrastructure.cluster.x-k8s.io/azure-cluster-identity&lt;span class="w"&gt; &lt;/span&gt;created

&lt;span class="c1"&gt;# Vérifier les informations&lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;azureclusteridentity.infrastructure.cluster.x-k8s.io/azure-cluster-identity
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.7 Création des crédences pour kcm&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tout se fait par référence aussi&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: Credential&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-cluster-identity-cred&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  identityRef:&lt;/span&gt;
&lt;span class="s"&gt;    apiVersion: infrastructure.cluster.x-k8s.io/v1beta1&lt;/span&gt;
&lt;span class="s"&gt;    kind: AzureClusterIdentity&lt;/span&gt;
&lt;span class="s"&gt;    name: azure-cluster-identity&lt;/span&gt;
&lt;span class="s"&gt;    namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: Credential&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  description: Azure AKS credentials&lt;/span&gt;
&lt;span class="s"&gt;  identityRef:&lt;/span&gt;
&lt;span class="s"&gt;    apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;    kind: Secret&lt;/span&gt;
&lt;span class="s"&gt;    name: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;    namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;


&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
credential.k0rdent.mirantis.com/azure-cluster-identity-cred&lt;span class="w"&gt; &lt;/span&gt;created

&lt;span class="c1"&gt;# Check &lt;/span&gt;
kubectl&lt;span class="w"&gt; &lt;/span&gt;describe&lt;span class="w"&gt; &lt;/span&gt;credential.k0rdent.mirantis.com/azure-cluster-identity-cred&lt;span class="w"&gt; &lt;/span&gt;

&lt;span class="c1"&gt;# Regardez les informations du status&lt;/span&gt;
Status:
&lt;span class="w"&gt;  &lt;/span&gt;Conditions:
&lt;span class="w"&gt;    &lt;/span&gt;Last&lt;span class="w"&gt; &lt;/span&gt;Transition&lt;span class="w"&gt; &lt;/span&gt;Time:&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;2025&lt;/span&gt;-02-13T09:44:25Z
&lt;span class="w"&gt;    &lt;/span&gt;Message:&lt;span class="w"&gt;               &lt;/span&gt;Credential&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ready
&lt;span class="w"&gt;    &lt;/span&gt;Reason:&lt;span class="w"&gt;                &lt;/span&gt;Succeeded
&lt;span class="w"&gt;    &lt;/span&gt;Status:&lt;span class="w"&gt;                &lt;/span&gt;True
&lt;span class="w"&gt;    &lt;/span&gt;Type:&lt;span class="w"&gt;                  &lt;/span&gt;CredentialReady
&lt;span class="w"&gt;  &lt;/span&gt;Ready:&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2.8 Choix de la localisation du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nous prendons par exemple &lt;code&gt;northeurope&lt;/code&gt;. Prenez celle qui vous sied le mieux&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.9 Choix du template de cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;clustertemplate&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;azure

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
azure-aks-0-1-0&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
azure-hosted-cp-0-1-0&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
azure-standalone-cp-0-1-0&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;azure-standalone-cp-0-1-0&lt;/strong&gt; : Permet de déployer un cluster k0s sur Azure &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;azure-hosted-cp-0-1-0&lt;/strong&gt; : Permet de déployer un cluster kubernetes dont le control plane est géré dans le cluster d'administration (k0smotron)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;azure-aks-0-1-0&lt;/strong&gt; : Déploiement d'un cluster AKS classique&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Test du template azure-aks-0-1-0&lt;/h3&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt;
Déployer un cluster Kubernetes managé via Azure Kubernetes Service (AKS). 
Cette approche tire parti de la robustesse d’AKS en termes de scalabilité, sécurité et intégration native avec les services Azure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points forts :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Simplicité de déploiement : Intégration directe avec le portail Azure et ses API.
Gestion optimisée des ressources : Évolutivité automatique et surveillance native.
Sécurité renforcée : Conformité aux standards Azure et mise à jour des correctifs gérée par Microsoft.
&lt;strong&gt;Cas d’usage :&lt;/strong&gt;
Idéal pour des environnements de production nécessitant une haute disponibilité et une maintenance réduite, avec une prise en charge native par le cloud.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/azure-aks.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.1 Création du déploiement du cluster&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Notes : Faites bien attention au type des machines les nom sont sensible à la casse.&lt;/p&gt;
&lt;p&gt;ex: standard_a4_v2 ne fonctionnera pas il faut avoir Standard_A4_v2&lt;/p&gt;
&lt;p&gt;Pour connaitre tout les paramètres possible au niveau de l'attribut config il faut regarder le fichier &lt;code&gt;values.yaml&lt;/code&gt; situé dans le répertoire templates/cluster/azure-aks du repo &lt;code&gt;https://github.com/k0rdent/kcm.git&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: aks-by-k0rdent&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-aks-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-aks-credential&lt;/span&gt;
&lt;span class="s"&gt;  propagateCredentials: false&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels: {}&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    machinePools:&lt;/span&gt;
&lt;span class="s"&gt;      system:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;      user:&lt;/span&gt;
&lt;span class="s"&gt;        count: 1&lt;/span&gt;
&lt;span class="s"&gt;        vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;


&lt;span class="c1"&gt;# Résultats : &lt;/span&gt;
clusterdeployment.k0rdent.mirantis.com/aks-by-k0rdent&lt;span class="w"&gt; &lt;/span&gt;created
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.2 Suivi de la création du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;clusterdeployment

&lt;span class="c1"&gt;# Résultat&lt;/span&gt;
NAME&lt;span class="w"&gt;             &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS
aks-by-k0rdent&lt;span class="w"&gt;   &lt;/span&gt;False&lt;span class="w"&gt;   &lt;/span&gt;aks-by-k0rdent:&lt;span class="w"&gt; &lt;/span&gt;Waiting&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;control&lt;span class="w"&gt; &lt;/span&gt;plane&lt;span class="w"&gt; &lt;/span&gt;provider&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;indicate&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;control&lt;span class="w"&gt; &lt;/span&gt;plane&lt;span class="w"&gt; &lt;/span&gt;has&lt;span class="w"&gt; &lt;/span&gt;been&lt;span class="w"&gt; &lt;/span&gt;initialized.&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent.&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La clusterAPI crée l'insfrastructure Azure pour déployer l'AKS managé&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;resourcegroups.resources.azure.com

&lt;span class="c1"&gt;# Résultat&lt;/span&gt;
NAME&lt;span class="w"&gt;             &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
aks-by-k0rdent&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/resourcegroup.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;On voit que le cluster AKS &lt;code&gt;aks-by-k0rdent&lt;/code&gt; a bien été créé &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;managedclusters
NAME&lt;span class="w"&gt;             &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
aks-by-k0rdent&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/aks-by-k0rdent.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Node machinePools&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;azureasomanagedmachinepools

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;
NAME&lt;span class="w"&gt;                    &lt;/span&gt;AGE
aks-by-k0rdent-system&lt;span class="w"&gt;   &lt;/span&gt;18m
aks-by-k0rdent-user&lt;span class="w"&gt;     &lt;/span&gt;18m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/aks-by-k0rdent-nodepools.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Au final on a :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;clusterdeployment

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;             &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS
aks-by-k0rdent&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;ClusterDeployment&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ready
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.3 Récupération du kubeconfig&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;az&lt;span class="w"&gt; &lt;/span&gt;aks&lt;span class="w"&gt; &lt;/span&gt;get-credentials&lt;span class="w"&gt; &lt;/span&gt;--resource-group&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent&lt;span class="w"&gt; &lt;/span&gt;--overwrite-existing&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.4 Test du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aks-by-k0rdent.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes

&lt;span class="c1"&gt;# Résultat : &lt;/span&gt;
NAME&lt;span class="w"&gt;                                 &lt;/span&gt;STATUS&lt;span class="w"&gt;   &lt;/span&gt;ROLES&lt;span class="w"&gt;    &lt;/span&gt;AGE&lt;span class="w"&gt;   &lt;/span&gt;VERSION
aks-systempool-34952453-vmss000000&lt;span class="w"&gt;   &lt;/span&gt;Ready&lt;span class="w"&gt;    &lt;/span&gt;&amp;lt;none&amp;gt;&lt;span class="w"&gt;   &lt;/span&gt;14m&lt;span class="w"&gt;   &lt;/span&gt;v1.31.1
aks-userpool-34952453-vmss000000&lt;span class="w"&gt;     &lt;/span&gt;Ready&lt;span class="w"&gt;    &lt;/span&gt;&amp;lt;none&amp;gt;&lt;span class="w"&gt;   &lt;/span&gt;14m&lt;span class="w"&gt;   &lt;/span&gt;v1.31.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3.5 Nettoyage&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;clusterdeployments&lt;span class="w"&gt; &lt;/span&gt;aks-by-k0rdent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Toutes les resources Azure créées sont supprimées&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. Test du Template azure-standalone-cp-0-1-0&lt;/h3&gt;
&lt;hr /&gt;
&lt;p&gt;Ce template permet de créer un cluster kubernetes standard le control plane et worker en VM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectif :&lt;/strong&gt;
Déployer un cluster Kubernetes avec un control plane dédié, entièrement indépendant des services managés d’Azure. Cette configuration permet une personnalisation poussée et une isolation accrue des composants critiques.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points forts :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Personnalisation avancée : Permet de définir des configurations spécifiques pour le control plane sans être limité par les contraintes d’un service managé.
Isolation et sécurité : Un control plane autonome peut offrir une isolation renforcée, essentielle pour des environnements sensibles.
Contrôle total sur la configuration : Les équipes peuvent affiner chaque aspect du déploiement pour répondre à des exigences précises.
Cas d’usage :
Particulièrement intéressant pour des scénarios où la personnalisation et l’optimisation fine du contrôle sont nécessaires, notamment dans des contextes de R&amp;amp;D ou d’infrastructures hybrides.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/azure-standalone-cp-0-1-0.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.1 Création du manifeste de déploiement du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CLUSTER_DEPLOYMENT_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;standalone-cp-azure&amp;quot;&lt;/span&gt;

kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kcm-system&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-standalone-cp-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-cluster-identity-cred&lt;/span&gt;
&lt;span class="s"&gt;  propagateCredentials: true&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels: {}&lt;/span&gt;
&lt;span class="s"&gt;    controlPlaneNumber: 1&lt;/span&gt;
&lt;span class="s"&gt;    workersNumber: 1&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    subscriptionID: &amp;quot;${SUBSCRIPTION_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    clusterIdentity:&lt;/span&gt;
&lt;span class="s"&gt;      name: &amp;quot;azure-cluster-identity&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    controlPlane:&lt;/span&gt;
&lt;span class="s"&gt;      vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;    worker:&lt;/span&gt;
&lt;span class="s"&gt;      vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;    #tenantID: &amp;quot;${AZURE_TENANT_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    #clientID: &amp;quot;${AZURE_CLIENT_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    #clientSecret: &amp;quot;${AZURE_CLIENT_SECRET}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Dans ce cas, nous allons avoir la création sur azure d'un esemble de resource permettant d'avoir une cluster kubernetes complet :
noeuds de "control plane" et worker. Dans notre cas 1 noued de control plane et 1 noeud worker.&lt;/p&gt;
&lt;p&gt;Composants créés :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ressource&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pip-standalone-cp-azure-apiserver&lt;/td&gt;
&lt;td&gt;Public IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pip-standalone-cp-azure-node-natgw&lt;/td&gt;
&lt;td&gt;Public IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-controlplane-nsg&lt;/td&gt;
&lt;td&gt;Network security group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-cp-0&lt;/td&gt;
&lt;td&gt;Virtual machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-cp-0-nic&lt;/td&gt;
&lt;td&gt;Network Interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-cp-0_OSDisk&lt;/td&gt;
&lt;td&gt;Disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-md-n5rsj-2kqvm&lt;/td&gt;
&lt;td&gt;Virtual machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-md-n5rsj-2kqvm-nic&lt;/td&gt;
&lt;td&gt;Network Interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-md-n5rsj-2kqvm_OSDisk&lt;/td&gt;
&lt;td&gt;Disk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-node-natgw&lt;/td&gt;
&lt;td&gt;NAT gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-node-nsg&lt;/td&gt;
&lt;td&gt;Network security group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-node-routetable&lt;/td&gt;
&lt;td&gt;Route table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-public-lb&lt;/td&gt;
&lt;td&gt;Load balancer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standalone-cp-azure-vnet&lt;/td&gt;
&lt;td&gt;Virtual network&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/standalone-cp-azure.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.2 Vérifications&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;resourcegroups,virtualnetworks,virtualnetworkssubnets,natgateways

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                                                    &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
resourcegroup.resources.azure.com/standalone-cp-azure&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded

NAME&lt;span class="w"&gt;                                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
virtualnetwork.network.azure.com/standalone-cp-azure-vnet&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded

NAME&lt;span class="w"&gt;                                                                                                       &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
virtualnetworkssubnet.network.azure.com/standalone-cp-azure-vnet-standalone-cp-azure-controlplane-subnet&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
virtualnetworkssubnet.network.azure.com/standalone-cp-azure-vnet-standalone-cp-azure-node-subnet&lt;span class="w"&gt;           &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded

NAME&lt;span class="w"&gt;                                                          &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;      &lt;/span&gt;MESSAGE
natgateway.network.azure.com/standalone-cp-azure-node-natgw&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;               &lt;/span&gt;Succeeded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;azuremachines

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                                 &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;                    &lt;/span&gt;STATE&lt;span class="w"&gt;       &lt;/span&gt;AGE
standalone-cp-azure-cp-0&lt;span class="w"&gt;             &lt;/span&gt;False&lt;span class="w"&gt;   &lt;/span&gt;Info&lt;span class="w"&gt;       &lt;/span&gt;Creating&lt;span class="w"&gt;                  &lt;/span&gt;Succeeded&lt;span class="w"&gt;   &lt;/span&gt;85s
standalone-cp-azure-md-jmnmx-qrqxt&lt;span class="w"&gt;   &lt;/span&gt;False&lt;span class="w"&gt;   &lt;/span&gt;Info&lt;span class="w"&gt;       &lt;/span&gt;WaitingForBootstrapData&lt;span class="w"&gt;               &lt;/span&gt;67s

devops@herlec-icdc:~$&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;azuremachines

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                                 &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;     &lt;/span&gt;STATE&lt;span class="w"&gt;       &lt;/span&gt;AGE
standalone-cp-azure-cp-0&lt;span class="w"&gt;             &lt;/span&gt;True&lt;span class="w"&gt;                          &lt;/span&gt;Succeeded&lt;span class="w"&gt;   &lt;/span&gt;3m3s
standalone-cp-azure-md-jmnmx-qrqxt&lt;span class="w"&gt;   &lt;/span&gt;False&lt;span class="w"&gt;   &lt;/span&gt;Info&lt;span class="w"&gt;       &lt;/span&gt;Creating&lt;span class="w"&gt;   &lt;/span&gt;Succeeded&lt;span class="w"&gt;   &lt;/span&gt;2m45s

kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;azuremachines


&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                                 &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;SEVERITY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;   &lt;/span&gt;STATE&lt;span class="w"&gt;       &lt;/span&gt;AGE
standalone-cp-azure-cp-0&lt;span class="w"&gt;             &lt;/span&gt;True&lt;span class="w"&gt;                        &lt;/span&gt;Succeeded&lt;span class="w"&gt;   &lt;/span&gt;21m
standalone-cp-azure-md-n5rsj-2kqvm&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;                        &lt;/span&gt;Succeeded&lt;span class="w"&gt;   &lt;/span&gt;20m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;clusterdeployments

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                  &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS
standalone-cp-azure&lt;span class="w"&gt;   &lt;/span&gt;True&lt;span class="w"&gt;    &lt;/span&gt;ClusterDeployment&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;ready
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4.3 Récupération du kubeconfig&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;standalone-cp-azure-kubeconfig&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system

&lt;span class="c1"&gt;# Utilisation du plugin view-secret&lt;/span&gt;

kubectl&lt;span class="w"&gt; &lt;/span&gt;view-secret&lt;span class="w"&gt; &lt;/span&gt;standalone-cp-azure-kubeconfig&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;kubeconfig.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4.4 Test du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
NAME&lt;span class="w"&gt;                                 &lt;/span&gt;STATUS&lt;span class="w"&gt;   &lt;/span&gt;ROLES&lt;span class="w"&gt;           &lt;/span&gt;AGE&lt;span class="w"&gt;   &lt;/span&gt;VERSION
standalone-cp-azure-cp-0&lt;span class="w"&gt;             &lt;/span&gt;Ready&lt;span class="w"&gt;    &lt;/span&gt;control-plane&lt;span class="w"&gt;   &lt;/span&gt;25m&lt;span class="w"&gt;   &lt;/span&gt;v1.31.5+k0s
standalone-cp-azure-md-n5rsj-2kqvm&lt;span class="w"&gt;   &lt;/span&gt;Ready&lt;span class="w"&gt;    &lt;/span&gt;&amp;lt;none&amp;gt;&lt;span class="w"&gt;          &lt;/span&gt;25m&lt;span class="w"&gt;   &lt;/span&gt;v1.31.5+k0s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-A
NAMESPACE&lt;span class="w"&gt;        &lt;/span&gt;NAME&lt;span class="w"&gt;                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;             &lt;/span&gt;RESTARTS&lt;span class="w"&gt;       &lt;/span&gt;AGE
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-kube-controllers-6cd7d8cc9f-bpfzh&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-4cpmm&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-ktjxt&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;26m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-controller-manager-765494fb6f-b67bb&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;58s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;27m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-8qpvz&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-hvzc8&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;26m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-645c5d6f5b-m7jxq&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;26m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-645c5d6f5b-qnnzg&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;26m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-h4sg5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;76s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;5m12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-ppggp&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;75s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;5m12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-fz4x6&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;5m12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-q5pj8&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;5m12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-dbq2r&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;26m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-hvtkv&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;metrics-server-78c4ccbc7f-6ng5r&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
projectsveltos&lt;span class="w"&gt;   &lt;/span&gt;sveltos-agent-manager-789964cb68-6vqtk&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;27m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;4.5 Gestion des erreurs&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;pour le &lt;strong&gt;cloud-controller-manager&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Run:&lt;span class="w"&gt; &lt;/span&gt;Cloud&lt;span class="w"&gt; &lt;/span&gt;provider&lt;span class="w"&gt; &lt;/span&gt;azure&lt;span class="w"&gt; &lt;/span&gt;could&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;be&lt;span class="w"&gt; &lt;/span&gt;initialized&lt;span class="w"&gt; &lt;/span&gt;dynamically&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;kube-system/azure-cloud-
provider:&lt;span class="w"&gt; &lt;/span&gt;NewCloudFromSecret:&lt;span class="w"&gt; &lt;/span&gt;failed&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;secret&lt;span class="w"&gt; &lt;/span&gt;kube-system/azure-cloud-provider:&lt;span class="w"&gt; &lt;/span&gt;secrets&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;azure-cloud-provider&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;not&lt;span class="w"&gt; &lt;/span&gt;found
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La doc n'est pas claire sur ce sujet : (https://docs.k0rdent.io/latest/admin-credentials/?h=cloud+controller+manager#cloud-provider-credentials-propagation)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.6 Tentative de patching à la main&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;view-secret&lt;span class="w"&gt; &lt;/span&gt;standalone-cp-azure-cp-mt-azure-json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'ai créé sur le cluster le secret &lt;code&gt;azure-cloud-provider&lt;/code&gt; dans le ns &lt;code&gt;kube-system&lt;/code&gt; avec les information suivantes :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;kind: Secret&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-cloud-provider&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kube-system&lt;/span&gt;
&lt;span class="s"&gt;type: Opaque&lt;/span&gt;
&lt;span class="s"&gt;stringData:&lt;/span&gt;
&lt;span class="s"&gt;  cloud-config: |-&lt;/span&gt;
&lt;span class="s"&gt;    {&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;cloud&amp;quot;: &amp;quot;AzurePublicCloud&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;tenantId&amp;quot;: &amp;quot;${AZURE_TENANT_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;subscriptionId&amp;quot;: &amp;quot;${AZURE_SUBSCRIPTION_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;aadClientId&amp;quot;: &amp;quot;${AZURE_CLIENT_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;aadClientSecret&amp;quot;: &amp;quot;${AZURE_CLIENT_SECRET}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;resourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;securityGroupName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-node-nsg&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;securityGroupResourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;location&amp;quot;: &amp;quot;northeurope&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vmType&amp;quot;: &amp;quot;vmss&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vnetName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-vnet&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vnetResourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;subnetName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-node-subnet&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;routeTableName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-node-routetable&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;loadBalancerSku&amp;quot;: &amp;quot;Standard&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;loadBalancerName&amp;quot;: &amp;quot;&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;maximumLoadBalancerRuleCount&amp;quot;: 250,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;useManagedIdentityExtension&amp;quot;: false,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;useInstanceMetadata&amp;quot;: true&lt;/span&gt;
&lt;span class="s"&gt;    }&lt;/span&gt;

&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt;  &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kube-system&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;component&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cloud-controller-manager
&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt;  &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kube-system&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csi-azuredisk-node
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;kubeconfig.yaml&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kube-system

&lt;span class="c1"&gt;# Résultat &lt;/span&gt;

NAME&lt;span class="w"&gt;                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;    &lt;/span&gt;RESTARTS&lt;span class="w"&gt;   &lt;/span&gt;AGE
calico-kube-controllers-6cd7d8cc9f-ldl9q&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;82m
calico-node-fwssw&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;82m
calico-node-t5ppw&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;81m
cloud-controller-manager-765494fb6f-5c5kk&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;14m
cloud-node-manager-j4f4f&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;81m
cloud-node-manager-kmkfn&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;82m
coredns-645c5d6f5b-mnnfz&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;81m
coredns-645c5d6f5b-wkfrb&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;81m
csi-azuredisk-controller-54ff6d4cb7-6bfr5&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;13m
csi-azuredisk-controller-54ff6d4cb7-jm2rj&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;13m
csi-azuredisk-node-ckvd4&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;30m
csi-azuredisk-node-ps79t&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;30m
kube-proxy-fk7mt&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;81m
kube-proxy-nqvcd&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;82m
metrics-server-78c4ccbc7f-5hvpb&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;82m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;All Good !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Fin du test &lt;strong&gt;azure-standalone-cp-0-1-0&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.7 Cleaning&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;clusterdeployment&lt;span class="w"&gt; &lt;/span&gt;standalone-cp-azure

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;

clusterdeployment.k0rdent.mirantis.com&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;standalone-cp-azure&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;deleted

&lt;span class="c1"&gt;# CA PREND DU TEMPS ! (Nettoyage de toutes les ressources Azure)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr /&gt;
&lt;h3&gt;5. Test du template azure-hosted-cp-0-1-0&lt;/h3&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/azure-hosted-cp-0-1-0.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;En pré-requis il faut du stockage sur le cluster de management  &lt;/p&gt;
&lt;p&gt;Je vais faire très simple et installer localpath-provisioner de rancher&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.31/deploy/local-path-storage.yaml

kubectl&lt;span class="w"&gt; &lt;/span&gt;patch&lt;span class="w"&gt; &lt;/span&gt;storageclass&lt;span class="w"&gt; &lt;/span&gt;local-path&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;metadata&amp;quot;: {&amp;quot;annotations&amp;quot;:{&amp;quot;storageclass.kubernetes.io/is-default-class&amp;quot;:&amp;quot;true&amp;quot;}}}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Ce template permet de créer un cluster kubernetes dont le control plane est managé par k0smotron dans le cluster de management.
Les workers sont déployés sous forme de VMs Azure.&lt;/p&gt;
&lt;p&gt;Le cluster de management se trouve dans un resource group qui s'appelle &lt;code&gt;aaaaa-herlec-icdc&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;J'ai :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un vnet : herlec-icdc-vnet&lt;/li&gt;
&lt;li&gt;un subnet : default&lt;/li&gt;
&lt;li&gt;un nsg : herlec-icdc-nsg&lt;/li&gt;
&lt;li&gt;une route table herlec-icdc-routetable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;5.1 Création du manifeste de déploiement du cluster&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-hosted-cp&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-hosted-cp-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-cluster-identity-cred&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels: {}&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;westeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    subscriptionID: &amp;quot;${AZURE_SUBSCRIPTION_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;    workersNumber: 2&lt;/span&gt;
&lt;span class="s"&gt;    resourceGroup: aaaaa-herlec-icdc&lt;/span&gt;
&lt;span class="s"&gt;    network:&lt;/span&gt;
&lt;span class="s"&gt;      vnetName: herlec-icdc-vnet&lt;/span&gt;
&lt;span class="s"&gt;      nodeSubnetName: default&lt;/span&gt;
&lt;span class="s"&gt;      routeTableName: herlec-icdc-routetable&lt;/span&gt;
&lt;span class="s"&gt;      securityGroupName: herlec-icdc-nsg&lt;/span&gt;
&lt;span class="s"&gt;    k0smotron:&lt;/span&gt;
&lt;span class="s"&gt;      service:&lt;/span&gt;
&lt;span class="s"&gt;        type: ClusterIP&lt;/span&gt;
&lt;span class="s"&gt;        #apiPort: 30443&lt;/span&gt;
&lt;span class="s"&gt;        #konnectivityPort: 30132&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'ai une erreur concernant k0smotron qui n'a pas d'adresse IP sur son service &lt;strong&gt;loadbalancer&lt;/strong&gt;.
Il faudra que je regarde si au niveau du déploiement on peut gérer ce paramètre.
Je vais la forcer avec l'adresse ip publique et  privée de ma VM.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;svc&lt;span class="w"&gt; &lt;/span&gt;mc-azure-hosted-cp-lb&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;

mc-azure-hosted-cp-lb&lt;span class="w"&gt;       &lt;/span&gt;LoadBalancer&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.104.136.148&lt;span class="w"&gt;   &lt;/span&gt;&amp;lt;pending&amp;gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;:30661/TCP,8132:30619/TCP&lt;span class="w"&gt;   &lt;/span&gt;58m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Patching&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;patch&lt;span class="w"&gt; &lt;/span&gt;svc&lt;span class="w"&gt; &lt;/span&gt;kmc-azure-hosted-cp-lb&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;merge&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;spec&amp;quot;:{&amp;quot;externalIPs&amp;quot;:[&amp;quot;10.0.0.4&amp;quot;, &amp;quot;13.xx.xx.xx&amp;quot;]}}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;svc&lt;span class="w"&gt; &lt;/span&gt;mc-azure-hosted-cp-lb&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
kmc-azure-hosted-cp-lb&lt;span class="w"&gt;       &lt;/span&gt;LoadBalancer&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.104.136.148&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.0.4,13.xxx.xx.xx&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;:30661/TCP,8132:30619/TCP&lt;span class="w"&gt;   &lt;/span&gt;64m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;5.2 Méthode alternative&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Même comme ca, en forçant l'adresse IP sur l'ip publique de la VM ca ne marche pas. &lt;/p&gt;
&lt;p&gt;Je vais donc redéployer kcml sur un cluster d'administration &lt;strong&gt;basé sur AKS&lt;/strong&gt;. de cette manière l'intégration à l'eco-système Azure sera plus simple.
Stockage, loadbalancers.&lt;/p&gt;
&lt;p&gt;Je vais créer un vnet, subnet, Route table et un nsg&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-&lt;span class="w"&gt; &lt;/span&gt;resourcegroup&lt;span class="w"&gt;   &lt;/span&gt;:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp
-&lt;span class="w"&gt; &lt;/span&gt;un&lt;span class="w"&gt; &lt;/span&gt;vnet&lt;span class="w"&gt;         &lt;/span&gt;:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp-vnet
-&lt;span class="w"&gt; &lt;/span&gt;un&lt;span class="w"&gt; &lt;/span&gt;subnet&lt;span class="w"&gt;       &lt;/span&gt;:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp-subnet-001
-&lt;span class="w"&gt; &lt;/span&gt;un&lt;span class="w"&gt; &lt;/span&gt;nsg&lt;span class="w"&gt;          &lt;/span&gt;:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp-nsg-001
-&lt;span class="w"&gt; &lt;/span&gt;une&lt;span class="w"&gt; &lt;/span&gt;route&lt;span class="w"&gt; &lt;/span&gt;table&lt;span class="w"&gt; &lt;/span&gt;:&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp-rt-001
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/001-kcm-k8s-hosted-cp-rg.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/001-kcm-k8s-hosted-cp-subnet.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterDeployment&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: 001-kcm-k8s-hosted-cp&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  template: azure-hosted-cp-0-1-0&lt;/span&gt;
&lt;span class="s"&gt;  credential: azure-cluster-identity-cred&lt;/span&gt;
&lt;span class="s"&gt;  config:&lt;/span&gt;
&lt;span class="s"&gt;    clusterLabels: {}&lt;/span&gt;
&lt;span class="s"&gt;    location: &amp;quot;northeurope&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    subscriptionID: &amp;quot;${AZURE_SUBSCRIPTION_ID}&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    vmSize: Standard_A4_v2&lt;/span&gt;
&lt;span class="s"&gt;    workersNumber: 2&lt;/span&gt;
&lt;span class="s"&gt;    resourceGroup: 001-kcm-k8s-hosted-cp&lt;/span&gt;
&lt;span class="s"&gt;    network:&lt;/span&gt;
&lt;span class="s"&gt;      vnetName: 001-kcm-k8s-hosted-cp-vnet&lt;/span&gt;
&lt;span class="s"&gt;      nodeSubnetName: 001-kcm-k8s-hosted-cp-subnet-001&lt;/span&gt;
&lt;span class="s"&gt;      routeTableName: 001-kcm-k8s-hosted-cp-rt-001&lt;/span&gt;
&lt;span class="s"&gt;      securityGroupName: 001-kcm-k8s-hosted-cp-nsg-001&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'ai bien la création d'un loadbalancer pour le control plane géré par k0smotron&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kmc-001-kcm-k8s-hosted-cp-lb&lt;span class="w"&gt;  &lt;/span&gt;LoadBalancer&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.0.228.50&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;135&lt;/span&gt;.x.x.9&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;:32191/TCP,8132:30190/TCP&lt;span class="w"&gt;  &lt;/span&gt;

&lt;span class="c1"&gt;# Test curl &lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-k&lt;span class="w"&gt; &lt;/span&gt;https://135.x.x.9:6443

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;kind&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Status&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;apiVersion&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;v1&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;metadata&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Failure&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unauthorized&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reason&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unauthorized&amp;quot;&lt;/span&gt;,
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;401&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;C'est OK!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.3 Récupération du kubeconfig&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;view-secret&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp-kubeconfig&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kcm-system&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf


&lt;span class="c1"&gt;# Vérifications &lt;/span&gt;
&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes&lt;span class="w"&gt; &lt;/span&gt;
No&lt;span class="w"&gt; &lt;/span&gt;resources&lt;span class="w"&gt; &lt;/span&gt;found


&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-A

&lt;span class="c1"&gt;# Résultats&lt;/span&gt;
NAMESPACE&lt;span class="w"&gt;        &lt;/span&gt;NAME&lt;span class="w"&gt;                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;    &lt;/span&gt;RESTARTS&lt;span class="w"&gt;   &lt;/span&gt;AGE
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-kube-controllers-6cd7d8cc9f-k8xd7&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;48s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-controller-manager-668b5cf9b6-trzsv&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;48s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-7b7b486b6c-vjh7v&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;49s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;metrics-server-78c4ccbc7f-kcmqs&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;48s
projectsveltos&lt;span class="w"&gt;   &lt;/span&gt;sveltos-agent-manager-7c967bfdd5-7c4d9&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;24s


&lt;span class="c1"&gt;# Aucun des pods n&amp;#39;est prets !&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Quand on regarde la documentation il y a une note qui n'est pas clair, car on ne sait pas quand il faut patcher la resource &lt;code&gt;azurecluster&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Référence : https://docs.k0rdent.io/v0.1.0/template-azure/&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;azurecluster

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;

NAME&lt;span class="w"&gt;                    &lt;/span&gt;CLUSTER&lt;span class="w"&gt;                 &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;REASON&lt;span class="w"&gt;   &lt;/span&gt;AGE
&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp&lt;span class="w"&gt;                    &lt;/span&gt;3m21s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'ai donc patché la resource pour voir si ca changeait quelque chose 😀&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;patch&lt;span class="w"&gt; &lt;/span&gt;azurecluster&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp&lt;span class="w"&gt;  &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;merge&lt;span class="w"&gt; &lt;/span&gt;--subresource&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt; &lt;/span&gt;--patch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;status: {ready: true}&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# Résultat :&lt;/span&gt;
azurecluster.infrastructure.cluster.x-k8s.io/001-kcm-k8s-hosted-cp&lt;span class="w"&gt; &lt;/span&gt;patched
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Et ... ca fonctionne !!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/001-kcm-k8s-hosted-cp-resources.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;J'ai bien 2 vm qui sont provisionnées&lt;/p&gt;
&lt;p&gt;Maintenant on a : &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-A

NAMESPACE&lt;span class="w"&gt;        &lt;/span&gt;NAME&lt;span class="w"&gt;                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;             &lt;/span&gt;RESTARTS&lt;span class="w"&gt;       &lt;/span&gt;AGE
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-kube-controllers-6cd7d8cc9f-pvvwh&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;86m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-2wfrf&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m9s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-tw7vs&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m10s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-controller-manager-668b5cf9b6-k9jx4&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;41s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;6m26s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-nllzg&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m10s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-vl2j8&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m9s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-645c5d6f5b-2tldj&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;3m59s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-645c5d6f5b-cv4nz&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;3m59s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-44q7b&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;23s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;2m41s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-k6zvx&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;CrashLoopBackOff&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8s&lt;span class="w"&gt; &lt;/span&gt;ago&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;2m41s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-4p268&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;2m41s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-qjp8j&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;2m41s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;konnectivity-agent-j4r4n&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m10s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;konnectivity-agent-j7lng&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m9s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-nq7z6&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m9s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-s6m2s&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;4m10s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;metrics-server-78c4ccbc7f-qdz88&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;86m
projectsveltos&lt;span class="w"&gt;   &lt;/span&gt;sveltos-agent-manager-665b9479b8-8mmm4&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;86m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Il va falloir fixer encore le &lt;strong&gt;cloud-controller-manager&lt;/strong&gt; comme à l'étape précédente&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;CLUSTER_DEPLOYMENT_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;001-kcm-k8s-hosted-cp&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LOCATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;northeurope&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: v1&lt;/span&gt;
&lt;span class="s"&gt;kind: Secret&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: azure-cloud-provider&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kube-system&lt;/span&gt;
&lt;span class="s"&gt;type: Opaque&lt;/span&gt;
&lt;span class="s"&gt;stringData:&lt;/span&gt;
&lt;span class="s"&gt;  cloud-config: |-&lt;/span&gt;
&lt;span class="s"&gt;    {&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;cloud&amp;quot;: &amp;quot;AzurePublicCloud&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;tenantId&amp;quot;: &amp;quot;${AZURE_TENANT_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;subscriptionId&amp;quot;: &amp;quot;${AZURE_SUBSCRIPTION_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;aadClientId&amp;quot;: &amp;quot;${AZURE_CLIENT_ID}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;aadClientSecret&amp;quot;: &amp;quot;${AZURE_CLIENT_SECRET}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;resourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;securityGroupName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-nsg-001&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;securityGroupResourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;location&amp;quot;: &amp;quot;${LOCATION}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vmType&amp;quot;: &amp;quot;vmss&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vnetName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-vnet&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;vnetResourceGroup&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;subnetName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-subnet-001&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;routeTableName&amp;quot;: &amp;quot;${CLUSTER_DEPLOYMENT_NAME}-rt-001&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;loadBalancerSku&amp;quot;: &amp;quot;Standard&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;loadBalancerName&amp;quot;: &amp;quot;&amp;quot;,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;maximumLoadBalancerRuleCount&amp;quot;: 250,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;useManagedIdentityExtension&amp;quot;: false,&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;useInstanceMetadata&amp;quot;: true&lt;/span&gt;
&lt;span class="s"&gt;    }&lt;/span&gt;

&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Je provoque un redémarrage des pods du namespace &lt;code&gt;kube-system&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kube-system&lt;span class="w"&gt;  &lt;/span&gt;rollout&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;cloud-controller-manager&lt;span class="w"&gt; &lt;/span&gt;csi-azuredisk-controller&lt;span class="w"&gt; &lt;/span&gt;calico-kube-controllers&lt;span class="w"&gt; &lt;/span&gt;metrics-server&lt;span class="w"&gt; &lt;/span&gt;coredns
deployment.apps/cloud-controller-manager&lt;span class="w"&gt; &lt;/span&gt;restarted
deployment.apps/csi-azuredisk-controller&lt;span class="w"&gt; &lt;/span&gt;restarted
deployment.apps/calico-kube-controllers&lt;span class="w"&gt; &lt;/span&gt;restarted
deployment.apps/metrics-server&lt;span class="w"&gt; &lt;/span&gt;restarted
deployment.apps/coredns&lt;span class="w"&gt; &lt;/span&gt;restarted


&lt;span class="c1"&gt;# Vérifications :&lt;/span&gt;

&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;po&lt;span class="w"&gt; &lt;/span&gt;-A

NAMESPACE&lt;span class="w"&gt;        &lt;/span&gt;NAME&lt;span class="w"&gt;                                        &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;STATUS&lt;span class="w"&gt;    &lt;/span&gt;RESTARTS&lt;span class="w"&gt;   &lt;/span&gt;AGE
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-kube-controllers-555f4ffcbc-ks7r5&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;10s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-mvqms&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;18m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;calico-node-rcztl&lt;span class="w"&gt;                           &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;19m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-controller-manager-8d7d987f8-jpx4n&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;13s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-ltz8t&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m32s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;cloud-node-manager-msnw6&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m32s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-645c5d6f5b-cfkt2&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;9m36s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-6c4b58d497-685fl&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;coredns-6c4b58d497-kw87j&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-rrm4n&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m20s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-54ff6d4cb7-rs7mf&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m20s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-controller-7c45dc7f7f-twc89&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/6&lt;span class="w"&gt;     &lt;/span&gt;Pending&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;13s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-vlc2b&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m20s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;csi-azuredisk-node-zsfdj&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;/3&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;8m20s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;konnectivity-agent-pxrv2&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;9m34s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;konnectivity-agent-x5spn&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;9m34s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-59rb9&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;18m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;kube-proxy-n5wp6&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;18m
kube-system&lt;span class="w"&gt;      &lt;/span&gt;metrics-server-5b9b76db47-tqk67&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;12s
kube-system&lt;span class="w"&gt;      &lt;/span&gt;metrics-server-78c4ccbc7f-w8phh&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;7m11s
projectsveltos&lt;span class="w"&gt;   &lt;/span&gt;sveltos-agent-manager-7c967bfdd5-7c4d9&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;Running&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;28m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Maintenant tout est Okubectl !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.4 Test du cluster créé&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt;  &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;--image&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;default
&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt;  &lt;/span&gt;expose&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;web&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="w"&gt; &lt;/span&gt;LoadBalancer&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;--port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;

&lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp.conf&lt;span class="w"&gt; &lt;/span&gt;kubectl&lt;span class="w"&gt;  &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;deploy,svc&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;default

&lt;span class="c1"&gt;# Résultats :&lt;/span&gt;
NAME&lt;span class="w"&gt;                  &lt;/span&gt;READY&lt;span class="w"&gt;   &lt;/span&gt;UP-TO-DATE&lt;span class="w"&gt;   &lt;/span&gt;AVAILABLE&lt;span class="w"&gt;   &lt;/span&gt;AGE
deployment.apps/web&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;/1&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;3m22s

NAME&lt;span class="w"&gt;                 &lt;/span&gt;TYPE&lt;span class="w"&gt;           &lt;/span&gt;CLUSTER-IP&lt;span class="w"&gt;      &lt;/span&gt;EXTERNAL-IP&lt;span class="w"&gt;     &lt;/span&gt;PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;AGE
service/kubernetes&lt;span class="w"&gt;   &lt;/span&gt;ClusterIP&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.96.0.1&lt;span class="w"&gt;       &lt;/span&gt;&amp;lt;none&amp;gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;/TCP&lt;span class="w"&gt;        &lt;/span&gt;34m
service/web&lt;span class="w"&gt;          &lt;/span&gt;LoadBalancer&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.101.53.225&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.208.216.226&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;:32732/TCP&lt;span class="w"&gt;   &lt;/span&gt;2m14s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le cloud controller fonctionne bien il a créé un loadbalancer qui pointe sur les vm du cluster kubernetes&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/001-kcm-k8s-hosted-cp-lb.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.5 Test de l'accès au service web&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;-I&lt;span class="w"&gt; &lt;/span&gt;-w&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%{http_code}&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;.208.216.226&lt;span class="w"&gt; &lt;/span&gt;

&lt;span class="m"&gt;200&lt;/span&gt;%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Le déprovisionnement fonctionne aussi très bien le loadbalancer ainsi que l'adresse ip publique sont bien supprimés&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.6 Cleaning&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Très important !  &lt;/span&gt;

kubectl&lt;span class="w"&gt; &lt;/span&gt;patch&lt;span class="w"&gt; &lt;/span&gt;azurecluster&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp&lt;span class="w"&gt;  &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;merge&lt;span class="w"&gt; &lt;/span&gt;--patch&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;metadata: {finalizers: [manual]}&amp;#39;&lt;/span&gt;

kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;clusterdeployment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp

&lt;span class="c1"&gt;# CA PREND DU TEMPS ! (Nettoyage de toutes les ressources Azure)&lt;/span&gt;

&lt;span class="c1"&gt;# Libérer la resource pour sa suppression &lt;/span&gt;

kubectl&lt;span class="w"&gt; &lt;/span&gt;patch&lt;span class="w"&gt; &lt;/span&gt;azurecluster&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;001&lt;/span&gt;-kcm-k8s-hosted-cp&lt;span class="w"&gt; &lt;/span&gt;--type&lt;span class="o"&gt;=&lt;/span&gt;json&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[{&amp;quot;op&amp;quot;: &amp;quot;remove&amp;quot;, &amp;quot;path&amp;quot;: &amp;quot;/metadata/finalizers/0&amp;quot;}]&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;6. Conclusions&lt;/h3&gt;
&lt;p&gt;k0rdent (kcm) démontre sa capacité à simplifier considérablement le déploiement et la gestion de clusters Kubernetes sur Azure. 
Que ce soit pour des clusters AKS entièrement managés, des clusters k0s autonomes, ou des clusters avec un plan de contrôle hébergé, k0rdent offre une abstraction puissante grâce à l'intégration de Cluster API. &lt;/p&gt;
&lt;p&gt;L'automatisation fournie par k0rdent réduit la complexité, accélère les déploiements, et permet aux équipes de se concentrer sur leurs applications plutôt que sur l'infrastructure sous-jacente. &lt;/p&gt;
&lt;p&gt;L'utilisation de templates préconfigurés et la gestion centralisée des identifiants facilitent grandement l'adoption de Kubernetes sur Azure.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Context-Aware Identity Management (avec Kyverno)</title><link href="https://blogppr.alterway.fr/context-aware-identity-management-avec-kyverno.html" rel="alternate"></link><published>2025-02-10T12:00:00+01:00</published><updated>2025-02-10T12:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-02-10:/context-aware-identity-management-avec-kyverno.html</id><summary type="html">&lt;p&gt;Context-Aware Identity Management (avec Kyverno)&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Beyond the Static Gates&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Salut les passionnés de Kubernetes !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Soyons réalistes, RBAC dans Kubernetes, bien qu'essentiel, peut donner l'impression d'avoir un videur qui ne vérifie que les cartes d'identité sans se soucier de savoir si vous êtes sur le point de causer des problèmes. &lt;/p&gt;
&lt;p&gt;Il vous fait passer la porte, mais il ne sait rien de vous ni pourquoi vous êtes là maintenant.&lt;/p&gt;
&lt;p&gt;Imaginez ceci : un développeur accède accidentellement à une base de données de production depuis son réseau domestique à 3 heures du matin. 
RBAC dit : "Oui, vous avez le rôle", mais il passe complètement à côté des signaux d'alerte criant "Violation de sécurité potentielle !"&lt;/p&gt;
&lt;p&gt;C'est là que la gestion des identités contextuelles (Context-Aware Identity Management - CAIM) entre en jeu. &lt;/p&gt;
&lt;p&gt;C'est comme donner à votre videur un badge de détective, la capacité de lire dans les pensées et peut-être une API de vérification des antécédents. &lt;/p&gt;
&lt;p&gt;CAIM vous permet de contrôler l'accès aux ressources Kubernetes en fonction du contexte de la requête - qui, quoi, quand, où, comment... tout.&lt;/p&gt;
&lt;p&gt;Il ne s'agit pas seulement de renforcer la sécurité, mais d'ajouter une couche de sécurité intelligente qui comprend les nuances de votre environnement et s'adapte dynamiquement aux menaces potentielles. &lt;/p&gt;
&lt;p&gt;Prêt à passer à la vitesse supérieure en matière de sécurité Kubernetes ? Plongeons-nous dedans !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le Problème avec RBAC Seul : Des Rôles Statiques dans un Monde Dynamique&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le contrôle d'accès basé sur les rôles (RBAC) de Kubernetes est le fondement de l'autorisation. Nous définissons des Rôles (quelles actions peuvent être effectuées) et des RoleBindings (qui peut effectuer ces actions). Solide, n'est-ce pas ?&lt;/p&gt;
&lt;p&gt;Pas tout à fait. Considérez ces limitations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manque de Contrôle Granulaire&lt;/strong&gt; : RBAC a du mal à appliquer des politiques précises. Pouvez-vous facilement dire : "Les développeurs de l'équipe A peuvent seulement lire les logs de production pendant les sessions de débogage" ? C'est complexe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nature Statique&lt;/strong&gt; : Les permissions sont fixes. Elles ne s'adaptent pas en fonction de l'heure, du lieu ou du périphérique. Un compte compromis a les mêmes permissions, peu importe où ou quand il est utilisé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cauchemar de la Gestion des Exceptions&lt;/strong&gt; : Besoin d'accorder un accès temporaire à une ressource spécifique pour une durée limitée ? RBAC rend cela lourd et sujet aux erreurs.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RBAC fournit une base de sécurité de base, mais ce n'est tout simplement pas suffisant pour les environnements complexes et à enjeux élevés d'aujourd'hui. Nous avons besoin de quelque chose de plus intelligent.&lt;/p&gt;
&lt;h3&gt;L'Identité Contextuelle : L'Autorisation avec un Cerveau&lt;/h3&gt;
&lt;p&gt;La gestion des identités contextuelles fait passer l'autorisation au niveau supérieur. Au lieu de faire confiance aveuglément aux rôles, elle évalue une requête en fonction d'un ensemble riche d'attributs contextuels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte de l'Utilisateur&lt;/strong&gt; : Rôle, appartenances aux groupes, fonction, département, habilitation de sécurité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte de la Ressource&lt;/strong&gt; : Type de ressource, étiquettes, espace de noms, niveau de sensibilité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte Temporel&lt;/strong&gt; : Heure de la journée, jour de la semaine, fenêtres de maintenance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte Géographique&lt;/strong&gt; : Localisation de l'utilisateur, adresse IP d'origine, segment de réseau.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte du Périphérique&lt;/strong&gt; : Type de périphérique, système d'exploitation, posture de sécurité (par exemple, statut de l'antivirus).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contexte des Menaces&lt;/strong&gt; : Flux d'informations sur les menaces en temps réel, scores de détection d'anomalies.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec CAIM, vous pouvez définir des politiques comme celles-ci :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;"Autoriser l'accès à la base de données de production uniquement depuis le réseau d'entreprise, pendant les heures de bureau, et uniquement aux membres du groupe 'administrateurs-de-base-de-données'."&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"Refuser l'accès aux données sensibles des clients à partir de tout périphérique qui n'est pas conforme aux politiques de sécurité de l'entreprise (par exemple, absence d'antivirus ou OS obsolète)."&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"Escalader automatiquement les permissions lors d'un incident de sécurité en fonction du niveau de gravité."&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Techniquement comment faire ?&lt;/h3&gt;
&lt;p&gt;Prenons un exemple :  &lt;strong&gt;Use case : Un utilisateur ne peux acceder aux resources d'un certain namespace seulement entre 8h et 19h&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Voici une approche détaillée et plusieurs solutions pour implémenter une gestion d'identité contextuelle dans Kubernetes, en mettant l'accent sur notre exemple de restriction horaire :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Défis avec Kubernetes RBAC Standard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le RBAC (Role-Based Access Control) natif de Kubernetes est puissant pour gérer l'autorisation basée sur les rôles. Cependant, il est &lt;strong&gt;limité pour la gestion contextuelle&lt;/strong&gt;.  Le RBAC standard ne permet pas nativement de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Définir des conditions temporelles dans les règles RBAC.&lt;/li&gt;
&lt;li&gt;Intégrer facilement des sources de contexte externes (localisation, appareil, etc.).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Solutions pour la CAIM dans Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour implémenter la CAIM, vous devrez étendre les capacités de Kubernetes. Voici les approches principales :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Admission Webhooks (Authorization Webhooks) Personnalisés&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Principe :&lt;/strong&gt; Vous pouvez créer un webhook d'admission d'autorisation personnalisé. Kubernetes interrogera ce webhook &lt;em&gt;avant&lt;/em&gt; d'autoriser une requête à l'API server. Votre webhook peut alors examiner le contexte (y compris l'heure) et décider d'autoriser ou non l'accès.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexibilité totale :&lt;/strong&gt; Vous contrôlez entièrement la logique de décision d'autorisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration native :&lt;/strong&gt;  Utilise les mécanismes d'extension de Kubernetes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Complexité de développement :&lt;/strong&gt;  Vous devez développer et maintenir le webhook personnalisé.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance :&lt;/strong&gt;  Un webhook mal optimisé peut impacter la performance de l'API server.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exemple Conceptuel (Webhook) pour la restriction horaire :&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Logique du webhook (simplifiée, conceptuelle)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;authorize_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;current_hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userInfo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;

&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mon-namespace&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;current_hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Refuser l&amp;#39;accès en dehors des heures autorisées pour ce namespace&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allowed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reason&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Accès refusé en dehors des heures de bureau (8h-19h)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# Laisser Kubernetes RBAC standard gérer l&amp;#39;autorisation ensuite&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;allowed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Mise en œuvre (points clés) :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Développement du webhook :&lt;/strong&gt;  Écrire le service webhook (en Go, Python, etc.) qui contient la logique d'autorisation contextuelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiement du webhook :&lt;/strong&gt;  Déployer le service webhook dans votre cluster Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration de l'Admission Controller :&lt;/strong&gt;  Configurer un &lt;code&gt;ValidatingWebhookConfiguration&lt;/code&gt; ou &lt;code&gt;MutatingWebhookConfiguration&lt;/code&gt;  dans Kubernetes pour intercepter les requêtes d'autorisation et les envoyer à votre webhook.  Il faut spécifier quels types de requêtes (par exemple, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;) et quelles ressources (par exemple, &lt;code&gt;pods&lt;/code&gt;, &lt;code&gt;deployments&lt;/code&gt;) doivent être interceptées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sécurité :&lt;/strong&gt;  Sécuriser la communication entre l'API server et le webhook (TLS, authentification).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Utilisation d'un Policy Engine (OPA - Open Policy Agent ou Kyverno)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Principe :&lt;/strong&gt;  Utiliser un moteur de politiques externe comme OPA ou Kyverno. Ces outils sont conçus pour appliquer des politiques complexes et contextuelles. Ils s'intègrent bien avec Kubernetes via des admission controllers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Langage de politique dédié :&lt;/strong&gt;  OPA utilise Rego, Kyverno utilise YAML (plus simple). Ces langages sont conçus pour exprimer des politiques complexes de manière déclarative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion centralisée des politiques :&lt;/strong&gt;  OPA et Kyverno permettent de gérer les politiques de manière centralisée et versionnée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auditabilité :&lt;/strong&gt;  Facilitent l'audit des décisions d'autorisation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communauté et maturité :&lt;/strong&gt;  OPA et Kyverno sont des projets open source actifs et matures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inconvénients :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Courbe d'apprentissage (OPA/Rego) :&lt;/strong&gt;  Rego peut être un peu complexe à apprendre au début. Kyverno est plus simple.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiement et gestion supplémentaires :&lt;/strong&gt;  Il faut déployer et gérer le moteur de politiques (OPA ou Kyverno) dans le cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exemple OPA (Rego) pour la restriction horaire :&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;admission&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;# Politique de restriction horaire pour le namespace &amp;quot;mon-namespace&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mon-namespace&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is_within_business_hours&lt;/span&gt;

&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Accès refusé en dehors des heures de bureau (8h-19h) pour le namespace &amp;#39;mon-namespace&amp;#39;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;is_within_business_hours&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now_in_zone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Europe/Paris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemple Kyverno (YAML) pour la restriction horaire :&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kyverno.io/v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ClusterPolicy&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;deny-outside-business-hours&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;kyverno&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;validationFailureAction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Enforce&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;check-business-hours&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;kinds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;namespaces&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-namespace&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Accès&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;refusé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dehors&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;des&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;heures&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;bureau&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(8h-19h)&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;deny&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;conditions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nt"&gt;any&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;time_now_utc().time_to_cron(@).split(@,&lt;/span&gt;&lt;span class="se"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[1].to_number(@)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;LessThan&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;6&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;time_now_utc().time_to_cron(@).split(@,&lt;/span&gt;&lt;span class="se"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[1].to_number(@)&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;GreaterThan&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;J'ai une préférence depuis tout le temps pour &lt;strong&gt;Kyverno&lt;/strong&gt;, donc je vais illustrer cette implémentation avec cet outil.&lt;/p&gt;
&lt;h3&gt;Installation de Kyverno via Helm&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;helm&lt;span class="w"&gt; &lt;/span&gt;repo&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;kyverno&lt;span class="w"&gt; &lt;/span&gt;https://kyverno.github.io/kyverno/
helm&lt;span class="w"&gt; &lt;/span&gt;repo&lt;span class="w"&gt; &lt;/span&gt;update
helm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;kyverno&lt;span class="w"&gt; &lt;/span&gt;kyverno/kyverno&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;kyverno&lt;span class="w"&gt; &lt;/span&gt;--create-namespace
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Création d'un namespace de test&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;namespace&lt;span class="w"&gt; &lt;/span&gt;mon-namespace
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Création de la ClusterPolicy&lt;/h3&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f-&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="s"&gt;apiVersion: kyverno.io/v1&lt;/span&gt;
&lt;span class="s"&gt;kind: ClusterPolicy&lt;/span&gt;
&lt;span class="s"&gt;metadata:&lt;/span&gt;
&lt;span class="s"&gt;  name: deny-outside-business-hours&lt;/span&gt;
&lt;span class="s"&gt;  namespace: kyverno&lt;/span&gt;
&lt;span class="s"&gt;spec:&lt;/span&gt;
&lt;span class="s"&gt;  background: false&lt;/span&gt;
&lt;span class="s"&gt;  validationFailureAction: Enforce&lt;/span&gt;
&lt;span class="s"&gt;  rules:&lt;/span&gt;
&lt;span class="s"&gt;  - name: check-business-hours&lt;/span&gt;
&lt;span class="s"&gt;    match:&lt;/span&gt;
&lt;span class="s"&gt;      any:&lt;/span&gt;
&lt;span class="s"&gt;      - resources:&lt;/span&gt;
&lt;span class="s"&gt;          kinds: [&amp;quot;*&amp;quot;] # Ciblage des resources de tous les types (pods, deployments, etc.)&lt;/span&gt;
&lt;span class="s"&gt;          namespaces:&lt;/span&gt;
&lt;span class="s"&gt;          - mon-namespace&lt;/span&gt;
&lt;span class="s"&gt;    validate:&lt;/span&gt;
&lt;span class="s"&gt;      message: &amp;quot;Accès refusé en dehors des heures de bureau (8h-19h)&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;      deny:&lt;/span&gt;
&lt;span class="s"&gt;        conditions:&lt;/span&gt;
&lt;span class="s"&gt;          any:&lt;/span&gt;
&lt;span class="s"&gt;          - key: &amp;#39;{{ time_now_utc().time_to_cron(@).split(@,&amp;#39;&amp;#39; &amp;#39;&amp;#39;) | [1].to_number(@) }}&amp;#39;&lt;/span&gt;
&lt;span class="s"&gt;            operator: LessThan&lt;/span&gt;
&lt;span class="s"&gt;            value: 6&lt;/span&gt;
&lt;span class="s"&gt;          - key: &amp;#39;{{ time_now_utc().time_to_cron(@).split(@,&amp;#39;&amp;#39; &amp;#39;&amp;#39;) | [1].to_number(@) }}&amp;#39;&lt;/span&gt;
&lt;span class="s"&gt;            operator: GreaterThan&lt;/span&gt;
&lt;span class="s"&gt;            value: 17&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;{{ time_now_utc().time_to_cron(@).split(@,'' '') | [1].to_number(@)  }}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Cette expression JMESPath dans Kyverno fait plusieurs opérations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;time_now_utc() : récupère l'heure UTC actuelle&lt;/li&gt;
&lt;li&gt;time_to_cron(@) : convertit cette heure en format cron&lt;/li&gt;
&lt;li&gt;split(@,' ') : divise la chaîne cron en tableau en utilisant l'espace comme séparateur&lt;/li&gt;
&lt;li&gt;[1] : sélectionne le deuxième élément (index 1) qui représente l'heure&lt;/li&gt;
&lt;li&gt;to_number(@) : convertit cette heure en nombre&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Par exemple, si l'heure est 14:30 UTC :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Format cron : "30 14 * * *"&lt;/li&gt;
&lt;li&gt;Après split : ["30", "14", "", "", "*"]&lt;/li&gt;
&lt;li&gt;Sélection : "14"&lt;/li&gt;
&lt;li&gt;Résultat final : 14 (nombre)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous essayez de créer par exemple un déploiement en dehors du créneau 8h-19h vous aurez :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;error:&lt;span class="w"&gt; &lt;/span&gt;failed&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;deployment:&lt;span class="w"&gt; &lt;/span&gt;admission&lt;span class="w"&gt; &lt;/span&gt;webhook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;validate.kyverno.svc-fail&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;denied&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;request:

resource&lt;span class="w"&gt; &lt;/span&gt;Deployment/mon-namespace/nginx&lt;span class="w"&gt; &lt;/span&gt;was&lt;span class="w"&gt; &lt;/span&gt;blocked&lt;span class="w"&gt; &lt;/span&gt;due&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;following&lt;span class="w"&gt; &lt;/span&gt;policies

deny-outside-business-hours:
&lt;span class="w"&gt;  &lt;/span&gt;check-business-hours:&lt;span class="w"&gt; &lt;/span&gt;Accès&lt;span class="w"&gt; &lt;/span&gt;refusé&lt;span class="w"&gt; &lt;/span&gt;en&lt;span class="w"&gt; &lt;/span&gt;dehors&lt;span class="w"&gt; &lt;/span&gt;des&lt;span class="w"&gt; &lt;/span&gt;heures&lt;span class="w"&gt; &lt;/span&gt;de&lt;span class="w"&gt; &lt;/span&gt;bureau&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;8h-19h&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Mot de la fin : La Sécurité Kubernetes pour l'Ère Moderne&lt;/h3&gt;
&lt;p&gt;La gestion des identités contextuelles est une technique puissante pour améliorer la sécurité de vos clusters Kubernetes. Elle va au-delà des limitations de RBAC en ajoutant une couche d'autorisation intelligente qui tient compte du contexte de chaque requête.&lt;/p&gt;
&lt;p&gt;Bien qu'elle introduise une complexité, les avantages – sécurité renforcée, conformité améliorée et plus grande flexibilité – en valent la peine.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>kui</title><link href="https://blogppr.alterway.fr/kui.html" rel="alternate"></link><published>2025-02-07T11:00:00+01:00</published><updated>2025-02-07T11:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-02-07:/kui.html</id><summary type="html">&lt;p&gt;Découvrez Kui, le Framework Open Source qui Donne des Superpouvoirs Graphiques à Votre Ligne de Commande&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Kui : Optimisez Votre Expérience Kubernetes avec une Interface Graphique Performante et Open Source&lt;/h1&gt;
&lt;p&gt;Kubernetes s'est imposé comme la plateforme d'orchestration de conteneurs de référence.  Cependant, l'interface en ligne de commande (&lt;code&gt;kubectl&lt;/code&gt;), bien que puissante, peut présenter des défis d'ergonomie, en particulier lors de la navigation et de l'analyse de données complexes. Le rendu ASCII standard peut rendre la lecture et l'interprétation des ressources laborieuses. Kui intervient ici comme une solution élégante, en enrichissant l'interaction avec Kubernetes grâce à une interface utilisateur graphique (GUI) intuitive et performante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pourquoi intégrer Kui à votre workflow Kubernetes ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kui est un &lt;strong&gt;projet open source&lt;/strong&gt; initié au sein des SIGs Kubernetes, conçu pour transformer votre manière d'interagir avec vos clusters.  En s'appuyant sur la robustesse de &lt;code&gt;kubectl&lt;/code&gt;, Kui propose une interface visuelle avancée qui permet de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structurer l'information avec des tableaux interactifs et triables&lt;/strong&gt; : Dépassez les limitations des listes ASCII statiques et gagnez en lisibilité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explorer les détails des ressources de manière contextuelle&lt;/strong&gt; : Accédez rapidement aux informations essentielles via une navigation intuitive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visualiser en temps réel les logs et événements&lt;/strong&gt; :  Diagnostiquez et analysez les comportements de vos ressources de façon dynamique.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Organiser votre espace de travail avec une interface à onglets&lt;/strong&gt; :  Gérez efficacement plusieurs contextes et tâches simultanément.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accélérer l'exécution des commandes &lt;code&gt;kubectl&lt;/code&gt;&lt;/strong&gt; : Bénéficiez d'un gain de performance significatif, avec des commandes traitées 2 à 3 fois plus rapidement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Architecture et Fonctionnement de Kui&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kui est architecturé autour du framework Electron, lui permettant de fonctionner comme une application de bureau native.  Techniquement, lorsqu'une commande &lt;code&gt;kubectl&lt;/code&gt; est saisie dans Kui, elle est transmise à l'exécutable &lt;code&gt;kubectl&lt;/code&gt; sous-jacent.  Les résultats sont ensuite interprétés et restitués visuellement via une API REST, assurant une communication fluide et performante entre l'interface graphique et le moteur CLI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Déploiement et Configuration de Kui&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'installation de Kui a été conçue pour être simple et adaptable à différents environnements :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt; : L'intégration avec Homebrew simplifie l'installation : &lt;code&gt;brew install kui kubectl kui get pods open /Applications/Kui.app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows et Linux&lt;/strong&gt; :  Un package téléchargeable et dézippable est disponible. Après décompression, l'ajout du répertoire au PATH système permet d'exécuter Kui via la commande &lt;code&gt;kubectl kui&lt;/code&gt; ou directement via l'exécutable &lt;code&gt;Kui&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiement Avancé&lt;/strong&gt; :  Pour les environnements spécifiques, la compilation depuis le code source ou l'utilisation d'une image Docker sont également envisageables.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois déployé, Kui offre un environnement interactif combinant une interface graphique intuitive et un REPL (Read-Eval-Print Loop) pour une exploration et une gestion efficace de vos ressources Kubernetes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Avantages Clés de Kui pour les Opérations Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kui apporte des bénéfices substantiels qui optimisent significativement la productivité et l'expérience utilisateur :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ergonomie Optimisée&lt;/strong&gt; :  Prise en main rapide pour les utilisateurs novices et efficacité accrue pour les experts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gain de Productivité Mesurable&lt;/strong&gt; :  Visualisation claire des données et navigation contextuelle pour des workflows plus rapides.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visibilité Améliorée sur les Infrastructures Complexes&lt;/strong&gt; :  Supervision et gestion simplifiées des environnements Kubernetes les plus denses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Débogage Accéléré&lt;/strong&gt; : Identification et résolution des incidents facilitées par une analyse visuelle des logs et événements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personnalisation et Extensibilité&lt;/strong&gt; :  Adaptation de Kui aux besoins spécifiques via la création d'extensions Kubernetes personnalisées, de thèmes, d'icônes et l'amélioration des commandes existantes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cas d'Usage Concrets : Optimisation des Workflows Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kui trouve sa place dans de nombreux scénarios opérationnels :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitoring Continu&lt;/strong&gt; :  Suivi en temps réel de l'état et des performances des clusters Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diagnostic et Résolution d'Incidents&lt;/strong&gt; :  Analyse approfondie des logs et événements pour un débogage rapide et précis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion des Déploiements et Mises à Jour&lt;/strong&gt; :  Simplification des processus de déploiement et de mise à jour applicative.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaboration et Partage d'Informations&lt;/strong&gt; :  Facilitation du travail d'équipe et de la communication autour des ressources Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatisation et Personnalisation des Tâches&lt;/strong&gt; :  Création de commandes et thèmes sur mesure pour répondre à des besoins spécifiques.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Exemple Pratique : Visualisation Avancée des Pods&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'exécution de la commande &lt;code&gt;kubectl get all&lt;/code&gt; avec Kui transforme l'affichage ASCII traditionnel en plusieurs tableaux interactifs et triables. Un simple clic sur un pod permet d'accéder instantanément à ses détails, logs et événements associés.  Cette approche élimine la manipulation fastidieuse de longs identifiants et centralise l'information de manière accessible.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-get.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Détail d'un pod : &lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-get-po.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;On peut lancer un terminal (si on a les droits) dans le pod :&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-exec-po.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;On peut aussi voir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le status du pod&lt;/li&gt;
&lt;li&gt;Voir le noeud sur lequel le pod est exécuté&lt;/li&gt;
&lt;li&gt;les logs (kubectl logs)&lt;/li&gt;
&lt;li&gt;les labels (kubectl --show-labels)&lt;/li&gt;
&lt;li&gt;les containers composants le pod (kubectl describe)&lt;/li&gt;
&lt;li&gt;le yaml (kubectl get -o yaml)&lt;/li&gt;
&lt;li&gt;On peut faire un edit du fichier yaml (kubectl edit)&lt;/li&gt;
&lt;li&gt;Voir les événements concernant le pod (kubectl get events)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour chacune des ressources kubernetes on aura des affichages dediés&lt;/p&gt;
&lt;p&gt;Exemple les nodes :&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-get-nodes.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kui Guidebooks : Automatisation et Guidage des Tâches Complexes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Kui introduit une fonctionnalité novatrice : les Guidebooks.  Imaginez la possibilité de transformer des procédures complexes en assistants interactifs directement intégrés à votre environnement de travail. C'est précisément la vocation des Guidebooks de Kui.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La Simplicité du Markdown au Service de l'Automatisation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Un Guidebook est défini par un simple fichier Markdown.  La structuration des instructions en Markdown, enrichie de directives spécifiques à Kui, permet de générer un assistant intelligent qui guide l'utilisateur pas à pas à travers une tâche définie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mécanismes Clés des Guidebooks&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parcours Guidé et Séquencé&lt;/strong&gt; : Le Guidebook définit un flux d'actions ordonné. Kui présente chaque étape à l'utilisateur de manière claire et progressive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion Interactive des Choix Utilisateur&lt;/strong&gt; : L'assistant attend les décisions de l'utilisateur à chaque étape avant de progresser. Par exemple, une étape "Sélectionnez le cluster cible" attendra la sélection avant de continuer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validation Contextuelle Intelligente&lt;/strong&gt; : Kui peut évaluer dynamiquement la pertinence d'une étape en fonction du contexte utilisateur. Par exemple, la vérification de dépendances sera conditionnée à l'environnement spécifique, évitant ainsi les étapes superflues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimisation des Opérations Coûteuses&lt;/strong&gt; :  Pour les actions longues ou non-idempotentes, les Guidebooks permettent de valider leur nécessité, optimisant ainsi les ressources et le temps.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Potentiel des Guidebooks : Scénarios d'Application&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Onboarding Simplifié pour les Nouveaux Collaborateurs&lt;/strong&gt; :  Création de Guidebooks pour guider les nouveaux membres d'équipe dans la configuration de leur environnement de développement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Déploiements Applicatifs Orchestrés&lt;/strong&gt; :  Transformation des procédures de déploiement complexes en assistants interactifs pour minimiser les erreurs et garantir la cohérence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Résolution Guidée des Problèmes Techniques&lt;/strong&gt; :  Développement de Guidebooks de diagnostic pour autonomiser les utilisateurs dans la résolution d'incidents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatisation des Tâches Répétitives&lt;/strong&gt; :  Rationalisation des tâches répétitives et réduction de la charge cognitive grâce à un guidage pas à pas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Exemples : &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Formations intéractives kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-formation-001.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Les blocs de code sont activables, les résultats sont affichés de manière graphique &lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-formation-002.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-formation-003.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/kui/kui-formation-004.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Kui se positionne comme une solution mature et performante, dépassant le simple rôle d'interface graphique pour Kubernetes.  Il s'agit d'un outil puissant qui optimise significativement l'interaction avec vos clusters, permettant un gain de temps substantiel et une amélioration notable de l'efficacité opérationnelle. Pour tout professionnel travaillant avec Kubernetes, Kui représente une solution à envisager sérieusement pour optimiser son workflow.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>k0rdent</title><link href="https://blogppr.alterway.fr/k0rdent.html" rel="alternate"></link><published>2025-02-07T10:00:00+01:00</published><updated>2025-02-07T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-02-07:/k0rdent.html</id><summary type="html">&lt;p&gt;k0rdent : Un environnement de gestion de conteneurs distribués (DCME) open source&lt;/p&gt;</summary><content type="html">&lt;h1&gt;k0rdent de Mirantis : Plongée au Cœur d'une Plateforme de Gestion de Conteneurs Distribuée (DCME) Open Source pour Kubernetes&lt;/h1&gt;
&lt;p&gt;Dans le paysage actuel de l'IT, la gestion de Kubernetes à grande échelle et dans des environnements distribués (multi-cloud, edge) représente un défi complexe.  Mirantis, acteur majeur de l'écosystème Kubernetes, a répondu à ce besoin avec k0rdent, une plateforme open source de gestion de conteneurs distribuée (DCME - Distributed Container Management Environment).  k0rdent se positionne comme un "super plan de contrôle" orchestrant et simplifiant la gestion d'infrastructures Kubernetes hétérogènes. Cet article explore en profondeur l'architecture, les composants, les fonctionnalités techniques et les avantages de k0rdent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Architecture de k0rdent : Une Vision en Couches pour la Gestion Distribuée&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;L'architecture de k0rdent est conçue selon une approche modulaire et distribuée, permettant une gestion centralisée tout en respectant les principes de scalabilité et de résilience.  Elle s'articule autour de trois composants clés, chacun jouant un rôle spécifique dans l'orchestration de l'environnement Kubernetes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k0rdent Cluster Manager (kcm) : Le Chef d'Orchestre des Clusters Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le kcm est le cœur de k0rdent, responsable de la gestion du cycle de vie complet des clusters Kubernetes. Il s'appuie sur l'API Cluster (CAPI - Cluster API), un projet open source de la CNCF (Cloud Native Computing Foundation), pour automatiser la création, la configuration, la mise à niveau et la suppression des clusters Kubernetes à travers diverses infrastructures.  CAPI permet une approche déclarative de la gestion des clusters, où l'état désiré est défini, et le kcm se charge de le réaliser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Abstraction de l'Infrastructure :&lt;/strong&gt; Le kcm abstrait la complexité des infrastructures sous-jacentes (AWS, Azure, vSphere, OpenStack, bare metal).  Grâce à CAPI et à ses fournisseurs d'infrastructure (Infrastructure Providers), k0rdent peut déployer et gérer des clusters sur différentes plateformes de manière uniforme. L'utilisateur interagit avec une API standardisée, indépendamment du fournisseur cloud ou de l'infrastructure on-premise.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion du Cycle de Vie Déclarative :&lt;/strong&gt;  Le kcm met en œuvre une gestion du cycle de vie déclarative.  Les configurations de clusters sont définies dans des fichiers YAML, qui sont ensuite appliqués par le kcm.  Les mises à jour, les mises à l'échelle et les autres opérations sont également gérées de manière déclarative, garantissant la cohérence et la reproductibilité.  Cette approche s'inscrit dans les principes du GitOps, favorisant l'infrastructure as code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reprise Après Sinistre Intégrée :&lt;/strong&gt;  La robustesse est au cœur de la conception du kcm. Il intègre des mécanismes de sauvegarde et de restauration pour assurer la reprise après sinistre.  Les données critiques du kcm, notamment les configurations et les métadonnées des clusters, peuvent être sauvegardées sur une infrastructure externe (par exemple, un stockage objet S3 compatible). En cas de défaillance, ces données peuvent être restaurées pour rétablir rapidement la plateforme de gestion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensibilité via les Fournisseurs CAPI :&lt;/strong&gt;  L'architecture basée sur CAPI rend k0rdent hautement extensible.  De nouveaux fournisseurs d'infrastructure CAPI peuvent être ajoutés pour supporter de nouvelles plateformes cloud ou on-premise.  Cela permet à k0rdent de s'adapter aux environnements hybrides et multi-cloud complexes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k0rdent State Manager (ksm) : Le Gardien de la Configuration et des Politiques&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le ksm est responsable de la gestion de l'état et de la configuration des clusters Kubernetes gérés par k0rdent.  Il va au-delà de la simple gestion de l'infrastructure et se concentre sur la configuration logicielle et les politiques applicables aux clusters.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion Centralisée des Configurations :&lt;/strong&gt; Le ksm permet de définir et d'appliquer des configurations cohérentes à l'ensemble des clusters gérés.  Cela inclut les configurations Kubernetes (RBAC, NetworkPolicies, etc.), mais aussi la configuration d'outils et de services externes déployés sur les clusters.  Cette centralisation simplifie la gouvernance et assure la conformité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Installation de Services "Beach-Head" :&lt;/strong&gt;  Le concept de "beach-head services" est central au ksm.  Il permet de déployer de manière automatisée des services fondamentaux et partagés sur chaque cluster Kubernetes géré.  Ces services peuvent inclure :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Outils d'Observabilité :&lt;/strong&gt; Agents Prometheus, Grafana, outils de logging (Fluentd, Elasticsearch, Kibana).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outils de Sécurité :&lt;/strong&gt;  Solutions de sécurité réseau, scanners de vulnérabilités.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outils de Gestion des Politiques :&lt;/strong&gt;  OPA (Open Policy Agent), Kyverno pour l'application de politiques de sécurité et de conformité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outils de Mise en Réseau :&lt;/strong&gt;  Service meshes (Istio, Linkerd), Ingress controllers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ces services "beach-head" sont déployés de manière uniforme sur tous les clusters, garantissant un environnement cohérent et sécurisé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion des Politiques et de la Conformité :&lt;/strong&gt; Le ksm peut intégrer des moteurs de politiques comme OPA ou Kyverno pour appliquer des politiques de sécurité, de gouvernance et de conformité à l'échelle de la flotte de clusters.  Ces politiques peuvent être définies de manière centralisée et appliquées automatiquement à tous les clusters, assurant la conformité aux exigences réglementaires et aux standards de sécurité de l'organisation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intégration GitOps :&lt;/strong&gt;  Le ksm s'intègre naturellement avec les flux de travail GitOps.  Les configurations et les politiques sont versionnées dans un dépôt Git, et les modifications sont automatiquement synchronisées avec les clusters gérés par le ksm.  Cela renforce la traçabilité, l'auditabilité et la reproductibilité des configurations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k0rdent Observability and FinOps (kof) : La Visibilité et l'Optimisation des Coûts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le kof fournit une vue unifiée sur l'observabilité et les aspects FinOps (Financial Operations) des clusters Kubernetes gérés.  Il agrège les données de monitoring, de logging et de coût provenant de l'ensemble de la flotte de clusters, offrant une visibilité centralisée et des outils d'optimisation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Observabilité Unifiée :&lt;/strong&gt; Le kof collecte et agrège les métriques, les logs et les traces provenant de tous les clusters gérés.  Il offre des tableaux de bord centralisés pour visualiser l'état de santé, les performances et les événements de l'ensemble de l'environnement Kubernetes.  Cela facilite la détection et la résolution des problèmes, ainsi que l'analyse des performances globales.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring Approfondi :&lt;/strong&gt;  Le kof va au-delà du monitoring de base des clusters et des nœuds.  Il permet de surveiller les applications, les services et les workloads déployés sur les clusters.  Des métriques spécifiques aux applications peuvent être collectées et analysées, offrant une visibilité granulaire sur les performances et le comportement des applications distribuées.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion des Logs Centralisée :&lt;/strong&gt;  Le kof centralise la gestion des logs provenant de tous les clusters.  Il permet de rechercher, d'analyser et de corréler les logs pour diagnostiquer les problèmes et comprendre le comportement du système. L'intégration avec des outils de logging populaires (Elasticsearch, Loki, etc.) est généralement proposée.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fonctionnalités FinOps :&lt;/strong&gt;  Le kof intègre des fonctionnalités FinOps pour aider les organisations à maîtriser les coûts de leur infrastructure Kubernetes.  Cela peut inclure :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visualisation des Coûts :&lt;/strong&gt;  Tableaux de bord affichant les coûts par cluster, par namespace, par application, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Allocation des Coûts :&lt;/strong&gt;  Attribution des coûts aux différentes équipes ou départements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recommandations d'Optimisation :&lt;/strong&gt;  Suggestions pour optimiser l'utilisation des ressources et réduire les coûts (redimensionnement des pods, autoscaling, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Politiques de Gestion des Coûts :&lt;/strong&gt;  Définition de budgets et d'alertes pour contrôler les dépenses.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alerting et Notifications :&lt;/strong&gt;  Le kof configure des alertes basées sur des seuils de performance, des erreurs ou des anomalies détectées dans les logs ou les métriques.  Ces alertes peuvent être envoyées par email, Slack, PagerDuty ou d'autres canaux de notification, permettant une réponse rapide aux problèmes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Fonctionnement et Flux de Travail de k0rdent&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le fonctionnement de k0rdent peut être résumé par le flux de travail suivant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Définition de la Configuration du Cluster :&lt;/strong&gt; L'utilisateur définit la configuration du cluster Kubernetes souhaité (type d'infrastructure, version de Kubernetes, ressources, etc.) à l'aide de fichiers YAML compatibles avec CAPI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Déploiement du Cluster via kcm :&lt;/strong&gt;  Le kcm, en utilisant CAPI et le fournisseur d'infrastructure approprié, provisionne et configure le cluster Kubernetes sur l'infrastructure cible.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration et Politiques via ksm :&lt;/strong&gt;  Le ksm, en se basant sur les configurations définies (souvent versionnées dans Git), configure les services "beach-head", applique les politiques de sécurité et de conformité sur le cluster nouvellement créé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Observabilité et FinOps via kof :&lt;/strong&gt;  Le kof collecte et agrège les données de monitoring, de logging et de coût du cluster.  Les utilisateurs peuvent visualiser ces données via les tableaux de bord du kof pour surveiller l'état du cluster, analyser les performances et optimiser les coûts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion Continue du Cycle de Vie :&lt;/strong&gt;  Le kcm continue de surveiller le cluster et permet de réaliser des opérations de mise à niveau, de mise à l'échelle, de sauvegarde et de restauration de manière déclarative.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Avantages Techniques Clés de k0rdent&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gestion Centralisée et Unifiée :&lt;/strong&gt;  k0rdent offre un point de contrôle unique pour gérer l'ensemble de l'infrastructure Kubernetes distribuée, simplifiant les opérations et réduisant la complexité.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatisation Déclarative et GitOps :&lt;/strong&gt;  L'approche déclarative et l'intégration GitOps facilitent l'infrastructure as code, la reproductibilité, la traçabilité et l'automatisation des opérations Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Abstraction de l'Infrastructure et Portabilité :&lt;/strong&gt;  Grâce à CAPI, k0rdent abstrait la complexité des infrastructures sous-jacentes, permettant de déployer et de gérer des clusters Kubernetes sur divers environnements de manière uniforme et portable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Extensibilité et Adaptabilité :&lt;/strong&gt;  L'architecture modulaire et l'utilisation de standards open source (CAPI, OPA, Prometheus, etc.) rendent k0rdent extensible et adaptable à des environnements variés et à des besoins spécifiques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Observabilité Intégrée et FinOps :&lt;/strong&gt;  Le kof fournit une visibilité centralisée sur l'état de santé, les performances et les coûts de l'infrastructure Kubernetes, permettant une gestion proactive et une optimisation des ressources.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Facilitation des Plateformes de Développement Internes (IDP) :&lt;/strong&gt;  k0rdent simplifie la création de plateformes de développement internes en fournissant une infrastructure Kubernetes gérée et cohérente, ainsi que des outils d'observabilité et de gestion des politiques. Les développeurs peuvent se concentrer sur le développement d'applications sans se soucier de la complexité de la gestion de Kubernetes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cas d'Utilisation Techniques&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Environnements Multi-Cloud et Hybrides :&lt;/strong&gt;  Gestion centralisée de clusters Kubernetes déployés sur différents fournisseurs cloud (AWS, Azure, GCP) et environnements on-premise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge Computing :&lt;/strong&gt;  Déploiement et gestion de clusters Kubernetes distribués en périphérie (edge) pour des applications nécessitant une faible latence et un traitement local des données.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grandes Entreprises avec de Nombreuses Équipes et Clusters :&lt;/strong&gt;  Simplification de la gestion et de la gouvernance d'un grand nombre de clusters Kubernetes, réduisant la charge opérationnelle des équipes DevOps et assurant la cohérence et la conformité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fournisseurs de Services Gérés (MSP) :&lt;/strong&gt;  Offre de services Kubernetes managés à leurs clients en s'appuyant sur k0rdent pour la gestion centralisée et automatisée des clusters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;center&gt;
&lt;image src="/images/k0rdent/k0rdent.png"&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les &lt;code&gt;ServiceTemplate&lt;/code&gt; de k0rdent : Déployer des Services Facilement sur Kubernetes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;k0rdent utilise des &lt;code&gt;ServiceTemplate&lt;/code&gt; pour simplifier le déploiement d'applications et de services sur les clusters Kubernetes gérés.  Ces templates sont basés sur des charts Helm et permettent de définir comment installer un service spécifique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Points Clés :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Définition des &lt;code&gt;ServiceTemplate&lt;/code&gt; :&lt;/strong&gt; Ils indiquent à k0rdent où trouver un chart Helm (souvent dans un dépôt privé) pour installer une application.  L'exemple de Nginx Ingress montre comment définir le chart, la version et le dépôt Helm dans un &lt;code&gt;ServiceTemplate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégration dans &lt;code&gt;ClusterDeployment&lt;/code&gt; :&lt;/strong&gt; Pour déployer un service sur un cluster, on référence le &lt;code&gt;ServiceTemplate&lt;/code&gt; dans la section &lt;code&gt;serviceSpec&lt;/code&gt; d'un objet &lt;code&gt;ClusterDeployment&lt;/code&gt;.  Cela indique à k0rdent d'inclure ce service lors de la création ou de la modification du cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Services de base ("Beach-head services") :&lt;/strong&gt; Les &lt;code&gt;ServiceTemplate&lt;/code&gt; sont idéaux pour déployer des services fondamentaux comme Kyverno ou Ingress Nginx sur tous les clusters gérés de manière cohérente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Personnalisation via &lt;code&gt;values&lt;/code&gt; :&lt;/strong&gt;  On peut personnaliser la configuration des services en passant des valeurs Helm spécifiques dans la section &lt;code&gt;values&lt;/code&gt; du &lt;code&gt;ClusterDeployment&lt;/code&gt;.  Ces valeurs sont fusionnées avec la configuration par défaut du chart Helm. On peut aussi utiliser &lt;code&gt;valuesFrom&lt;/code&gt; pour charger les valeurs depuis un ConfigMap ou Secret.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templating des valeurs :&lt;/strong&gt; k0rdent permet d'utiliser le templating (avec Sveltos) dans les &lt;code&gt;values&lt;/code&gt; pour récupérer dynamiquement des informations du cluster Kubernetes cible (comme l'endpoint du control plane).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suivi de l'état :&lt;/strong&gt; L'état du déploiement des services (installé, erreurs, etc.) est visible dans la section &lt;code&gt;status.services&lt;/code&gt; de l'objet &lt;code&gt;ClusterDeployment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suppression de services :&lt;/strong&gt; Pour supprimer un service déployé via &lt;code&gt;ServiceTemplate&lt;/code&gt;, il suffit de retirer sa définition de la section &lt;code&gt;serviceSpec&lt;/code&gt; du &lt;code&gt;ClusterDeployment&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Un exemple simple&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Scénario :&lt;/strong&gt; Nous voulons déployer une application web simple (Nginx) sur un cluster Kubernetes géré par k0rdent, en utilisant un &lt;code&gt;ServiceTemplate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Définition du &lt;code&gt;ServiceTemplate&lt;/code&gt; pour Nginx :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imaginons que nous ayons un chart Helm simple pour déployer Nginx, disponible dans un dépôt Helm public (ou privé). Nous allons créer un &lt;code&gt;ServiceTemplate&lt;/code&gt; qui pointe vers ce chart.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ServiceTemplate&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;simple-nginx-template-1.0.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom du ServiceTemplate (versionné)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-system&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Namespace où le ServiceTemplate est défini (gestion)&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Nginx&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Web&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Simple&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom affiché dans l&amp;#39;interface utilisateur&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Déploie&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;un&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;serveur&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;web&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Nginx&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;basique.&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Description du template&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;helm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Spécification du chart Helm&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;chartSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;chart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;simple-nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom du chart Helm (dans le dépôt)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;1.0.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Version du chart Helm&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nt"&gt;sourceRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Référence au dépôt Helm&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;HelmRepository&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent-public-charts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom du HelmRepository (défini ailleurs dans k0rdent)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication du &lt;code&gt;ServiceTemplate&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;apiVersion&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; :&lt;/strong&gt;  Définition standard d'un objet Kubernetes &lt;code&gt;ServiceTemplate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;metadata.name&lt;/code&gt; :&lt;/strong&gt;  &lt;code&gt;simple-nginx-template-1.0.0&lt;/code&gt; - Nom unique pour identifier ce template. La version &lt;code&gt;1.0.0&lt;/code&gt; est incluse pour le versionnement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;metadata.namespace&lt;/code&gt; :&lt;/strong&gt;  &lt;code&gt;k0rdent-system&lt;/code&gt; - On place généralement les &lt;code&gt;ServiceTemplate&lt;/code&gt; de gestion dans un namespace système.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spec.displayName&lt;/code&gt;, &lt;code&gt;spec.description&lt;/code&gt; :&lt;/strong&gt;  Informations pour l'affichage dans l'interface utilisateur de k0rdent, pour aider les utilisateurs à comprendre ce que fait ce template.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spec.helm&lt;/code&gt; :&lt;/strong&gt;  Indique que ce &lt;code&gt;ServiceTemplate&lt;/code&gt; utilise un chart Helm pour le déploiement.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;chartSpec.chart&lt;/code&gt; :&lt;/strong&gt;  &lt;code&gt;simple-nginx&lt;/code&gt; - Nom du chart Helm que nous voulons utiliser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;chartSpec.version&lt;/code&gt; :&lt;/strong&gt;  &lt;code&gt;1.0.0&lt;/code&gt; - Version spécifique du chart Helm à utiliser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;chartSpec.sourceRef&lt;/code&gt; :&lt;/strong&gt;  Indique où trouver le dépôt Helm.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;kind: HelmRepository&lt;/code&gt; :&lt;/strong&gt;  Type de référence (dépôt Helm).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;name: k0rdent-public-charts&lt;/code&gt; :&lt;/strong&gt;  Nom d'un objet &lt;code&gt;HelmRepository&lt;/code&gt; qui aurait été préalablement défini dans k0rdent et qui pointe vers l'URL du dépôt Helm public contenant le chart &lt;code&gt;simple-nginx&lt;/code&gt;. (La définition de &lt;code&gt;HelmRepository&lt;/code&gt; n'est pas montrée ici pour simplifier).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. Déploiement de Nginx sur un Cluster via &lt;code&gt;ClusterDeployment&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maintenant, pour déployer ce Nginx sur un cluster géré par k0rdent, nous allons créer ou modifier un &lt;code&gt;ClusterDeployment&lt;/code&gt; et y référencer notre &lt;code&gt;ServiceTemplate&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;k0rdent.mirantis.com/v1alpha1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;ClusterDeployment&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-cluster-web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom de notre ClusterDeployment&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;mon-organisation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Namespace pour notre organisation&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aws-standalone-cp-0-1-0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Template de cluster utilisé (défini ailleurs)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aws-credential&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Credential AWS pour ce cluster (défini ailleurs)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;serviceSpec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Spécification des services à déployer sur ce cluster&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;simple-nginx-template-1.0.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Référence au ServiceTemplate Nginx&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;nginx-web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom de l&amp;#39;instance du service (release Helm)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;applications-web&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Namespace où Nginx sera déployé sur le cluster cible&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Priorité des services (peut être utilisé pour ordonnancer les déploiements)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Explication du &lt;code&gt;ClusterDeployment&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;apiVersion&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, &lt;code&gt;metadata&lt;/code&gt; :&lt;/strong&gt; Définition standard d'un objet &lt;code&gt;ClusterDeployment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;metadata.name&lt;/code&gt; :&lt;/strong&gt; &lt;code&gt;mon-cluster-web&lt;/code&gt; - Nom de notre déploiement de cluster.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;metadata.namespace&lt;/code&gt; :&lt;/strong&gt; &lt;code&gt;mon-organisation&lt;/code&gt; - Namespace pour organiser nos déploiements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spec.template&lt;/code&gt;, &lt;code&gt;spec.credential&lt;/code&gt; :&lt;/strong&gt;  Définissent le template de cluster et les informations d'identification pour l'infrastructure sous-jacente (AWS dans cet exemple). Ces parties ne sont pas directement liées aux &lt;code&gt;ServiceTemplate&lt;/code&gt;, mais sont nécessaires pour un &lt;code&gt;ClusterDeployment&lt;/code&gt; complet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;spec.serviceSpec.services&lt;/code&gt; :&lt;/strong&gt;  La partie cruciale pour les &lt;code&gt;ServiceTemplate&lt;/code&gt;.&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;- template: simple-nginx-template-1.0.0&lt;/code&gt; :&lt;/strong&gt;  Indique que nous voulons utiliser le &lt;code&gt;ServiceTemplate&lt;/code&gt; que nous avons défini pour Nginx.  On le référence par son nom.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;name: nginx-web&lt;/code&gt; :&lt;/strong&gt;  Donne un nom à cette instance de service. Ce nom sera utilisé comme nom de release Helm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;namespace: applications-web&lt;/code&gt; :&lt;/strong&gt;  Spécifie le namespace &lt;code&gt;applications-web&lt;/code&gt; sur le cluster cible où Nginx sera déployé. Si ce namespace n'existe pas, k0rdent peut le créer (selon la configuration).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;priority: 100&lt;/code&gt; :&lt;/strong&gt;  Définit une priorité pour ce service. Si vous avez plusieurs services, vous pouvez utiliser les priorités pour contrôler l'ordre de déploiement.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ce qui se passe lorsque vous appliquez le &lt;code&gt;ClusterDeployment&lt;/code&gt; :&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;k0rdent lit le &lt;code&gt;ClusterDeployment&lt;/code&gt; et détecte la section &lt;code&gt;serviceSpec.services&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pour le service &lt;code&gt;nginx-web&lt;/code&gt;, il recherche le &lt;code&gt;ServiceTemplate&lt;/code&gt; nommé &lt;code&gt;simple-nginx-template-1.0.0&lt;/code&gt; dans le namespace &lt;code&gt;k0rdent-system&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;k0rdent récupère la définition du &lt;code&gt;ServiceTemplate&lt;/code&gt;, notamment les informations sur le chart Helm (&lt;code&gt;simple-nginx&lt;/code&gt; version &lt;code&gt;1.0.0&lt;/code&gt; depuis le dépôt &lt;code&gt;k0rdent-public-charts&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;k0rdent utilise Helm pour déployer le chart &lt;code&gt;simple-nginx&lt;/code&gt; sur le cluster Kubernetes cible, dans le namespace &lt;code&gt;applications-web&lt;/code&gt;, en utilisant le nom de release &lt;code&gt;nginx-web&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Vérification :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois le &lt;code&gt;ClusterDeployment&lt;/code&gt; appliqué et k0rdent a terminé le déploiement, vous pouvez vérifier sur le cluster cible (via &lt;code&gt;kubectl&lt;/code&gt;) que le service Nginx est bien déployé dans le namespace &lt;code&gt;applications-web&lt;/code&gt;. Vous devriez voir des Pods Nginx en cours d'exécution et un Service Nginx créé.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;pods&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;applications-web
kubectl&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;service&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;applications-web
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;k0rdent de Mirantis représente une solution technique robuste et complète pour la gestion de conteneurs distribuée avec Kubernetes. Son architecture modulaire, son approche déclarative, son intégration avec CAPI et son focus sur l'observabilité et le FinOps en font une plateforme puissante pour les organisations qui cherchent à maîtriser la complexité de Kubernetes à grande échelle et dans des environnements distribués.  En tant que projet open source, k0rdent bénéficie de la contribution de la communauté, assurant son évolution et son adaptation aux besoins du marché.  Pour les architectes, les ingénieurs DevOps et les responsables de plateformes Kubernetes, k0rdent est une solution à considérer sérieusement pour simplifier et optimiser la gestion de leurs infrastructures conteneurisées.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Évolution des Applications SaaS</title><link href="https://blogppr.alterway.fr/evolution-des-applications-saas.html" rel="alternate"></link><published>2025-01-09T10:00:00+01:00</published><updated>2025-01-09T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2025-01-09:/evolution-des-applications-saas.html</id><summary type="html">&lt;p&gt;L'IA détrône les applications : Satya Nadella et la révolution des agents intelligents&lt;/p&gt;</summary><content type="html">&lt;h1&gt;L'IA détrône les applications : Satya Nadella et la révolution des agents intelligents&lt;/h1&gt;
&lt;p&gt;Dans une interview récente, Satya Nadella, PDG de Microsoft, a partagé une vision audacieuse de l'avenir de la technologie, où l'intelligence artificielle (IA) et les &lt;strong&gt;agents intelligents&lt;/strong&gt; jouent un rôle central. &lt;/p&gt;
&lt;p&gt;Loin d'être de simples assistants, ces agents sont appelés à remplacer les applications traditionnelles telles que nous les connaissons. &lt;/p&gt;
&lt;p&gt;Cette perspective, qui remet en question le modèle actuel du logiciel en tant que service (SaaS), mérite une analyse approfondie.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/a_RjOhCkhvQ?si=z8lphNuY64fgqawV" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;/center&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/embed/a_RjOhCkhvQ?si=z8lphNuY64fgqawV"&gt;lien vidéo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Les applications, simples façades de bases de données&lt;/h2&gt;
&lt;p&gt;Selon Nadella, les applications d'entreprise (Biz apps) comme Dynamics ne sont fondamentalement que des bases de données avec une logique métier. Cette logique, qui gère les interactions avec les données, est sur le point de migrer vers des &lt;strong&gt;agents d'IA&lt;/strong&gt;. Ces agents deviendront les principaux acteurs de l'interaction avec les données, capables d'orchestrer les actions et les analyses. Ils ne se limiteront pas à une seule base de données, mais pourront interagir avec plusieurs sources d'informations.&lt;/p&gt;
&lt;h2&gt;L'agent d'IA : la nouvelle interface utilisateur&lt;/h2&gt;
&lt;p&gt;L'idée clé de cette vision est que les &lt;strong&gt;agents d'IA&lt;/strong&gt; deviendront la principale interface d'interaction avec les données, remplaçant ainsi l'approche traditionnelle des applications avec des interfaces utilisateurs. Nadella envisage un avenir où les utilisateurs interagissent avec un &lt;strong&gt;Copilot&lt;/strong&gt; qui appelle des agents spécialisés pour chaque tâche. Par exemple, un utilisateur pourrait faire appel à un agent pour Excel, un agent pour Word, et ainsi de suite.&lt;/p&gt;
&lt;h2&gt;Un exemple : Excel, du tableur à outil pour l'IA&lt;/h2&gt;
&lt;p&gt;L'exemple d'Excel est particulièrement révélateur. Nadella souligne qu'Excel, combiné avec Python et un interpréteur de code, devient un outil puissant pour l'analyse de données avec l'aide d'un agent. Il imagine un scénario où Copilot utilise Excel comme un outil pour générer des analyses, des visualisations, et même des plans, en s'appuyant sur les capacités de Python. &lt;strong&gt;Excel n'est plus un tableur isolé, mais une interface utilisée par les agents d'IA pour réaliser des analyses complexes.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Copilot : l'orchestrateur de l'IA&lt;/h2&gt;
&lt;p&gt;L'approche de Microsoft est de construire &lt;strong&gt;Copilot&lt;/strong&gt; comme une &lt;strong&gt;couche d'organisation pour l'IA&lt;/strong&gt;, avec des agents spécialisés pour chaque application. Cela implique une nouvelle façon de penser le travail, où les agents d'IA prennent en charge des tâches qui étaient auparavant effectuées par les utilisateurs directement. Copilot devient l'interface principale qui permet d'interagir avec ces agents.&lt;/p&gt;
&lt;h2&gt;La fin du SaaS traditionnel ?&lt;/h2&gt;
&lt;p&gt;Selon Nadella, l'ère des logiciels en tant que service (SaaS) est en train de changer. Les applications SaaS sont considérées comme des interfaces superficielles au-dessus des bases de données, qui seront progressivement remplacées par des interactions directes avec des &lt;strong&gt;agents d'IA&lt;/strong&gt;.
L'accent sera mis sur l'efficacité des bases de données et la capacité des agents à interagir avec diverses sources de données.&lt;/p&gt;
&lt;h2&gt;Implications pour l'avenir&lt;/h2&gt;
&lt;p&gt;Cette vision a des implications profondes pour l'avenir de la technologie :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Disruption du modèle SaaS :&lt;/strong&gt; Le modèle SaaS traditionnel est remis en question. Les applications ne sont plus vues comme des outils autonomes, mais plutôt comme des canaux d'interaction avec des agents d'IA. Les entreprises devront s'adapter à ce changement ou disparaître&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;L'IA au cœur de la logique métier :&lt;/strong&gt; La logique métier migre de l'application vers l'IA, ce qui signifie que les agents d'IA deviennent les acteurs principaux dans la manipulation et l'analyse des données.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Automatisation et efficacité :&lt;/strong&gt; L'intégration d'agents d'IA vise à automatiser de nombreuses tâches et à rendre les workflows plus efficaces. L'IA permettra aux utilisateurs d'accomplir des tâches complexes sans avoir à manipuler directement des données ou utiliser des interfaces complexes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transformation des rôles :&lt;/strong&gt; Les développeurs devront se concentrer sur la création d'agents d'IA intelligents et capables d'interagir avec des données et des outils divers. Le développement d'applications traditionnelles pourrait diminuer, remplacé par la création d'agents d'IA.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="IA"></category></entry><entry><title>OpenKruise / ArgoProj</title><link href="https://blogppr.alterway.fr/openkruise-argoproj.html" rel="alternate"></link><published>2024-12-19T12:00:00+01:00</published><updated>2024-12-19T12:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2024-12-19:/openkruise-argoproj.html</id><summary type="html">&lt;p&gt;Optimisation des Déploiements Kubernetes : La Synergie entre OpenKruise et Argo&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Optimisation des Déploiements Kubernetes : La Synergie entre OpenKruise et Argo&lt;/h1&gt;
&lt;p&gt;Dans l'écosystème Kubernetes en constante évolution, la gestion efficace des applications est primordiale. OpenKruise et Argo, deux projets open source incubés par la CNCF (Cloud Native Computing Foundation), offrent des solutions puissantes pour relever ces défis. Bien qu'ils aient des objectifs distincts, ils se complètent de manière remarquable, créant une synergie qui améliore considérablement les processus de déploiement, de mise à jour et de gestion des applications Kubernetes. Cet article de blog technique explore cette complémentarité, en fournissant des exemples concrets pour illustrer comment ces outils peuvent être utilisés ensemble pour une gestion d'applications Kubernetes optimisée.&lt;/p&gt;
&lt;h2&gt;OpenKruise : L'automatisation avancée pour Kubernetes&lt;/h2&gt;
&lt;p&gt;OpenKruise est une suite d'outils d'extension pour Kubernetes, axée sur l'&lt;strong&gt;automatisation de la gestion des applications à grande échelle&lt;/strong&gt;. Il se concentre sur les aspects suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Workloads avancés&lt;/strong&gt; : OpenKruise étend les workloads Kubernetes de base (comme Deployment, StatefulSet, DaemonSet) avec des fonctionnalités améliorées telles que les mises à jour in-place, des stratégies de mise à l'échelle et de mise à niveau configurables et des opérations parallèles. Cela permet des déploiements plus rapides et plus efficaces, avec moins d'impact sur les systèmes environnants.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion "bypass"&lt;/strong&gt; : OpenKruise permet de gérer les conteneurs sidecar et les déploiements multi-domaines sans modifier directement les workloads existants. Par exemple, SidecarSet injecte et met à jour les conteneurs sidecar de manière indépendante, et WorkloadSpread contrôle la répartition des pods sur différents types de nœuds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protection de la haute disponibilité&lt;/strong&gt; : OpenKruise offre des mécanismes pour protéger les ressources Kubernetes contre les suppressions en cascade, et PodUnavailableBudget pour prévenir les disruptions d'applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités opérationnelles de haut niveau&lt;/strong&gt; : Il fournit des outils comme ImagePullJob pour pré-télécharger les images et ContainerRecreateRequest pour redémarrer des conteneurs spécifiques dans un Pod en cours d'exécution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Exemple 1 : Mise à jour in-place avec CloneSet et SidecarSet&lt;/h3&gt;
&lt;p&gt;Supposons que vous ayez une application web déployée avec un CloneSet, avec un conteneur principal (nginx) et un conteneur sidecar (logtail) pour la collecte de logs. OpenKruise permet d'effectuer les actions suivantes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Mise à jour de l'image du conteneur nginx&lt;/strong&gt; : Au lieu de recréer les pods, vous pouvez effectuer une mise à jour in-place du conteneur nginx en utilisant les fonctionnalités de CloneSet. Cela réduit le temps de mise à jour et évite les perturbations inutiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mise à jour indépendante du conteneur logtail&lt;/strong&gt; : En utilisant SidecarSet, vous pouvez mettre à jour l'image du conteneur logtail sans affecter le conteneur nginx ni interrompre le service. SidecarSet peut même effectuer des mises à jour à chaud (hot upgrades) pour les conteneurs sidecar qui gèrent le trafic, tels que les proxies ou les mesh containers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gestion des logs&lt;/strong&gt; : SidecarSet facilite la collecte des logs en partageant les volumes et les variables d'environnement entre les conteneurs principal et sidecar.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Exemple 2 : Déploiement multi-domaines avec WorkloadSpread&lt;/h3&gt;
&lt;p&gt;Imaginez que vous déployiez une application dans différents environnements (par exemple, zones de disponibilité ou types de nœuds). OpenKruise permet d'utiliser WorkloadSpread pour :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Définir des sous-ensembles (subsets)&lt;/strong&gt; : Vous pouvez définir des subsets pour les nœuds normaux et élastiques, en spécifiant le nombre maximal de réplicas pour chacun.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Répartition des pods&lt;/strong&gt; : WorkloadSpread distribue les pods sur les différents subsets en fonction des règles définies, assurant ainsi que votre application est déployée sur les différents domaines configurés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contrôle de la suppression des pods&lt;/strong&gt; : En collaboration avec les annotations Kubernetes et OpenKruise, WorkloadSpread gère la priorité de suppression des pods afin d'éviter des perturbations inutiles pendant les opérations de scale-in.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Argo : La puissance du GitOps pour les déploiements Kubernetes&lt;/h2&gt;
&lt;p&gt;Argo est un ensemble d'outils open source axés sur les pratiques GitOps, offrant une &lt;strong&gt;approche déclarative et automatisée de la gestion des applications sur Kubernetes&lt;/strong&gt;. Les principaux outils d'Argo sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Argo CD&lt;/strong&gt; : Un outil de livraison continue (CD) basé sur GitOps pour Kubernetes. Il synchronise automatiquement l'état de l'application définie dans les dépôts Git avec les environnements cibles. Il prend en charge diverses méthodes de configuration, notamment Kustomize, Helm, et les fichiers YAML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argo Workflows&lt;/strong&gt; : Un moteur de workflow natif pour Kubernetes, permettant d'orchestrer des tâches parallèles sous forme de DAG (Directed Acyclic Graph) ou de séquences de tâches. Il est idéal pour les pipelines de CI/CD, le traitement des données et l'automatisation de l'infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argo Rollouts&lt;/strong&gt; : Un contrôleur Kubernetes qui fournit des stratégies de déploiement avancées telles que les déploiements bleu-vert et canari, avec analyse et rollback automatisés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argo Events&lt;/strong&gt; : Un gestionnaire de dépendances basé sur les événements, permettant de définir des actions à déclencher en fonction de diverses sources d'événements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Exemple 3 : Déploiement continu avec Argo CD&lt;/h3&gt;
&lt;p&gt;Argo CD est l'outil central de la suite Argo pour implémenter le GitOps. Il permet de :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Définir l'état souhaité&lt;/strong&gt; : Vous définissez la configuration de votre application (manifestes Kubernetes, Helm charts, etc.) dans un dépôt Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Synchronisation automatique&lt;/strong&gt; : Argo CD surveille en permanence le dépôt Git et synchronise automatiquement les modifications avec votre cluster Kubernetes cible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Détection des dérives&lt;/strong&gt; : Argo CD détecte et visualise les différences entre l'état actuel de l'application et l'état souhaité, offrant des options de synchronisation automatique ou manuelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rollback&lt;/strong&gt; : Vous pouvez facilement revenir à n'importe quelle version précédente de votre configuration en utilisant l'historique du dépôt Git.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Exemple 4 : Pipelines CI/CD avec Argo Workflows&lt;/h3&gt;
&lt;p&gt;Argo Workflows est un puissant outil pour créer des pipelines complexes sur Kubernetes. Il peut être utilisé pour :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Définir des workflows&lt;/strong&gt; : Vous définissez chaque étape d'un workflow comme un conteneur et modélisez les dépendances entre ces étapes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Orchestrer des tâches parallèles&lt;/strong&gt; : Argo Workflows permet d'exécuter des tâches en parallèle, ce qui est idéal pour les pipelines de CI/CD ou de traitement de données.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gérer les artefacts&lt;/strong&gt; : Argo Workflows prend en charge les artefacts, ce qui permet de suivre et de gérer les entrées et les sorties de chaque étape du workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intégrer les notifications&lt;/strong&gt; : Argo Workflows permet de configurer des notifications pour les événements importants, tels que la fin d'un workflow ou l'échec d'une étape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Utilisation d'Argo Events&lt;/strong&gt; : Argo Events peut être utilisé pour déclencher des workflows basés sur des événements spécifiques.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;La complémentarité : OpenKruise et Argo, un duo gagnant&lt;/h2&gt;
&lt;p&gt;Bien qu'ils soient des outils distincts, OpenKruise et Argo peuvent être combinés pour créer une solution de gestion d'applications Kubernetes encore plus robuste. Voici comment :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenKruise améliore les fondations, Argo automatise le cycle de vie&lt;/strong&gt; : OpenKruise fournit les outils pour une gestion plus fine des workloads, tandis qu'Argo automatise le déploiement et la synchronisation de ces workloads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mises à jour intelligentes avec OpenKruise, contrôlées par Argo&lt;/strong&gt; : OpenKruise permet des mises à jour in-place et des mises à jour indépendantes des conteneurs sidecar, tandis qu'Argo CD garantit que ces mises à jour sont appliquées conformément à la configuration définie dans Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflows puissants avec Argo Workflows et déploiements sophistiqués avec OpenKruise&lt;/strong&gt; : Argo Workflows peut être utilisé pour créer des pipelines CI/CD automatisés qui déclenchent des déploiements via Argo CD, en utilisant les fonctionnalités de déploiement avancées d'OpenKruise telles que les mises à jour in-place et la gestion multi-domaines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combinaison des capacités de Rollouts avec OpenKruise et Argo&lt;/strong&gt; : OpenKruise Rollouts et Argo Rollouts peuvent être utilisé en fonction des use-case. Argo Rollouts permet un contrôle plus fin des stratégies de déploiement, tandis que Kruise Rollouts permet des mises à jour multi-batch ou des déploiements canari. Les deux peuvent s'intégrer avec Argo CD.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Exemple 5 : Un workflow CI/CD complet&lt;/h3&gt;
&lt;p&gt;Un pipeline CI/CD typique pourrait fonctionner comme suit :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Développement&lt;/strong&gt; : Les développeurs modifient le code de l'application et le poussent vers un dépôt Git.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI&lt;/strong&gt; : Argo Workflows est déclenché par un commit vers le dépôt Git, effectue des tests unitaires, construit une image de conteneur, et la pousse vers un registre d'images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CD&lt;/strong&gt; :&lt;ul&gt;
&lt;li&gt;Argo CD synchronise l'état de l'application déployée dans Kubernetes avec le dépôt Git, en utilisant les nouvelles images de conteneurs construites.&lt;/li&gt;
&lt;li&gt;OpenKruise, via SidecarSet, injecte et gère les sidecars (par exemple, logtail) en toute transparence. OpenKruise via WorkloadSpread assure la bonne répartition des pods sur les différents environnements.&lt;/li&gt;
&lt;li&gt;Si une mise à jour de l'application est nécessaire, Argo Rollouts peut être utilisé pour un déploiement canari ou bleu/vert, en s'appuyant sur la gestion avancée des workloads d'OpenKruise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring&lt;/strong&gt; : Les métriques de l'application sont monitorées via Prometheus et Grafana.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dans ce scénario, Argo et OpenKruise travaillent en harmonie : Argo assure la cohérence du processus de déploiement tandis qu'OpenKruise fournit une meilleure fondation pour des mises à jour efficaces et une gestion plus fine des applications.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;OpenKruise et Argo, bien qu'étant des projets distincts, offrent une &lt;strong&gt;complémentarité remarquable pour améliorer la gestion des applications Kubernetes&lt;/strong&gt;. OpenKruise fournit des outils avancés pour optimiser les workloads et automatiser les opérations, tandis qu'Argo apporte la puissance du GitOps pour l'automatisation des déploiements. Utilisés ensemble, ils offrent un puissant écosystème pour des déploiements Kubernetes plus efficaces, plus robustes et plus fiables.&lt;/p&gt;
&lt;p&gt;L'intégration de ces deux outils dans votre infrastructure Kubernetes peut vous aider à &lt;strong&gt;réduire la complexité, à améliorer la vitesse de déploiement et à assurer une meilleure disponibilité de vos applications&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En tirant parti des fonctionnalités avancées de gestion des applications d'OpenKruise et de la puissance du GitOps d'Argo, les entreprises peuvent optimiser leurs flux de travail de développement et de déploiement, et tirer le meilleur parti de leur infrastructure Kubernetes. L'avenir de la gestion des applications Kubernetes réside dans cette synergie, où chaque outil joue son rôle spécifique pour un résultat global optimisé.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>kubevpn</title><link href="https://blogppr.alterway.fr/kubevpn.html" rel="alternate"></link><published>2024-12-19T10:00:00+01:00</published><updated>2024-12-19T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2024-12-19:/kubevpn.html</id><summary type="html">&lt;p&gt;KubeVPN : Votre Environnement de Développement Cloud Natif Connecté à Kubernetes&lt;/p&gt;</summary><content type="html">&lt;h1&gt;KubeVPN : Votre Environnement de Développement Cloud Natif Connecté à Kubernetes&lt;/h1&gt;
&lt;p&gt;KubeVPN est un outil puissant qui transforme la façon dont les développeurs interagissent avec les environnements Kubernetes. Il offre un &lt;strong&gt;environnement de développement cloud natif&lt;/strong&gt; qui se connecte de manière transparente au réseau de votre cluster Kubernetes. Avec KubeVPN, vous pouvez accéder aux ressources de votre cluster Kubernetes directement depuis votre machine locale, simplifiant considérablement le développement et le débogage d'applications cloud natives.&lt;/p&gt;
&lt;h2&gt;Les Défis du Développement Cloud Natif&lt;/h2&gt;
&lt;p&gt;Le développement d'applications pour Kubernetes peut être complexe. Traditionnellement, les développeurs sont confrontés aux défis suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Difficulté d'accès aux ressources du cluster&lt;/strong&gt; : Accéder aux services et pods du cluster Kubernetes nécessite souvent des configurations complexes et des redirections de ports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environnement de développement non cohérent&lt;/strong&gt; : Les environnements locaux peuvent différer significativement de ceux du cluster, ce qui peut entraîner des problèmes d'intégration et de déploiement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complexité du débogage&lt;/strong&gt; : Le débogage d'applications exécutées dans le cluster Kubernetes peut être difficile, car il faut souvent se connecter aux pods et analyser les journaux à distance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;KubeVPN répond à ces défis en fournissant une connexion directe et cohérente au réseau Kubernetes, permettant aux développeurs de travailler plus efficacement.&lt;/p&gt;
&lt;h2&gt;Comment KubeVPN Simplifie le Développement Kubernetes&lt;/h2&gt;
&lt;p&gt;KubeVPN offre une approche innovante pour le développement cloud natif, en établissant un tunnel sécurisé entre votre machine locale et votre cluster Kubernetes. Voici les fonctionnalités clés qui rendent KubeVPN si utile :&lt;/p&gt;
&lt;h3&gt;1. Connexion au Réseau Kubernetes&lt;/h3&gt;
&lt;p&gt;KubeVPN vous permet de vous connecter au réseau de votre cluster Kubernetes en utilisant la commande &lt;code&gt;kubevpn connect&lt;/code&gt;. Cette commande crée un tunnel et ajoute une route vers une interface virtuelle, comme &lt;code&gt;tun0&lt;/code&gt;, redirigeant le trafic vers un gestionnaire de trafic distant. Vous pouvez alors accéder aux ressources du cluster à l'aide des noms de service ou des adresses IP des pods/services.
Un mot de passe administrateur est requis pour créer le tunnel.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;connect
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Résultat&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;...&lt;/span&gt;

&lt;span class="nb"&gt;+----------------------------------------------------------+&lt;/span&gt;
&lt;span class="c"&gt;| Now you can access resources in the kubernetes cluster ! |&lt;/span&gt;
&lt;span class="nb"&gt;+----------------------------------------------------------+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Après la connexion, vous pouvez vérifier l'état de la connexion avec la commande &lt;code&gt;kubevpn status&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;status
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Exemple de résultat :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ID    Mode   Cluster     Kubeconfig                     Namespace   Status      Netif
0     full   k8s-train   /Users/hleclerc/.kube/config   default     Connected   utun7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Deployons juste un nginx via helm &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;helm install hello-world oci://ghcr.io/herveleclerc/hello-world --version 0.1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Résultat &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Pulled&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ghcr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;io&lt;/span&gt;&lt;span class="sr"&gt;/herveleclerc/&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;eba2624abeeebb332c06c08e4ccb3015d6a449272bc937f877b7711b128ae68&lt;/span&gt;
&lt;span class="n"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;
&lt;span class="n"&gt;LAST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DEPLOYED&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;
&lt;span class="n"&gt;NAMESPACE&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;
&lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deployed&lt;/span&gt;
&lt;span class="n"&gt;REVISION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;NOTES&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;these&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;POD_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pods&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="kd"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;app.kubernetes.io/name=hello-world,app.kubernetes.io/instance=hello-world&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{.items[0].metadata.name}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;CONTAINER_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="kd"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$POD_NAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{.spec.containers[0].ports[0].containerPort}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Visit http://127.0.0.1:8080 to use your application&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;kubectl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="kd"&gt;namespace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;forward&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$POD_NAME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;$CONTAINER_PORT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Regardons le pod déployé par kubevpn et helm&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl get svc,po -o wide
NAME                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                     AGE     SELECTOR
service/hello-world               ClusterIP   10.0.145.54    &amp;lt;none&amp;gt;        80/TCP                                      3m48s   app.kubernetes.io/instance=hello-world,app.kubernetes.io/name=hello-world
service/kubernetes                ClusterIP   10.0.0.1       &amp;lt;none&amp;gt;        443/TCP                                     241d    &amp;lt;none&amp;gt;
service/kubevpn-traffic-manager   ClusterIP   10.0.123.176   &amp;lt;none&amp;gt;        8422/UDP,10800/TCP,9002/TCP,80/TCP,53/UDP   115s    app=kubevpn-traffic-manager

NAME                                           READY   STATUS    RESTARTS   AGE     IP             NODE                                NOMINATED NODE   READINESS GATES
pod/hello-world-57f994fd7d-j8th6               1/1     Running   0          3m48s   10.224.0.102   aks-agentpool-35883522-vmss00001g   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
pod/kubevpn-traffic-manager-8556f588c8-749bf   3/3     Running   0          114s    10.224.0.116   aks-agentpool-35883522-vmss00001g   &amp;lt;none&amp;gt;           &amp;lt;none&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez tester la connexion en utilisant &lt;code&gt;ping&lt;/code&gt; avec l'adresse IP d'un pod :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ping&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.224.0.116
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez aussi tester la connexion en utilisant &lt;code&gt;curl&lt;/code&gt; avec l'adresse IP d'un service:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;.224.0.102
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;KubeVPN prend en charge la résolution des noms DNS Kubernetes, vous pouvez donc accéder à un service nommé &lt;code&gt;hello-world&lt;/code&gt; dans l'espace de noms &lt;code&gt;default&lt;/code&gt; en utilisant les noms suivants:
*   &lt;code&gt;hello-world&lt;/code&gt;
*   &lt;code&gt;hello-world.default&lt;/code&gt;
*   &lt;code&gt;hello-world.default.svc.cluster.local&lt;/code&gt;
Vous pouvez même utiliser le nom court de domaine comme &lt;code&gt;productpage&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;hello-world&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# Nom court&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;hello-world.default.svc.cluster.local
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important :&lt;/strong&gt; La résolution des noms courts ne fonctionne que dans l'espace de noms où &lt;code&gt;kubevpn-traffic-manager&lt;/code&gt; est déployé.&lt;/p&gt;
&lt;h3&gt;2. Interception du Trafic Inbound&lt;/h3&gt;
&lt;p&gt;KubeVPN permet également d'intercepter le trafic entrant des services Kubernetes et de le rediriger vers votre machine locale. Cette fonctionnalité est particulièrement utile pour le débogage et le développement, car elle vous permet de tester localement vos modifications tout en les intégrant dans l'environnement Kubernetes.&lt;/p&gt;
&lt;p&gt;Vous pouvez utiliser la commande &lt;code&gt;kubevpn proxy&lt;/code&gt; pour intercepter le trafic entrant d'un déploiement spécifique, par exemple &lt;code&gt;productpage&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;proxy&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez même définir une règle pour que seul le trafic avec un header spécifique soit redirigé vers votre machine locale, par exemple, avec le header &lt;code&gt;app=monapp&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;proxy&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world&lt;span class="w"&gt; &lt;/span&gt;--headers&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;monapp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Pour annuler le proxy, vous pouvez utiliser la commande &lt;code&gt;kubevpn leave&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;leave&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Plus d'informations ici : &lt;a href="https://www.kubevpn.cn/docs/functions/reverse_proxy"&gt;reverse proxy&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;3. Modes de Connexion&lt;/h3&gt;
&lt;p&gt;KubeVPN propose différents modes de connexion pour s'adapter à vos besoins :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mode Connect&lt;/strong&gt; : Crée un tunnel simple pour connecter votre machine locale au cluster Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode Reverse&lt;/strong&gt; : Injecte un conteneur sidecar dans le contrôleur, bloque le trafic entrant et le redirige vers votre machine locale via un tunnel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode Mesh&lt;/strong&gt; : Utilise Envoy comme proxy. Si les headers contiennent une clé-valeur spéciale, le trafic est routé vers la machine locale, sinon, il est routé vers le service d'origine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode Lite&lt;/strong&gt; : (&lt;code&gt;--lite=true&lt;/code&gt;) Permet de se connecter à plusieurs clusters Kubernetes simultanément, conçu pour la connexion à plusieurs réseaux de clusters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mode Full&lt;/strong&gt; : Par défaut, (&lt;code&gt;--lite=false&lt;/code&gt;) Permet de se connecter à un réseau de clusters et prend également en charge le proxy du trafic entrant vers votre machine locale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous pouvez vous connecter à plusieurs clusters en utilisant les modes &lt;code&gt;lite&lt;/code&gt; et &lt;code&gt;full&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Se connecter à 2 clusters en mode lite&lt;/span&gt;
kubevpn&lt;span class="w"&gt; &lt;/span&gt;connect
kubevpn&lt;span class="w"&gt; &lt;/span&gt;status
kubevpn&lt;span class="w"&gt; &lt;/span&gt;connect&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;default&lt;span class="w"&gt; &lt;/span&gt;--kubeconfig&lt;span class="w"&gt; &lt;/span&gt;~/.kube/dev_config&lt;span class="w"&gt; &lt;/span&gt;--lite
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;L'état des connexions sera alors mis à jour en conséquence:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ID Mode Cluster Kubeconfig Namespace Status
0 full k8s-train /Users/hleclerc/.kube/config default Connected
1 lite k8s-dev /Users/hleclerc/.kube/dev_config default Connected
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;4. Mode Développement Local avec Docker&lt;/h3&gt;
&lt;p&gt;KubeVPN va encore plus loin en permettant d'exécuter vos pods Kubernetes dans des conteneurs Docker locaux. Cela vous garantit un environnement de développement identique à celui du cluster, avec les mêmes variables d'environnement, volumes et configuration réseau.&lt;/p&gt;
&lt;p&gt;J'utilise limactl &lt;/p&gt;
&lt;p&gt;Voici un exemple de commande pour lancer le mode développement :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world&lt;span class="w"&gt; &lt;/span&gt;--entrypoint&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Cette commande :
*   Connecte votre machine locale au réseau du cluster.
*   Injecte un sidecar pour intercepter le trafic entrant.
*   Lance un conteneur Docker avec l'image de votre pod.&lt;/p&gt;
&lt;p&gt;Vous pouvez utiliser &lt;code&gt;localhost:port&lt;/code&gt; pour accéder à votre conteneur. L'environnement, le volume et le réseau sont les mêmes que dans le pod Kubernetes distant.
Vous pouvez choisir de ne pas utiliser de proxy:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world&lt;span class="w"&gt; &lt;/span&gt;--no-proxy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez aussi utiliser un image docker spécifique et un point d'entrée particulier:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubevpn&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;deployment/hello-world&lt;span class="w"&gt; &lt;/span&gt;--dev-image&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;docker&lt;span class="w"&gt; &lt;/span&gt;registry&lt;span class="o"&gt;]&lt;/span&gt;/&lt;span class="o"&gt;[&lt;/span&gt;namespace&lt;span class="o"&gt;]&lt;/span&gt;/&lt;span class="o"&gt;[&lt;/span&gt;repo&lt;span class="o"&gt;]&lt;/span&gt;:&lt;span class="o"&gt;[&lt;/span&gt;tag&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;--entrypoint&lt;span class="w"&gt; &lt;/span&gt;/bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;KubeVPN prend en charge le Docker in Docker (DinD).&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;--privileged&lt;span class="w"&gt; &lt;/span&gt;--sysctl&lt;span class="w"&gt; &lt;/span&gt;net.ipv6.conf.all.disable_ipv6&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/var/run/docker.sock:/var/run/docker.sock&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;/tmp:/tmp&lt;span class="w"&gt; &lt;/span&gt;-v&lt;span class="w"&gt; &lt;/span&gt;~/.kube/config:/root/.kube/config&lt;span class="w"&gt; &lt;/span&gt;--platform&lt;span class="w"&gt; &lt;/span&gt;linux/amd64&lt;span class="w"&gt; &lt;/span&gt;naison/kubevpn:latest
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;5. Prise en Charge des Protocoles Multiples&lt;/h3&gt;
&lt;p&gt;KubeVPN supporte les couches 3 et supérieures du modèle OSI, comme ICMP, TCP, UDP, gRPC, WebSocket et HTTP.&lt;/p&gt;
&lt;h3&gt;6. Installation Facile&lt;/h3&gt;
&lt;p&gt;KubeVPN peut être installé de différentes manières :
*   Avec &lt;code&gt;brew&lt;/code&gt; (macOS/Linux) : &lt;code&gt;brew install kubevpn&lt;/code&gt;.
*   Avec &lt;code&gt;scoop&lt;/code&gt; (Windows) : &lt;code&gt;scoop bucket add extras &amp;amp;&amp;amp; scoop install kubevpn&lt;/code&gt;.
*   Avec &lt;code&gt;krew&lt;/code&gt; (Windows/macOS/Linux) : &lt;code&gt;kubectl krew index add kubevpn https://github.com/kubenetworks/kubevpn.git &amp;amp;&amp;amp; kubectl krew install kubevpn/kubevpn &amp;amp;&amp;amp; kubectl kubevpn&lt;/code&gt;.
*   Via une release GitHub.
Vous pouvez également installer l'application de démo Bookinfo:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;apply&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Vous pouvez nettoyer après le test en utilisant la commande:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Exemples d'Utilisation Concrets&lt;/h2&gt;
&lt;p&gt;Voici quelques exemples d'utilisation qui illustrent la puissance de KubeVPN :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Développement et débogage local&lt;/strong&gt; : Vous pouvez exécuter votre application dans un conteneur Docker local, mais connecté au réseau Kubernetes grâce à KubeVPN. Cela vous permet de déboguer votre application dans un environnement identique à celui de production.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Test de modifications en temps réel&lt;/strong&gt; : Vous pouvez intercepter le trafic entrant vers un service Kubernetes et le rediriger vers votre machine locale. Cela vous permet de tester rapidement les modifications de votre code sans avoir à redéployer l'application dans le cluster.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accès facile aux API Kubernetes&lt;/strong&gt; : Vous pouvez utiliser les outils en ligne de commande Kubernetes comme &lt;code&gt;kubectl&lt;/code&gt; directement depuis votre machine locale, sans avoir à configurer des tunnels ou des redirections de ports complexes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Collaboration simplifiée&lt;/strong&gt; : Les membres de votre équipe peuvent utiliser KubeVPN pour accéder au même environnement de développement, réduisant ainsi les problèmes de compatibilité et de configuration.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;Vos sources répondent également à certaines questions fréquentes :
*   Si l'image Docker ne peut pas être téléchargée ou si l'environnement interne ne peut pas accéder à &lt;code&gt;docker.io&lt;/code&gt; :&lt;br /&gt;
    *   Transférer l'image dans votre propre registre privé et utiliser l'option &lt;code&gt;--image&lt;/code&gt;.
    *   Utiliser l'option &lt;code&gt;--transfer-image&lt;/code&gt; pour transférer automatiquement l'image vers l'adresse spécifiée par l'option &lt;code&gt;--image&lt;/code&gt;.
*   Si vous obtenez l'erreur 137 lors de l'utilisation de &lt;code&gt;kubevpn dev&lt;/code&gt;, il peut s'agir d'une insuffisance de ressources allouées par Docker Desktop. Augmentez la mémoire dans les paramètres de Docker Desktop.
*   Si vous utilisez Docker dans WSL (Windows Subsystem for Linux) et que la connexion au cluster ne fonctionne pas, vous pouvez installer Docker dans WSL, utiliser &lt;code&gt;kubevpn connect&lt;/code&gt; sur Windows, ou utiliser l'option &lt;code&gt;--network container:$CONTAINER_ID&lt;/code&gt; lors de l'utilisation de &lt;code&gt;kubevpn dev&lt;/code&gt;.
*   Si vous obtenez l'erreur &lt;code&gt;172.17.0.1:443 connect refusued&lt;/code&gt; lors de l'accès à l'api Kubernetes, cela peut être dû à un conflit entre le sous-réseau de Kubernetes et celui de Docker. Utilisez l'option &lt;code&gt;--connect-mode container&lt;/code&gt; avec &lt;code&gt;kubevpn dev&lt;/code&gt; ou modifiez le fichier &lt;code&gt;~/.docker/daemon.json&lt;/code&gt; en ajoutant un sous-réseau qui ne sera pas en conflit, par exemple:  &lt;code&gt;"bip": "172.15.0.1/24"&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;KubeVPN est un outil indispensable pour tout développeur travaillant avec Kubernetes. Il simplifie l'accès aux ressources du cluster, permet de tester facilement les modifications locales et offre un environnement de développement cohérent. Si vous développez des applications cloud natives, vous devriez absolument essayer KubeVPN !&lt;/p&gt;
&lt;p&gt;Ce billet de blog a exploré les principales fonctionnalités de KubeVPN, en s'appuyant sur les informations fournies dans vos sources. J'espère qu'il vous sera utile et vous encouragera à adopter cet outil pour améliorer votre productivité.&lt;/p&gt;</content><category term="Kubernetes"></category></entry><entry><title>Kubernetes 1.32</title><link href="https://blogppr.alterway.fr/kubernetes-132.html" rel="alternate"></link><published>2024-12-13T10:00:00+01:00</published><updated>2024-12-13T10:00:00+01:00</updated><author><name>Hervé Leclerc</name></author><id>tag:blogppr.alterway.fr,2024-12-13:/kubernetes-132.html</id><summary type="html">&lt;p&gt;Kubernetes 1.32 : Stabilité et la performance !&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Kubernetes 1.32 : Stabilité et la performance !&lt;/h1&gt;
&lt;p&gt;Salut les mordus de Kubernetes ! La version 1.32 est arrivée, et elle est pleine de nouveautés intéressantes qui vont améliorer votre expérience Kubernetes. &lt;/p&gt;
&lt;p&gt;Accrochez-vous, on vous embarque pour un tour d'horizon des nouvelles fonctionnalités les plus cool !&lt;/p&gt;
&lt;h2&gt;Performance et Stabilité : Kubelet s'améliore&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le gestionnaire de mémoire de Kubelet est enfin en version stable !&lt;/strong&gt;  C'est une grande nouvelle car cela signifie que vous pouvez l'utiliser en toute confiance en production. &lt;/p&gt;
&lt;p&gt;Ce gestionnaire améliore la façon dont Kubelet gère la mémoire des pods, &lt;strong&gt;prévenant les interruptions de service&lt;/strong&gt; dues à une saturation. &lt;/p&gt;
&lt;p&gt;En plus de cela, on a droit à une &lt;strong&gt;meilleure gestion des connexions UDP&lt;/strong&gt; grâce à un correctif dans kube-proxy.  &lt;/p&gt;
&lt;p&gt;Fini les problèmes DNS après un redémarrage des pods DNS ! De même, le &lt;strong&gt;contrôleur de point de terminaison a été corrigé&lt;/strong&gt; pour gérer plus efficacement les objets Endpoint.&lt;/p&gt;
&lt;p&gt;Et devinez quoi ? &lt;strong&gt;Le gestionnaire d'expulsion (Eviction) a été corrigé pour supprimer les images et les conteneurs inutilisés&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Cela vous permet de &lt;strong&gt;libérer de l'espace précieux&lt;/strong&gt; sur vos nœuds !&lt;/p&gt;
&lt;h2&gt;Fonctionnalités en version stable : La cerise sur le gâteau&lt;/h2&gt;
&lt;p&gt;En plus des améliorations de performance et de stabilité, &lt;strong&gt;plusieurs fonctionnalités ont été promues en version stable&lt;/strong&gt; dans Kubernetes 1.32. Parmi elles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;StatefulSetAutoDeletePVC&lt;/strong&gt; : Plus besoin de supprimer manuellement les PVC associés à un StatefulSet lorsqu'il est supprimé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CustomResourceFieldSelectors&lt;/strong&gt; : Cette fonctionnalité offre plus de flexibilité dans la gestion des CustomResourceDefinitions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RetryGenerateName&lt;/strong&gt; : La génération de noms pour les objets Kubernetes est désormais plus robuste et fiable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;SizeMemoryBackedVolumes&lt;/strong&gt; : La gestion des volumes en mémoire est maintenant plus stable et performante.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PodLifecycleSleepAction&lt;/strong&gt;: Cette fonctionnalité simplifie la gestion des actions de cycle de vie des pods. &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Encore plus de nouveautés&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.32  ne s'arrête pas là ! Voici d'autres nouveautés à découvrir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La fonctionnalité « Scheduler Queueing Hints » est passée en version bêta. Elle promet d'&lt;strong&gt;optimiser la planification des pods&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;La prise en charge de Windows pour le gestionnaire de mémoire des nœuds&lt;/strong&gt; a été ajoutée, améliorant ainsi les performances et la stabilité des nœuds Windows.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vous pouvez maintenant &lt;strong&gt;configurer des domaines de recherche de pod&lt;/strong&gt; avec plus de liberté.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;L'intégration du chien de garde (watchdog) &lt;strong&gt;systemd&lt;/strong&gt; au kubelet permet de &lt;strong&gt;redémarrer automatiquement les kubelets bloqués&lt;/strong&gt;.  &lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Autres Changements importants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Des modifications ont été apportées à l'API pour la gestion du redimensionnement des pods. 
  Un nouveau sous-ressource &lt;strong&gt;/resize&lt;/strong&gt; a été ajouté pour les opérations de redimensionnement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Une nouvelle fonctionnalité permet la suppression non sécurisée des ressources corrompues. 
  Cette fonctionnalité est désactivée par défaut et peut être activée en définissant l'option &lt;strong&gt;--feature-gates=AllowUnsafeMalformedObjectDeletion=true&lt;/strong&gt;.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La structure &lt;strong&gt;NodeToStatusMap&lt;/strong&gt; a été modifiée, passant d'une map à une structure. 
  Des méthodes ont été ajoutées pour accéder aux entrées et absentNodesStatus informe de l'état des nœuds absents dans la map.  &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le support pour la suppression des requêtes et des limites lors du redimensionnement d'un pod a été supprimé.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;"&lt;strong&gt;ComponentSLIs&lt;/strong&gt;" est maintenant en GA et verrouillée.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;En résumé&lt;/h2&gt;
&lt;p&gt;Kubernetes 1.32 apporte &lt;strong&gt;une multitude d'améliorations qui raviront les utilisateurs&lt;/strong&gt; de la plateforme. &lt;/p&gt;
&lt;p&gt;N'hésitez pas à explorer toutes les nouveautés et à les mettre en pratique pour tirer le meilleur parti de votre environnement Kubernetes !&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N'oubliez pas de consulter les notes de version officielles pour une liste complète des changements.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.32.md"&gt;Change Log&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Upgradez vous cluster fréquemment !!!&lt;/strong&gt;&lt;/p&gt;</content><category term="Kubernetes"></category></entry></feed>