Architecture des applications pour Kubernetes

introduction

Concevoir et exécuter des applications avec évolutivité, portabilité et robustesse peut être un défi, en particulier à mesure que la complexité du système augmente. L'architecture d'une application ou d'un système influe considérablement sur la manière dont elle doit être exécutée, sur ce qu'elle attend de son environnement et sur son couplage étroit avec les composants associés. Le suivi de certains modèles au cours de la phase de conception et le respect de certaines pratiques opérationnelles peuvent aider à contrer certains des problèmes les plus courants rencontrés par les applications lors de l'exécution dans des environnements hautement distribués.

Alors que les modèles de conception de logiciels et les méthodologies de développement peuvent produire des applications avec les bonnes caractéristiques de dimensionnement, l’infrastructure et l’environnement influencent le fonctionnement du système déployé. Des technologies telles queDocker etKubernetes aident les équipes à créer des packages de logiciels, puis à les distribuer, les déployer et les évoluer sur des plates-formes d'ordinateurs distribués. Apprendre à exploiter au mieux la puissance de ces outils peut vous aider à gérer les applications avec plus de flexibilité, de contrôle et de réactivité.

Dans ce guide, nous aborderons certains des principes et modèles que vous pouvez souhaiter adopter pour vous aider à faire évoluer et gérer votre charge de travail sur Kubernetes. Bien que Kubernetes puisse exécuter de nombreux types de charges de travail, les choix que vous faites peuvent influer sur la facilité d'utilisation et les possibilités de déploiement. La manière dont vous concevez et construisez vos applications, empaquetez vos services dans des conteneurs, configurez la gestion du cycle de vie et le comportement au sein de Kubernetes peuvent chacun influencer votre expérience.

Conception pour l'évolutivité des applications

Lors de la production d'un logiciel, de nombreuses exigences affectent les modèles et l'architecture que vous choisissez d'utiliser. Avec Kubernetes, l'un des facteurs les plus importants est la possibilité descale horizontally, en ajustant le nombre de copies identiques de votre application pour répartir la charge et augmenter la disponibilité. C'est une alternative àvertical scaling, qui tente de manipuler les mêmes facteurs en déployant sur des machines avec plus ou moins de ressources.

En particulier,microservices est un modèle de conception logicielle qui fonctionne bien pour les déploiements évolutifs sur des clusters. Les développeurs créent de petites applications composables qui communiquent sur le réseau par le biais d’API REST bien définies, au lieu de programmes composés plus volumineux qui communiquent via des mécanismes de programmation internes. La décomposition d'applications monolithiques en composants à usage unique discrets permet de redimensionner chaque fonction indépendamment. Une grande partie de la complexité et de la composition qui existeraient normalement au niveau de l'application est transférée au domaine opérationnel où elle peut être gérée par des plates-formes telles que Kubernetes.

Au-delà des modèles logiciels spécifiques, les applicationscloud native sont conçues avec quelques considérations supplémentaires à l'esprit. Les applications natives en nuage sont des programmes qui suivent un modèle d'architecture microservices avec une résilience, une observabilité et des fonctionnalités administratives intégrées pour s'adapter à l'environnement fourni par les plates-formes en cluster dans le nuage.

Par exemple, les applications natives en nuage sont construites avec des métriques de rapport d'intégrité pour permettre à la plate-forme de gérer les événements du cycle de vie si une instance devient malsaine. Ils produisent (et mettent à disposition pour l'exportation) des données de télémesure robustes pour alerter les opérateurs des problèmes et leur permettre de prendre des décisions éclairées. Les applications sont conçues pour gérer les redémarrages et les échecs réguliers, les modifications de la disponibilité du back-end et la charge élevée sans altérer les données ni ne plus répondre.

Suivant la philosophie d'application des 12 facteurs

Une méthodologie populaire qui peut vous aider à vous concentrer sur les caractéristiques les plus importantes lors de la création d'applications Web prêtes pour le cloud est la philosophie deTwelve-Factor App. Rédigés pour aider les développeurs et les équipes opérationnelles à comprendre les qualités essentielles partagées par les services Web conçus pour s'exécuter dans le cloud, les principes s'appliquent très bien aux logiciels qui évolueront dans un environnement en cluster tel que Kubernetes. Bien que les applications monolithiques puissent tirer parti de ces recommandations, les architectures de microservices conçues autour de ces principes fonctionnent particulièrement bien.

Voici un bref résumé des douze facteurs.

  1. Codebase: Gérez tout le code dans les systèmes de contrôle de version (comme Git ou Mercurial). La base de code dicte globalement ce qui est déployé.

  2. Les dépendances deDependencies: doivent être gérées entièrement et explicitement par la base de code, soit vendue (stockée avec le code), soit la version épinglée dans un format à partir duquel un gestionnaire de packages peut installer.

  3. Config: Séparez les paramètres de configuration de l'application et définissez-les dans l'environnement de déploiement au lieu de les intégrer à l'application elle-même.

  4. Backing services: Les services locaux et distants sont tous deux abstraits en tant que ressources accessibles au réseau avec les détails de connexion définis dans la configuration.

  5. Build, release, run: L'étape de construction de votre application doit être complètement distincte de la version de votre application et des processus d'exploitation. L'étape de génération crée un artefact de déploiement à partir du code source, l'étape de version combine l'artefact et la configuration, et l'étape d'exécution exécute la version.

  6. Processes: Les applications sont implémentées en tant que processus qui ne doivent pas dépendre du stockage local de l'état. Etat doit être déchargé sur un service de support comme décrit dans le quatrième facteur.

  7. Port binding: Les applications doivent se lier nativement à un port et écouter les connexions. Le routage et le transfert des demandes doivent être gérés en externe.

  8. Concurrency: Les applications doivent s'appuyer sur une mise à l'échelle via le modèle de processus. L'exécution simultanée de plusieurs copies d'une application, potentiellement sur plusieurs serveurs, permet une mise à l'échelle sans ajuster le code de l'application.

  9. Disposability: Les processus doivent pouvoir démarrer rapidement et s’arrêter en douceur sans effets secondaires graves.

  10. Dev/prod parity: Vos environnements de test, de préparation et de production doivent correspondre étroitement et être synchronisés. Les différences entre les environnements sont des opportunités d’apparition d’incompatibilités et de configurations non testées.

  11. Logs: Les applications doivent diffuser les journaux en sortie standard afin que les services externes puissent décider de la meilleure façon de les gérer.

  12. Admin processes: Les processus d'administration ponctuels doivent être exécutés sur des versions spécifiques et expédiés avec le code de processus principal.

En vous conformant aux instructions fournies par Twelve Factors, vous pouvez créer et exécuter des applications à l'aide d'un modèle adapté à l'environnement d'exécution Kubernetes. Les douze facteurs incitent les développeurs à se concentrer sur la responsabilité première de leur application, à prendre en compte les conditions de fonctionnement et les interfaces entre les composants, et à utiliser les entrées, les sorties et les fonctions standard de gestion des processus pour une exécution prévisible dans Kubernetes.

Conteneurisation des composants d'application

Kubernetes utilise des conteneurs pour exécuter des applications packagées isolées sur ses nœuds de cluster. Pour fonctionner sur Kubernetes, vos applications doivent être encapsulées dans une ou plusieurs images de conteneur et exécutées à l'aide d'un environnement d'exécution de conteneur tel que Docker. Bien que la conteneurisation de vos composants soit une exigence de Kubernetes, elle permet également de renforcer de nombreux principes de la méthodologie à douze facteurs décrite ci-dessus, facilitant ainsi la mise à l'échelle et la gestion.

Par exemple, les conteneurs fournissent une isolation entre l'environnement de l'application et le système hôte externe, prennent en charge une approche réseau de la communication inter-application orientée service Les conteneurs eux-mêmes encouragent la concurrence basée sur les processus et aident à maintenir la parité dev / prod en étant indépendamment évolutifs et en regroupant l'environnement d'exécution du processus. Ces caractéristiques permettent de conditionner vos applications de manière à ce qu'elles fonctionnent correctement sur Kubernetes.

Lignes directrices sur l'optimisation des conteneurs

La flexibilité de la technologie de conteneur permet de nombreuses manières différentes d'encapsuler une application. Cependant, certaines méthodes fonctionnent mieux dans un environnement Kubernetes que d'autres.

La plupart des meilleures pratiques relatives à la conteneurisation de vos applications concernent la création d'images, dans lesquelles vous définissez comment votre logiciel sera configuré et exécuté à partir d'un conteneur. En général, conserver des tailles d’image réduites et composables offre de nombreux avantages. Les images à taille optimisée peuvent réduire le temps et les ressources nécessaires au démarrage d'un nouveau conteneur sur un cluster en gardant l'empreinte au sol gérable et en réutilisant les couches existantes entre les mises à jour des images.

Une bonne première étape lors de la création d'images de conteneur consiste à faire de votre mieux pour séparer vos étapes de construction de l'image finale qui sera exécutée en production. Générer des logiciels nécessite généralement un outillage supplémentaire, prend du temps supplémentaire et génère des artefacts incohérents d'un conteneur à l'autre ou inutiles pour l'environnement d'exécution final, en fonction de l'environnement. Une façon de séparer proprement le processus de construction de l'environnement d'exécution consiste à utiliserDocker multi-stage builds. Les configurations de construction à plusieurs étapes vous permettent de spécifier une image de base à utiliser pendant votre processus de construction et d'en définir une autre à utiliser au moment de l'exécution. Cela permet de créer un logiciel en utilisant une image avec tous les outils de construction installés et de copier les artefacts résultants dans une image mince et rationalisée qui sera utilisée à chaque fois par la suite.

Avec ce type de fonctionnalité disponible, il est généralement judicieux de créer des images de production sur une image parent minimale. Si vous souhaitez éviter complètement le gonflement trouvé dans les couches parentes de style «distro» commeubuntu:16.04 (qui inclut un environnement Ubuntu 16.04 plutôt complet), vous pouvez créer vos images avecscratch - la base la plus minimale de Docker image - en tant que parent. Cependant, la couche de base descratchne donne pas accès à de nombreux outils de base et va souvent rompre les hypothèses sur l'environnement que contient certains logiciels. Comme alternative, l'image deAlpine Linuxalpine a gagné en popularité en étant un environnement de base solide et minimal qui fournit une distribution Linux minuscule mais complète.

Pour les langages interprétés comme Python ou Ruby, le paradigme change légèrement puisqu'il n'y a pas d'étape de compilation et que l'interpréteur doit être disponible pour exécuter le code en production. Cependant, comme les images minces sont toujours idéales, de nombreuses images optimisées spécifiques à la langue, construites sur Alpine Linux, sont disponibles surDocker Hub. Les avantages d'utiliser une image plus petite pour les langages interprétés sont similaires à ceux des langages compilés: Kubernetes sera capable d'extraire rapidement toutes les images de conteneur nécessaires sur de nouveaux nœuds pour commencer à faire un travail significatif.

Décider de la portée des conteneurs et des dosettes

Alors que vos applications doivent être conteneurisées pour s'exécuter sur un cluster Kubernetes,pods est la plus petite unité d'abstraction que Kubernetes puisse gérer directement. Un pod est un objet Kubernetes composé d'un ou de plusieurs conteneurs étroitement couplés. Les conteneurs d'un pod partagent un cycle de vie et sont gérés ensemble comme une seule et même unité. Par exemple, les conteneurs sont toujours planifiés sur le même nœud, démarrés ou arrêtés à l'unisson et partagent des ressources telles que les systèmes de fichiers et l'espace IP.

Au début, il peut être difficile de trouver le meilleur moyen de diviser vos applications en conteneurs et en modules. Il est donc important de comprendre comment Kubernetes gère ces composants et ce que chaque couche d’abstraction fournit à vos systèmes. Quelques considérations peuvent vous aider à identifier des points naturels d’encapsulation pour votre application avec chacune de ces abstractions.

Une façon de déterminer une portée efficace pour vos conteneurs consiste à rechercher des limites de développement naturelles. Si vos systèmes utilisent une architecture de microservices, des conteneurs bien conçus sont souvent conçus pour représenter des unités discrètes de fonctionnalités pouvant souvent être utilisées dans divers contextes. Ce niveau d'abstraction permet à votre équipe de publier les modifications apportées aux images de conteneur, puis de déployer cette nouvelle fonctionnalité dans tout environnement où ces images sont utilisées. Les applications peuvent être construites en composant des conteneurs individuels qui remplissent chacun une fonction donnée mais ne peuvent pas accomplir tout un processus seul.

Contrairement à ce qui précède, les pods sont généralement construits en réfléchissant aux parties de votre système qui pourraient le plus bénéficier desmanagement indépendants. Etant donné que Kubernetes utilise les pods comme la plus petite abstraction pour l’utilisateur, ce sont les unités les plus primitives que les outils et l’API de Kubernetes peuvent interagir et contrôler directement. Vous pouvez démarrer, arrêter et redémarrer des pods, ou utiliser des objets de niveau supérieur construits sur des pods pour introduire des fonctionnalités de réplication et de gestion du cycle de vie. Kubernetes ne vous permet pas de gérer les conteneurs d’un pod indépendamment, vous ne devez donc pas regrouper les conteneurs qui pourraient bénéficier d’une administration distincte.

Étant donné que de nombreuses caractéristiques et abstractions de Kubernetes traitent directement avec les pods, il est logique de regrouper des éléments devant être redimensionnés dans un seul pod et de séparer ceux qui doivent évoluer indépendamment. Par exemple, en séparant vos serveurs Web de vos serveurs d'applications dans des pods différents, vous pouvez redimensionner chaque couche indépendamment si nécessaire. Toutefois, il peut être judicieux de regrouper un serveur Web et un adaptateur de base de données dans le même module si celui-ci fournit les fonctionnalités essentielles dont le serveur Web a besoin pour fonctionner correctement.

Amélioration de la fonctionnalité du pod en regroupant des conteneurs de support

Dans cet esprit, quels types de conteneurs devraient être regroupés dans un seul conteneur? En règle générale, un conteneur principal est responsable de l'exécution des fonctions principales du conteneur, mais vous pouvez définir des conteneurs supplémentaires modifiant ou étendant le conteneur principal ou facilitant sa connexion à un environnement de déploiement unique.

Par exemple, dans un conteneur de serveur Web, un conteneur Nginx peut écouter les demandes et servir le contenu pendant qu'un conteneur associé met à jour les fichiers statiques lorsqu'un référentiel est modifié. Il peut être tentant de conditionner ces deux composants dans un même conteneur, mais leur mise en oeuvre en tant que conteneurs séparés présente des avantages considérables. Le conteneur de serveur Web et l'extracteur de référentiel peuvent être utilisés indépendamment dans différents contextes. Ils peuvent être gérés par différentes équipes et chacun peut être développé pour généraliser leur comportement afin de travailler avec différents conteneurs compagnons.

Brendan Burns et David Oppenheimer ont identifié trois modèles principaux pour regrouper les conteneurs de support dans leur papier surdesign patterns for container-based distributed systems. Celles-ci représentent certains des cas d'utilisation les plus courants pour l'emballage de conteneurs dans un conteneur:

  • Sidecar: Dans ce modèle, le conteneur secondaire étend et améliore les fonctionnalités principales du conteneur principal. Ce modèle implique l'exécution de fonctions non standard ou utilitaires dans un conteneur séparé. Par exemple, un conteneur qui transfère les journaux ou surveille les valeurs de configuration mises à jour peut améliorer les fonctionnalités d'un pod sans modifier de manière significative son objectif principal.

  • Ambassador: Le modèle ambassador utilise un conteneur supplémentaire pour extraire les ressources distantes du conteneur principal. Le conteneur principal se connecte directement au conteneur ambassador qui, à son tour, se connecte à des pools de ressources externes potentiellement complexes, comme des grappes Redis distribuées, et les extrait. Le conteneur principal n'a pas besoin de connaître l'environnement de déploiement réel ni de s'en préoccuper pour se connecter à des services externes.

  • Adaptor: Le modèle d'adaptateur est utilisé pour traduire les données, les protocoles ou les interfaces du conteneur principal pour les aligner sur les normes attendues par des tiers. Les conteneurs d'adaptateurs permettent un accès uniforme aux services centralisés même lorsque les applications qu'ils desservent ne prennent en charge que des interfaces incompatibles.

Extraction de la configuration dans ConfigMaps et Secrets

Alors que la configuration d'applicationcan est intégrée dans des images de conteneur, il est préférable de rendre vos composants configurables au moment de l'exécution pour prendre en charge le déploiement dans plusieurs contextes et permettre une administration plus flexible. Pour gérer les paramètres de configuration d'exécution, Kubernetes propose deux objets appelésConfigMaps etSecrets.

Les ConfigMaps sont un mécanisme utilisé pour stocker des données pouvant être exposées à des pods et à d'autres objets au moment de l'exécution. Les données stockées dans ConfigMaps peuvent être présentées sous forme de variables d'environnement ou montées sous forme de fichiers dans le pod. En concevant vos applications pour qu'elles lisent depuis ces emplacements, vous pouvez injecter la configuration au moment de l'exécution à l'aide de ConfigMaps et modifier le comportement de vos composants sans avoir à reconstruire l'image du conteneur.

Les secrets sont un type d'objet Kubernetes similaire, utilisé pour stocker en toute sécurité des données sensibles et permettre aux pods et autres composants d'accéder au besoin. Les secrets sont un moyen pratique de transmettre des documents sensibles aux applications sans les stocker sous forme de texte brut dans des emplacements facilement accessibles de votre configuration normale. Sur le plan fonctionnel, ils fonctionnent de la même manière que ConfigMaps. Ainsi, les applications peuvent utiliser les mêmes données pour configMaps et Secrets.

ConfigMaps et Secrets vous aident à éviter de placer la configuration directement dans les définitions d'objet Kubernetes. Vous pouvez mapper la clé de configuration à la place de la valeur, ce qui vous permet de mettre à jour la configuration à la volée en modifiant ConfigMap ou Secret. Cela vous donne la possibilité de modifier le comportement d'exécution actif des pods et autres objets Kubernetes sans modifier les définitions Kubernetes des ressources.

Mise en œuvre de sondes de préparation et de vivacité

Kubernetes inclut de nombreuses fonctionnalités prédéfinies pour gérer les cycles de vie des composants et garantir la disponibilité et la santé de vos applications. Cependant, pour tirer parti de ces fonctionnalités, Kubernetes doit comprendre comment surveiller et interpréter la santé de votre application. Pour ce faire, Kubernetes vous permet de définir les sondesliveness etreadiness.

Les sondes Liveness permettent à Kubernetes de déterminer si une application d'un conteneur est active et en cours d'exécution. Kubernetes peut périodiquement exécuter des commandes dans le conteneur pour vérifier le comportement de base d'une application ou envoyer des requêtes réseau HTTP ou TCP à un emplacement désigné pour déterminer si le processus est disponible et capable de répondre comme prévu. En cas d'échec d'une sonde d'activité, Kubernetes redémarre le conteneur pour tenter de rétablir la fonctionnalité dans le pod.

Les sondes de disponibilité sont un outil similaire utilisé pour déterminer si un module est prêt à gérer le trafic. Les applications d’un conteneur peuvent devoir exécuter des procédures d’initialisation avant d’être en mesure d’accepter les demandes des clients ou peuvent avoir besoin de recharger lorsqu’elles sont informées de la nouvelle configuration. Lorsqu'une analyse de disponibilité échoue, au lieu de redémarrer le conteneur, Kubernetes arrête d'envoyer des requêtes au pod temporairement. Cela permet à la nacelle de terminer ses routines d'initialisation ou de maintenance sans nuire à la santé du groupe dans son ensemble.

