5 principes de bon sens pour créer des applications cloud-native

Les applications « cloud natives » ou simplement « cloud » sont spĂ©cifiquement conçues pour fonctionner dans des infrastructures cloud. Elles sont gĂ©nĂ©ralement construites comme un ensemble de microservices faiblement couplĂ©s, emballĂ©s dans des conteneurs, qui sont eux-mĂȘmes gĂ©rĂ©s par une plateforme cloud. Ces applications sont par dĂ©faut prĂȘtes Ă  faire face aux pannes, ce qui signifie qu'elles fonctionnent de maniĂšre fiable et Ă©voluent mĂȘme en cas de dĂ©faillances graves au niveau de l'infrastructure. L'inconvĂ©nient est un ensemble de contraintes (contrats) que la plateforme cloud impose aux applications conteneurisĂ©es pour pouvoir les gĂ©rer de maniĂšre automatique.

5 principes de bon sens pour créer des applications cloud-native

Bien conscient de la nĂ©cessitĂ© et de l'importance de la transition vers des applications cloud, de nombreuses organisations ne savent toujours pas par oĂč commencer. Dans ce billet, nous examinerons un certain nombre de principes, dont le respect dans le dĂ©veloppement d'applications conteneurisĂ©es permettra de rĂ©aliser le potentiel des plateformes cloud et d'obtenir un fonctionnement fiable et une Ă©volutivitĂ© des applications mĂȘme en cas de dĂ©faillances graves au niveau de l'infrastructure informatique. L'objectif final des principes exposĂ©s ici est d'apprendre Ă  crĂ©er des applications pouvant ĂȘtre gĂ©rĂ©es automatiquement par des plateformes cloud comme Kubernetes.

Principes de conception logicielle

Dans le monde de la programmation, les principes sont compris comme des rĂšgles assez gĂ©nĂ©rales Ă  respecter lors de la conception de logiciels. Elles peuvent ĂȘtre appliquĂ©es indĂ©pendamment du langage de programmation utilisĂ©. Chaque principe a ses propres objectifs, souvent atteints Ă  l'aide de modĂšles et de bonnes pratiques. Il existe Ă©galement un ensemble de principes fondamentaux de crĂ©ation de logiciels de qualitĂ©, dont tous les autres dĂ©coulent. Voici quelques exemples de principes fondamentaux :

  • KISS (Keep it simple, stupid) – ne pas compliquer les choses ;
  • DRY (Don’t repeat yourself) – ne pas se rĂ©pĂ©ter ;
  • YAGNI (You aren’t gonna need it) – ne pas crĂ©er quelque chose dont on n'a pas un besoin immĂ©diat ;
  • SoC (Separation of concerns) – sĂ©parer les responsabilitĂ©s.

Comme on peut le voir, ces principes ne fixent pas de rÚgles spécifiques, mais relÚvent plutÎt du bon sens basé sur l'expérience pratique, que de nombreux développeurs partagent et auxquels ils se réfÚrent réguliÚrement.
De plus, il existe SOLID – un ensemble des cinq premiers principes de la programmation et de la conception orientĂ©es objet, formulĂ©s par Robert Martin. SOLID comprend des principes complĂ©mentaires et interprĂ©tables qui, lorsqu'ils sont appliquĂ©s ensemble, aident Ă  crĂ©er des systĂšmes logiciels de meilleure qualitĂ© et Ă  les maintenir plus efficacement Ă  long terme.

Les principes SOLID s'appliquent au domaine de la POO et sont formulĂ©s Ă  l'aide de concepts tels que classes, interfaces et hĂ©ritage. Par analogie, des principes de dĂ©veloppement peuvent Ă©galement ĂȘtre formulĂ©s pour les applications cloud, oĂč l'Ă©lĂ©ment de base n'est pas une classe, mais un conteneur. En suivant ces principes, on peut crĂ©er des applications basĂ©es sur des conteneurs qui rĂ©pondent mieux aux objectifs et exigences des plateformes cloud comme Kubernetes.

Conteneurs orientés cloud : approche Red Hat

