Cet article fait partie de notre guide: Conteneurs et automatisation : la voie royale vers DevOps

De l'avantage de combiner le IaaS d’AWS et Docker

Exécuter Docker dans Amazon EC2 Container Service permet d'accroître la portabilité et de diminuer les coûts. Voici comment procéder.

Les développeurs Cloud sont souvent aux prises avec des problèmes de configuration. Ainsi, un service donné peut parfaitement fonctionner en environnement de test et ne plus se comporter comme prévu en production. Amazon EC2 Container Service fournit des API hébergées, gérées et totalement programmables. Celles-ci permettent d'exécuter des conteneurs Docker au sein d'EC2. Les développeurs choisissent la taille et le nombre de serveurs dans le parc Docker et Amazon installe les conteneurs dans les instances.

Elastic Compute Cloud (EC2) d'Amazon Web Services (AWS) permet aux utilisateurs d'exécuter des machines virtuelles (VM, Virtual Machine) manuellement ou de manière automatisée, selon la configuration. Les utilisateurs d'EC2 définissent le type d'instances, la région et la zone de disponibilité (AZ, Availability Zone) où la VM sera installée. Les instances EC2 permettent la montée en puissance (scale up). Mais leur véritable puissance s'exprime lorsque vous ajoutez une capacité de déploiement (scale out), lorsque vous répartissez les services sur plusieurs serveurs, dans plusieurs AZ et régions.

Toutefois, par sa tarification, EC2 entrave cette approche : sa solution la plus économique consiste à exécuter un nombre réduit d'instances de plus grande envergure. Les entreprises désireuses d'isoler intégralement certains services, afin qu'ils n'interfèrent pas avec d'autres, se tournent alors vers Docker.

Docker est conçu pour les microservices et la portabilité en Cloud. Les microservices contribuent à empêcher les problèmes qui surviennent lorsqu'un service donné en affecte un autre. Par exemple, si votre processus d'archivage de documents PDF s'emballe et épuise votre processeur, la dernière chose que vous souhaitez, c'est qu'il paralyse votre processus d'indexation des recherches. La solution classique consiste à exécuter chaque service dans sa propre instance EC2. Toutefois, deux instances m3.large sont plus coûteuses qu'une instance m3.xlarge. Amazon vous encourage à utiliser des instances de plus grande taille, plutôt qu'un nombre plus important d'instances.

En revanche, Docker n'est pas limité à AWS ou au Cloud. Les équipes informatiques peuvent l'exécuter sur tout support, d'un Cloud public à une configuration bare metal. Le conteneur s'exécute alors sur la VM en tant que couche d'abstraction, sans éliminer aucune gestion qu'induirait une autre couche de virtualisation intégrale.

En d'autres termes, les entreprises qui souhaitent tester d'autres fournisseurs de Clouds publics n'ont aucun code à réécrire.

Voici quelques étapes à suivre lorsque vous configurez et exécutez un service de gestion de conteneurs Amazon EC2.

Prise en main d'Amazon ECS

Le service de gestion de conteneurs d’EC2 dispose d'une console qui comprend tout ce dont vous avez besoin pour bien débuter avec les solutions Docker et AWS.

La première étape consiste à créer un agrégat - ou cluster - et à ajouter des instances à la réserve - ou pool - Docker. Ces instances peuvent venir s'ajouter à un groupe auto-évolutif, ou ASG (Auto Scaling Group). Ainsi, toutes les instances en état de fonctionner sont toujours disponibles. Le système Docker dispose donc systématiquement de la puissance supplémentaire nécessaire à l'exécution ininterrompue de vos conteneurs.

Pour commencer, ouvrez la page de la console Amazon ECS et créez un cluster. Il constituera le groupement sommital des instances Docker. Plusieurs clusters distincts vous permettront d'isoler des environnements de test et de développement sous le même compte AWS.

Une fois le cluster créé, exécutez-y des instances. Je vous recommande d'utiliser un ASG, même si vous souhaitez exécuter un nombre fixe d'instances dans votre cluster. Mettre en place un ASG constitue un garde-fou ; si un serveur vient à défaillir, il est automatiquement remplacé.

Dans la console, créez une configuration de lancement, puis choisissez l'instance optimisée ECS la plus récente sur la place de marché AWS.

Cliquez sur Continuer puis choisissez le type d'instances à lancer. Je recommande le type C4 ou M3, en grande taille ou dans une taille supérieure. N'optez pas pour un type d'instances T2 ou T1. Conçus pour bénéficier d'une puissance instantanée, ils peuvent poser des problèmes lorsqu'il s'agit de maintenir l'exécution de processus en continu.

Fournissez le reste des informations et procédez à la configuration de l'ASG en suivant les invites à mesure qu'elles se présentent. Vous pouvez configurer votre ASG pour qu'il s'exécute dans un Cloud privé virtuel (VPC, Virtual Private Cloud). Toutefois, veillez à lui permettre de s'exécuter au moins sur deux sous-réseaux distincts, dans deux zones de disponibilité (AZ) différentes.

Une fois votre ASG exécuté sur des instances EC2 du cluster, celles-ci s'affichent dans votre console ESG (figure 1).

Création de définitions de tâches

Une tâche (task) correspond à un ou plusieurs conteneurs Docker qui s'exécutent ensemble pour un seul et unique service ou microservice.

Les tâches servent à des charges de travail simples, telles qu'un serveur Redis, ou complexes, telles qu'une pile WordPress complète avec des conteneurs liés destinés à une base de données, un composant Memcached et un serveur Web. Pour s'assurer qu'ils fonctionnent en cohésion, il peut être utile de lier des conteneurs.

Lors de la configuration d'un conteneur dans votre définition de tâche, spécifiez un nom de conteneur, une image, des CPUs, une quantité de mémoire, des ports optionnels à mapper, des variables d'environnement optionnelles, une commande prioritaire optionnelle et des liens.

Vous devez spécifier la quantité de mémoire (en Mo) ainsi que le nombre d'unités CPU (chaque processeur, cadencé à 2,8 GHz, dispose d'environ 1 024 unités CPU au total) à réserver à chaque conteneur. Ainsi, les serveurs ne sont pas surchargés par un nombre excessif de conteneurs, une situation qui devrait empêcher un conteneur de consommer trop de ressources à lui seul et de ralentir d'autres conteneurs.

La page d'accueil du cluster affiche les unités CPU et la mémoire vive disponibles. Si l'un de ces éléments vient à manquer, lancez d'abord des serveurs supplémentaires dans votre cluster puis des conteneurs supplémentaires.

Création d'un service

Une fois une tâche définie, il est temps de créer un service. Il s'agit de la version ECS d'un ASG simplifié. Cette étape garantit l'exécution d'un certain nombre d'instances de tâche et permet aux développeurs de les associer au sein d'un équilibreur de charge élastique (load balancer).

Affecter un rôle aux services permet de compartimenter. Chaque conteneur Docker se voit attribuer sa propre identité et ses propres rôles au sein de la gestion des accès. Cette caractéristique offre avec EC2 pratiquement la même puissance qu'un conteneur Docker distinct.

Si vous le souhaitez, commencez par un registre Docker privé. Celui-ci peut créer un référentiel privé d'images Docker pour alimenter le système. Un référentiel Docker privé se présente sous la forme d'un conteneur Docker configurable qui prend en charge le stockage du référentiel sous Amazon Simple Storage Service.

La figure 2 présente une définition de tâche que j'ai utilisée pour héberger mon propre registre Docker.

La figure 3 présente le service associé.

L'équilibreur de charge interne de mon hub Docker a pour valeurs de proxy les ports 80 à 5000. Sachant qu'il n'est autorisé qu'au sein de mon VPC, je n'ai besoin d'aucune authentification personnalisée, ni d'aucune prise en charge SSL. Je peux configurer des images à extraire de ce référentiel Docker et je dispose d'une instance Docker spéciale que j'utilise pour créer des images et les envoyer (par push) vers ce référentiel.

Exécution de mises à jour « bleu/vert » (« green / bue »)

A l'instar d'Elastic Beanstalk (le PaaS d’AWS), pour se mettre à jour, le service de gestion de conteneurs Amazon EC2 lance des tâches supplémentaires, bascule vers des équilibreurs de charge et met fin aux anciens conteneurs une fois que les nouveaux sont prêts.

Ce procédé – dit « bleu/vert » (« green / bue ») ou continu – a pour caractéristique d'éliminer les interruptions de services. Ainsi, les équipes IT peuvent lancer des mises à jour pendant des heures ouvrées normales sans affecter la clientèle.

Pour procéder à un déploiement « bleu/vert », créez une autre version de votre tâche – éventuellement en pointant vers une nouvelle version de votre image – puis mettez le service à jour pour qu'il utilise cette révision.

Dans ECS, toutes les révisions de tâches sont enregistrées. Vous pouvez donc facilement revenir à une version antérieure si le déploiement se passe mal.

Conteneurs Docker : ECS ou Beanstalk

Exécuter Docker sur des instances Amazon n'est pas un concept nouveau. Si vous avez besoin d'une application Web pour utiliser régulièrement de nouveaux déploiements, le tandem Beanstalk-Docker constitue la meilleure option. Mais cette solution n'est pas nécessairement idéale lorsqu'il s'agit d'exécuter plusieurs microservices derrière une application.

Si votre application Web pilote d'autres systèmes d'arrière-plan, tels que l'extraction de transcriptions vidéo, une détection automatisée de visages ou la fonction analytique d'un jeu, vous pouvez avoir besoin d'exécuter à la fois ECS et Elastic Beanstalk avec Docker.

Il peut s'avérer plus efficace de diriger des microservices vers ECS afin d'effectuer une lecture à partir des files d'attente SQS, puis de distribuer des services pour en exécuter plusieurs copies à l'échelle de votre parc.

Supposons, par exemple, que je dispose d'un parc de 4 instances m3.xlarge. Celles-ci exécutent 10 copies d'un outil d'extraction de documents PDF, deux copies d'un système d'indexation de texte intégral, quatre copies d'un système de mise à disposition, et quelques tâches diverses et variées telles que la mise à jour de nos tableaux de bord Geckoboard et la synchronisation de données vers RDS pour une analyse dans Tableau.

Pour ajouter davantage de processus d'extraction de documents PDF, je peux accéder à ce service et augmenter le nombre de tâches en exécution. Si j'ai besoin de plus d'espace, je peux augmenter soit la taille du serveur, soit celle de mon pool. Si je procédais ainsi avec Beanstalk, j'aurais besoin d'au moins 10 instances distinctes pour exécuter 10 copies de mon outil d'extraction de documents PDF. Avec ECS, je profite d'instances de plus grande taille que j'exécute pour un coût inférieur à celui d'instances plus petites et plus nombreuses.

La solution ECS est plus adaptée si vous utilisez Docker sur AWS. Amazon fait la plus grande part du travail. Vous pouvez donc facilement gérer des instances tout en utilisant des éléments familiers, tels que l’elastic load balancing, l’auto scaling ainsi que des services similaires, avec un nombre d'instances fixe par conteneur.

Pour approfondir sur IaaS

Close