En combinant des sondes d'activité et de préparation, vous pouvez demander à Kubernetes de redémarrer automatiquement les pods ou de les supprimer des groupes de back-end. La configuration de votre infrastructure pour tirer parti de ces fonctionnalités permet à Kubernetes de gérer la disponibilité et la santé de vos applications sans opération supplémentaire.

Utilisation de déploiements pour gérer l’échelle et la disponibilité

Un peu plus tôt, lorsque nous avons abordé certains principes de base de la conception de pod, nous avons également mentionné que d’autres objets Kubernetes s’appuient sur ces primitives pour offrir des fonctionnalités plus avancées. Undeployment, l'un de ces objets composés, est probablement l'objet Kubernetes le plus couramment défini et manipulé.

Les déploiements sont des objets composés qui s'appuient sur d'autres primitifs Kubernetes pour ajouter des fonctionnalités supplémentaires. Ils ajoutent des fonctionnalités de gestion du cycle de vie aux objets intermédiaires appelésreplicasets, comme la possibilité d'effectuer des mises à jour progressives, de revenir aux versions antérieures et de passer d'un état à l'autre. Ces jeux de réplicas vous permettent de définir des modèles de pod pour la création et la gestion de plusieurs copies d'une même conception de pod. Cela vous aide à faire évoluer facilement votre infrastructure, à gérer les exigences de disponibilité et à redémarrer automatiquement les pods en cas de défaillance.

Ces fonctionnalités supplémentaires fournissent un cadre administratif et des capacités d'auto-guérison à l'abstraction relativement simple des pods. Les pods sont les unités qui exécutent les charges de travail que vous définissez, mais ce ne sont pas les unités que vous devriez normalement configurer et gérer. Pensez plutôt aux pods comme à un bloc de construction capable d'exécuter des applications de manière robuste lorsqu'ils sont configurés via des objets de niveau supérieur, tels que des déploiements.

Création de services et de règles d'entrée pour gérer l'accès aux couches d'application

Les déploiements vous permettent de provisionner et de gérer des ensembles de modules interchangeables afin de faire évoluer vos applications et de répondre aux demandes des utilisateurs. Cependant, le routage du trafic vers les pods provisionnés est une préoccupation distincte. Au fur et à mesure que les pods sont échangés dans le cadre de mises à jour progressives, redémarrés ou déplacés en raison d'échecs de l'hôte, les adresses réseau précédemment associées au groupe en cours changent. Kubernetesservices vous permet de gérer cette complexité en conservant les informations de routage pour les pools dynamiques de pods et en contrôlant l'accès aux différentes couches de votre infrastructure.

Dans Kubernetes, les services sont des mécanismes spécifiques qui contrôlent la façon dont le trafic est routé vers des ensembles de pods. Qu'il s'agisse de transférer le trafic de clients externes ou de gérer les connexions entre plusieurs composants internes, les services vous permettent de contrôler la manière dont le trafic doit être traité. Kubernetes mettra alors à jour et maintiendra toutes les informations nécessaires pour transférer les connexions vers les pods concernés, même si l'environnement change et que le paysage réseau change.

Accéder aux services à l'interne

Pour utiliser efficacement les services, vous devez d’abord déterminer les consommateurs auxquels chaque groupe de pods est destiné. Si votre service ne sera utilisé que par d'autres applications déployées dans votre cluster Kubernetes, le type de serviceclusterIP vous permet de vous connecter à un ensemble de pods à l'aide d'une adresse IP stable qui ne peut être acheminée qu'à partir du cluster. Tout objet déployé sur le cluster peut communiquer avec le groupe de pods répliqués en envoyant du trafic directement à l'adresse IP du service. Il s'agit du type de service le plus simple, qui fonctionne bien pour les couches d'application internes.

Un addon DNS facultatif permet à Kubernetes de fournir des noms DNS pour des services. Cela permet aux pods et autres objets de communiquer avec les services par nom plutôt que par adresse IP. Ce mécanisme ne modifie pas l'utilisation du service de manière significative, mais les identificateurs basés sur le nom peuvent simplifier le raccordement de composants ou la définition d'interactions sans connaître l'adresse IP du service à l'avance.

Exposer des services pour la consommation publique

Si l'interface doit être accessible au public, votre meilleure option est généralement le type de serviceload balancer. Cela utilise l’API de votre fournisseur de cloud spécifique pour mettre en service un équilibreur de charge, qui sert le trafic aux pods de service via une adresse IP exposée publiquement. Cela vous permet d'acheminer des requêtes externes vers les pods de votre service, offrant ainsi un canal de réseau contrôlé à votre réseau de cluster interne.

Etant donné que le type de service d'équilibrage de charge crée un équilibreur de charge pour chaque service, il peut être potentiellement coûteux d'exposer publiquement les services Kubernetes à l'aide de cette méthode. Pour atténuer ce problème, les objets Kubernetesingress peuvent être utilisés pour décrire comment acheminer différents types de requêtes vers différents services en fonction d'un ensemble prédéterminé de règles. Par exemple, les demandes de «exemple.com» peuvent aller au service A, tandis que les demandes de «sammytheshark.com» peuvent être acheminées au service B. Les objets Ingress fournissent un moyen de décrire comment acheminer de manière logique un flux mixte de requêtes vers leurs services cibles en fonction de modèles prédéfinis.

Les règles d'entrée doivent être interprétées par uningress controller - généralement une sorte d'équilibre de charge, comme Nginx - déployé dans le cluster en tant que pod, qui implémente les règles d'entrée et transmet le trafic aux services Kubernetes en conséquence. Actuellement, le type d'objet d'entrée est en version bêta, mais plusieurs implémentations peuvent être utilisées pour minimiser le nombre d'équilibreurs de charge externes que les propriétaires de cluster doivent exécuter.

Utilisation de la syntaxe déclarative pour gérer l'état Kubernetes

Kubernetes offre une grande flexibilité dans la définition et le contrôle des ressources déployées sur votre cluster. En utilisant des outils commekubectl, vous pouvez impérativement définir des objets ad-hoc à déployer immédiatement sur votre cluster. Bien que cela puisse être utile pour déployer rapidement des ressources lors de l’apprentissage de Kubernetes, cette approche présente des inconvénients qui la rendent indésirable pour une administration de production à long terme.

L’un des problèmes majeurs de la gestion impérative est qu’elle ne conserve aucun enregistrement des modifications que vous avez déployées dans votre cluster. Cela rend difficile voire impossible la récupération en cas de défaillance ou le suivi des modifications opérationnelles appliquées à vos systèmes.

Heureusement, Kubernetes fournit une syntaxe déclarative alternative qui vous permet de définir complètement les ressources dans des fichiers texte, puis d'utiliserkubectl pour appliquer la configuration ou la modification. Le stockage de ces fichiers de configuration dans un référentiel de contrôle de version constitue un moyen simple de surveiller les modifications et de l'intégrer aux processus de révision utilisés pour d'autres parties de votre organisation. La gestion basée sur les fichiers facilite également l’adaptation de modèles existants à de nouvelles ressources en copiant et en modifiant les définitions existantes. Le stockage de vos définitions d'objet Kubernetes dans des répertoires versionnés vous permet de conserver un instantané de l'état de votre cluster souhaité à chaque instant. Cela peut s'avérer très utile lors des opérations de récupération, des migrations ou lors de la recherche de la cause première des modifications non intentionnelles introduites dans votre système.

Conclusion

Gérer l'infrastructure qui exécutera vos applications et apprendre à tirer le meilleur parti des fonctionnalités offertes par les environnements d'orchestrations modernes peut être décourageant. Cependant, de nombreux avantages offerts par des systèmes tels que Kubernetes et des technologies telles que les conteneurs deviennent plus clairs lorsque vos pratiques de développement et d'exploitation s'alignent sur les concepts sur lesquels l'outillage est construit. L'architecture de vos systèmes à l'aide des modèles Kubernetes excelle et sa compréhension de la capacité de certaines fonctionnalités à atténuer certains des défis associés aux déploiements extrêmement complexes peut améliorer votre expérience de fonctionnement sur la plate-forme.