Aujourd'hui, il est relativement facile d'emballer pratiquement n'importe quelle application dans des conteneurs. Cependant, pour que les applications s'automatisent et s'orchestrent efficacement au sein d'une plateforme cloud comme Kubernetes, des efforts supplémentaires sont nécessaires.
Les idĂ©es prĂ©sentĂ©es ci-dessous sont basĂ©es sur la mĂ©thodologie L'application en douze facteurs et de nombreux autres travaux sur diffĂ©rents aspects de la crĂ©ation d'applications web, allant de la gestion du code source Ă  des modĂšles de mise Ă  l'Ă©chelle. Les principes dĂ©crits ne concernent que le dĂ©veloppement d'applications basĂ©es sur des conteneurs, construits selon une architecture microservices, et destinĂ©es aux plateformes cloud telles que Kubernetes. L'Ă©lĂ©ment de base dans notre discussion est l'image du conteneur, et par environnement d'exĂ©cution prĂ©vu des conteneurs, nous entendons la plateforme d'orchestration des conteneurs. L'objectif des principes proposĂ©s est de crĂ©er des conteneurs pour lesquels la plupart des plateformes d'orchestration peuvent automatiser les tĂąches de planification (scheduling – choix de l'hĂŽte pour lancer une instance de conteneur), de mise Ă  l'Ă©chelle et de surveillance. Les principes sont exposĂ©s dans un ordre arbitraire.

Principe de la tĂąche unique (Single Concern Principle, SCP)

Ce principe est en grande partie similaire au principe de la responsabilitĂ© unique (Single Responsibility Principle, SRP), qui fait partie du principe SOLID et stipule que chaque objet doit avoir une seule responsabilitĂ©, et cette responsabilitĂ© doit ĂȘtre entiĂšrement encapsulĂ©e dans la classe. L'essence du SRP est que chaque responsabilitĂ© est une raison de modification, et la classe ne doit avoir qu'une seule raison de changer.

Dans le SCP, au lieu du mot « responsabilité » (responsibility), nous utilisons le mot « tùche » (concern) pour indiquer un niveau d'abstraction plus élevé et une portée plus large pour le conteneur par rapport à la classe OOP. Et si l'objectif du SRP est d'avoir seulement une raison pour des modifications, le SCP vise à élargir les possibilités de réutilisation et de remplacement des conteneurs. En suivant le SRP et en créant un conteneur qui résout une seule tùche et le fait de maniÚre fonctionnellement complÚte, vous augmentez les chances de réutiliser ce conteneur dans divers contextes d'application.

Le principe SCP stipule que chaque conteneur doit résoudre une seule tùche et bien la réaliser. De plus, le SCP dans le monde des conteneurs est atteint plus facilement que le SRP dans le monde de l'OOP, car les conteneurs effectuent généralement un seul processus, et la plupart du temps, ce processus résout une seule tùche.

Si un microservice conteneur doit rĂ©soudre plusieurs tĂąches Ă  la fois, il peut ĂȘtre dĂ©composĂ© en conteneurs unidimensionnels et regroupĂ© dans un mĂȘme pod (unitĂ© de dĂ©ploiement de la plateforme de conteneurisation) Ă  l'aide de modĂšles sidecar et init-containers. De plus, le SCP facilite le remplacement d'un ancien conteneur (par exemple, un serveur web ou un broker de messages) par un nouveau qui rĂ©sout la mĂȘme tĂąche mais possĂšde des fonctionnalitĂ©s Ă©tendues ou se scale mieux.

5 principes de bon sens pour créer des applications cloud-native

Le principe de haute observabilité (High Observability Principle, HOP)

Lors de l'utilisation de conteneurs comme moyen unifié d'empaquetage et de déploiement d'applications, celles-ci sont considérées comme des « boßtes noires ». Cependant, lorsqu'il s'agit de conteneurs cloud, ils doivent fournir des API spécifiques à l'environnement d'exécution pour contrÎler la santé des conteneurs et prendre les mesures appropriées si nécessaire. Sans cela, il sera impossible d'uniformiser l'automatisation de la mise à jour des conteneurs et la gestion de leur cycle de vie, ce qui, à son tour, nuira à la résilience et à l'utilisation pratique du systÚme logiciel.

5 principes de bon sens pour créer des applications cloud-native
En pratique, une application conteneurisée doit, au minimum, disposer d'une API pour différents types de contrÎles de santé : des tests de disponibilité (liveness) et des tests de préparation (readiness). Si l'application prétend offrir davantage, elle doit également fournir d'autres moyens de contrÎle de son état. Par exemple, l'enregistrement d'événements importants via STDERR et STDOUT pour l'agrégation des journaux à l'aide d'outils comme Fluentd, Logstash et autres. Ainsi que l'intégration avec des bibliothÚques de traçage et de collecte de métriques, telles que OpenTracing, Prometheus, etc.

En gĂ©nĂ©ral, l'application peut toujours ĂȘtre considĂ©rĂ©e comme une « boĂźte noire », mais elle doit ĂȘtre Ă©quipĂ©e de toutes les API nĂ©cessaires Ă  la plateforme pour qu'elle puisse surveiller et gĂ©rer l'application de la meilleure maniĂšre possible.

Principe de conformité au cycle de vie (Life-cycle Conformance Principle, LCP)

LCP est l'antithĂšse de HOP. Si HOP stipule que le conteneur doit fournir des API Ă  la plateforme pour la lecture, LCP exige que l'application soit capable de recevoir des informations de la plateforme. De plus, le conteneur doit non seulement recevoir des Ă©vĂ©nements, mais aussi s'adapter, c'est-Ă -dire rĂ©agir Ă  eux. D'oĂč le nom du principe, qui peut ĂȘtre considĂ©rĂ© comme une exigence de fournir des API Ă  la plateforme pour l'Ă©criture.

5 principes de bon sens pour créer des applications cloud-native
Les plateformes disposent de diffĂ©rents types d'Ă©vĂ©nements qui aident Ă  gĂ©rer le cycle de vie du conteneur. Cependant, c'est l'application elle-mĂȘme qui doit dĂ©cider lesquels d'entre eux percevoir et comment rĂ©agir.

Il est clair que certains Ă©vĂ©nements sont plus importants que d'autres. Par exemple, si une application ne gĂšre pas bien les arrĂȘts inattendus, elle doit pouvoir recevoir des messages signal: terminate (SIGTERM) et initier sa procĂ©dure d'arrĂȘt dĂšs que possible, afin de terminer avant de recevoir signal: kill (SIGKILL), qui vient aprĂšs SIGTERM.

De plus, des Ă©vĂ©nements tels que PostStart et PreStop peuvent ĂȘtre cruciaux pour le cycle de vie de l'application. Par exemple, aprĂšs le dĂ©marrage, une application peut nĂ©cessiter un certain temps de "rĂ©chauffement" avant de pouvoir rĂ©pondre aux requĂȘtes. Ou l'application doit de maniĂšre particuliĂšre libĂ©rer des ressources lors de son arrĂȘt.

Principe de non-modification de l'image du conteneur (Image Immutability Principle, IIP)

Il est gĂ©nĂ©ralement admis que les applications conteneurisĂ©es doivent rester inchangĂ©es aprĂšs la construction, mĂȘme si elles sont exĂ©cutĂ©es dans diffĂ©rents environnements. Cela nĂ©cessite d'externaliser le stockage des donnĂ©es au moment de l'exĂ©cution (autrement dit, d'utiliser des moyens externes pour cela), ainsi que de se fier Ă  des configurations externes adaptĂ©es Ă  l'environnement d'exĂ©cution spĂ©cifique, plutĂŽt que de modifier ou de crĂ©er des conteneurs uniques pour chaque environnement. AprĂšs toute modification de l'application, l'image du conteneur doit ĂȘtre reconstruite et dĂ©ployĂ©e dans tous les environnements utilisĂ©s. D'ailleurs, un principe similaire est utilisĂ© dans la gestion des systĂšmes informatiques, connu sous le nom de principe de non-modification des serveurs et de l'infrastructure.

L'objectif de l'IIP est d'Ă©viter la crĂ©ation d'images de conteneurs distincts pour diffĂ©rents environnements d'exĂ©cution et d'utiliser la mĂȘme image avec la configuration correspondante pour un environnement spĂ©cifique. Suivre ce principe permet de mettre en Ɠuvre des pratiques importantes en termes d'automatisation des systĂšmes cloud, telles que le retour en arriĂšre (roll-back) et l'application (roll-forward) des mises Ă  jour d'application.

5 principes de bon sens pour créer des applications cloud-native

Principe de la généricité des processus (Process Disposability Principle, PDP)

L'une des caractéristiques les plus importantes d'un conteneur est son éphémérité : une instance de conteneur est facilement créée et facilement détruite, ce qui permet de la remplacer à tout moment par une autre instance. Il peut y avoir de nombreuses raisons pour un tel remplacement : échec d'un test de validité, mise à l'échelle de l'application, migration vers un autre hÎte, épuisement des ressources de la plateforme ou d'autres situations.

5 principes de bon sens pour créer des applications cloud-native
En consĂ©quence, les applications conteneurisĂ©es doivent conserver leur Ă©tat Ă  l'aide de moyens externes, ou utiliser pour cela des schĂ©mas distribuĂ©s internes avec redondance. De plus, l'application doit dĂ©marrer rapidement et se terminer rapidement, et doit Ă©galement ĂȘtre prĂȘte Ă  faire face Ă  une dĂ©faillance matĂ©rielle fatale soudaine.

Une des pratiques qui aide Ă  mettre en Ɠuvre ce principe consiste Ă  crĂ©er des conteneurs de petite taille. Les environnements cloud peuvent automatiquement choisir un hĂŽte pour exĂ©cuter un exemplaire de conteneur, donc plus la taille du conteneur est petite, plus il dĂ©marrera rapidement - il sera simplement copiĂ© plus rapidement sur l'hĂŽte cible via le rĂ©seau.

Principe d'autosuffisance (Self-containment Principle, S-CP)

Selon ce principe, Ă  l'Ă©tape de construction, tous les composants nĂ©cessaires sont inclus dans le conteneur. Le conteneur doit ĂȘtre construit en supposant qu'il n'y a qu'un noyau Linux propre dans le systĂšme, donc toutes les bibliothĂšques supplĂ©mentaires nĂ©cessaires doivent ĂȘtre placĂ©es dans le conteneur lui-mĂȘme. On doit Ă©galement y placer des Ă©lĂ©ments tels que l'environnement d'exĂ©cution pour le langage de programmation concernĂ©, la plateforme d'application (si nĂ©cessaire) et d'autres dĂ©pendances requises lors de l'exĂ©cution de l'application conteneurisĂ©e.

5 principes de bon sens pour créer des applications cloud-native

Les exceptions ne sont faites que pour les configurations qui varient d'un environnement Ă  l'autre et doivent ĂȘtre fournies Ă  l'exĂ©cution, par exemple, via Kubernetes ConfigMap.

L'application peut inclure plusieurs composants conteneurisĂ©s, comme un conteneur de SGBD dans le cadre d'une application web conteneurisĂ©e. Selon le principe S-CP, ces conteneurs ne doivent pas ĂȘtre fusionnĂ©s en un seul, mais doivent ĂȘtre conçus de maniĂšre Ă  ce que le conteneur SGBD contienne tout le nĂ©cessaire pour le fonctionnement de la base de donnĂ©es, tandis que le conteneur de l'application web contienne tout le nĂ©cessaire pour le fonctionnement de l'application web, y compris le serveur web. En consĂ©quence, lors de l'exĂ©cution, le conteneur de l'application web dĂ©pendra du conteneur SGBD et s'adressera Ă  lui au besoin.

Principe de confinement à l'exécution (Runtime Confinement Principle, RCP)

Le principe S-CP dĂ©termine comment un conteneur doit ĂȘtre assemblĂ© et ce que doit contenir le fichier binaire de l'image. Mais un conteneur n'est pas simplement une "boĂźte noire" qui n'a qu'une seule caractĂ©ristique : la taille du fichier. Pendant l'exĂ©cution, le conteneur acquiert d'autres dimensions : la quantitĂ© de mĂ©moire utilisĂ©e, le temps processeur et d'autres ressources systĂšme.

5 principes de bon sens pour créer des applications cloud-native
C'est ici que le principe RCP entre en jeu, selon lequel le conteneur doit découpler ses exigences en ressources systÚme et les transmettre à la plateforme. En ayant des profils de ressources pour chaque conteneur (quelles ressources CPU, mémoire, réseau et systÚme de disque sont nécessaires), la plateforme peut optimiser la gestion et l'autoscaling, gérer les capacités informatiques et maintenir les niveaux SLA pour les conteneurs.

Outre la satisfaction des exigences des ressources du conteneur, il est Ă©galement important que l'application ne dĂ©passe pas les limites qu'elle a elle-mĂȘme dĂ©finies. Sinon, en cas de pĂ©nurie de ressources, la plateforme aura plus de chances de l'inclure dans la liste des applications Ă  interrompre ou Ă  migrer.

Lorsqu'on parle d'orientation vers le cloud, nous faisons avant tout référence à la maniÚre de travailler.
Nous avons formulé ci-dessus une série de principes généraux qui établissent les bases méthodologiques pour construire des applications conteneurisées de qualité pour des environnements cloud.

Il est Ă  noter qu'en plus de ces principes gĂ©nĂ©raux, vous aurez Ă©galement besoin de mĂ©thodes et techniques avancĂ©es pour travailler avec des conteneurs. De plus, nous avons plusieurs recommandations succinctes, qui sont plus spĂ©cifiques et doivent ĂȘtre appliquĂ©es (ou non) en fonction de la situation :

  • Essayez de rĂ©duire la taille des images : supprimez les fichiers temporaires et n'installez pas de paquets inutiles – plus la taille du conteneur est rĂ©duite, plus il se construit et se copie rapidement sur l'hĂŽte cible via le rĂ©seau.
  • Concentrez-vous sur des User-ID arbitraires : n'utilisez pas la commande sudo ou des User-ID spĂ©ciaux pour exĂ©cuter vos conteneurs.
  • Étiquetez les ports importants : les numĂ©ros de ports peuvent ĂȘtre assignĂ©s aussi bien Ă  l'exĂ©cution, mais il est prĂ©fĂ©rable de les spĂ©cifier Ă  l'aide de la commande EXPOSE – cela facilitera l'utilisation de vos images par d'autres personnes et programmes.
  • Stockez des donnĂ©es permanentes sur des volumes : les donnĂ©es qui doivent persister aprĂšs la destruction d'un conteneur doivent ĂȘtre enregistrĂ©es sur des volumes.
  • Écrivez des mĂ©tadonnĂ©es d'image : les Ă©tiquettes, balises et annotations facilitent l'utilisation des images - les autres dĂ©veloppeurs vous en seront reconnaissants.
  • Synchronisez l'hĂŽte et les images : certaines applications conteneurisĂ©es nĂ©cessitent la synchronisation du conteneur avec l'hĂŽte sur certains attributs, comme l'heure ou l'identifiant de machine.
  • En conclusion, nous partageons des modĂšles et des meilleures pratiques qui vous aideront Ă  mettre en Ɠuvre plus efficacement les principes mentionnĂ©s ci-dessus :
    www.slideshare.net/luebken/container-patterns
    docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices
    docs.projectatomic.io/container-best-practices
    docs.openshift.com/enterprise/3.0/creating_images/guidelines.html
    www.usenix.org/system/files/conference/hotcloud16/hotcloud16_burns.pdf
    leanpub.com/k8spatterns
    12factor.net

Webinaire sur la nouvelle version de la OpenShift Container Platform - 4
11 juin Ă  11h00

Ce que vous apprendrez :

  • Red Hat Enterprise Linux CoreOS immuable
  • OpenShift service mesh
  • Cadre Operator
  • Cadre Knative

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster