Migration des charges de travail conteneurisées vers l'architecture ARM - Notre étude de cas Jump

Étude de cas

5 min

lire

Introduction

Dans le monde en constante évolution de l'informatique en nuage, l'optimisation des coûts et l'amélioration des performances sont des priorités absolues. L'architecture ARM, avec ses processeurs AWS Graviton, offre une alternative puissante et rentable aux architectures x86 traditionnelles.

Cet article présente notre expertise et notre expérience en matière de migration des charges de travail vers des instances ARM, en mettant l'accent sur les avantages, les défis et les meilleures pratiques.

Pourquoi choisir l'architecture ARM (Graviton) ?

Les processeurs Graviton d'AWS, basés sur l'architecture ARM, offrent plusieurs avantages significatifs :

Comparaison des coûts : Avant et après la migration ARM

La migration vers l'architecture ARM, en particulier avec les instances Graviton, offre des avantages financiers substantiels. Vous trouverez ci-dessous une comparaison des coûts pour des cas d'utilisation courants :

x86 vs ARM (région parisienne)

Remarque : Les coûts horaires sont indicatifs et peuvent varier en fonction de la région AWS, des options de tarification (Reserved, Spot) et des charges de travail spécifiques.

Pour les fonctions AWS Lambda, l'exécution sur l'architecture ARM (Graviton2) permet généralement de réduire les coûts de 20 % tout en offrant des performances améliorées par rapport à l'architecture x86. Cette optimisation est particulièrement bénéfique pour les applications sans serveur à grande échelle, où les économies peuvent rapidement s'accumuler.

Comment migrer vos charges de travail AWS vers ARM ?

Nos équipes ont développé une forte expertise dans la migration de charges de travail conteneurisées vers des instances ARM sur AWS. Notre approche comprend :

Optimisation continue: Même après la migration, nous continuons à surveiller et à optimiser les charges de travail pour exploiter pleinement les capacités de l'architecture ARM.

Expérience des services AWS

Trois services principaux permettent d'exécuter des conteneurs sur AWS :

Avant d'aborder les aspects spécifiques de la migration de chacun de ces services, examinons l'exigence commune à tous ces services : la nécessité de créer des images de conteneurs pour la nouvelle architecture cible.

Construction d'images (Build)

Constructions natives (Construire ARM sur un hôte ARM)

L'objectif est de construire l'image directement sur une architecture ARM64 : une instance Graviton, une instance AWS CodeBuild Arm64, ou un Mac avec une puce Apple Silicon (M1 ou ultérieure).

Constructions émulées (Construire ARM sur un hôte x86)

L'objectif est de construire une image Arm64 à partir d'une machine x86 (émulation) :

Notes supplémentaires sur les constructions

Les constructions natives sont souvent plus rapides et plus fiables puisqu'il n'y a pas d'émulation - c'est la meilleure option si vous avez accès à un environnement ARM64 (Graviton EC2, Mac M1, CodeBuild Arm64).

Les constructions émulées (via buildx + QEMU) sont très pratiques pour générer des images multiplateformes sur des machines x86, mais elles peuvent être beaucoup plus lentes et plus complexes.

Manifeste multi-architecture

Un manifeste multi-architecture vous permet de regrouper plusieurs images Docker construites pour différentes architectures (telles que x86_64, ARM64, etc.) sous une seule étiquette unifiée. Lorsque vous exécutez un docker pull, le moteur détecte automatiquement votre architecture et récupère la version correspondante.

  1. Construction d'images spécifiques : Des images Docker distinctes, chacune spécifique à une architecture donnée (par exemple, amd64, arm64), sont générées puis poussées vers un registre d'images de conteneurs (par exemple, Docker Hub, Amazon ECR).
  2. Création du fichier manifeste : Un fichier manifeste (ou liste manifeste), qui est un fichier index, est créé. Il référence les images spécifiques à l'architecture, en associant chaque image à l'architecture correspondante. Ce manifeste est ensuite poussé vers le registre avec une étiquette unifiée (par exemple, my-app:latest).‍
  3. Exécution des conteneurs : Lorsqu'il est exécuté (par exemple, docker run my-app:latest), le client Docker interroge le registre des conteneurs pour obtenir le fichier manifeste. Il identifie sa propre architecture, télécharge l'image appropriée et instancie le conteneur de manière transparente.

‍Cesmanifestes multi-architectures sont très utiles car:

Construire des manifestes multi-architectures avec l'émulation

La méthode la plus simple en une étape avec buildx :

Construire des manifestes multi-architectures de manière native 

Flux de travail CI/CD recommandé

Ce diagramme illustre un pipeline d'intégration et de déploiement continus (CI/CD) optimisé pour la création d'applications multi-architectures (Arm et x86). À partir d'un dépôt de code unique, le processus se divise en deux flux parallèles, chacun utilisant un runner natif pour compiler, tester et publier une image de conteneur spécifique à son architecture. Une fois ces deux images validées, une étape de consolidation les fusionne en un manifeste unique. Ce manifeste permet ensuite aux environnements de déploiement de télécharger automatiquement la version de l'image appropriée (Arm ou x86) pour leur architecture, garantissant ainsi un processus de déploiement final simple et transparent sur les deux plateformes.

AWS Lambda : Migration vers ARM

Une particularité de Lambda : pour l'instant, le service ne prend pas en charge les images multi-architectures.

Pour exécuter une fonction Lambda sur une architecture ARM64 (via les processeurs AWS Graviton2), il suffit de modifier un seul paramètre dans sa configuration. Dans les paramètres de Runtime de votre fonction, vous devez :

ECS Fargate : Migration vers ARM

Pour migrer une charge de travail Fargate vers ARM, vous devez spécifier explicitement l'architecture dans la configuration de la définition de la tâche. Pour ce faire, ajoutez ou modifiez le champ runtimePlatform dans le JSON de la définition de la tâche, en lui attribuant la valeur ARM64 pour indiquer que la tâche doit s'exécuter sur une architecture ARM. Cette modification garantit que Fargate alloue des ressources basées sur ARM pour votre application.

ECS (mode EC2) : Migration vers ARM

La migration d'une charge de travail ECS en mode EC2 vers une architecture ARM nécessite deux étapes clés.

Créer un fournisseur de capacité ARM

Associez un nouveau fournisseur de capacité ECS à un groupe de mise à l'échelle automatique (ASG) EC2. Cet ASG doit être configuré pour lancer des instances ARM (par exemple, t4g, m6g, c6g) avec une AMI ARM64 optimisée par ECS. Intégrez ce fournisseur de capacité dans votre stratégie de cluster ECS pour permettre une migration progressive ou des charges de travail mixtes.

Contraindre les tâches à l'ARM

Configurez vos services ou vos tâches pour qu'ils utilisent spécifiquement ce fournisseur de capacité ARM. Pour plus de sécurité, incluez une contrainte de placement dans la définition de la tâche afin d'imposer l'exécution sur une architecture ARM64.

Voici un exemple de contrainte de placement à ajouter dans la définition de la tâche :

En résumé, les fournisseurs de capacité optimisent la migration en automatisant la gestion et l'ajustement des instances Graviton. Il vous suffit de spécifier le type de capacité requis pour vos tâches (ARM ou x86), et ECS, par l'intermédiaire du fournisseur de capacité, s'assure que l'infrastructure appropriée est provisionnée.

EKS (Kubernetes) : Migration vers ARM

Pour migrer un cluster Amazon EKS (Elastic Kubernetes Service) vers une architecture ARM, la démarche est similaire à ECS en mode EC2. Elle consiste à provisionner des nœuds de calcul (worker nodes) basés sur l'architecture ARM et à s'assurer que vos applications (pods) s'exécutent sur ces nouveaux nœuds.

Ajout de nœuds de calcul ARM

Pour intégrer des instances AWS Graviton (ARM64) dans votre cluster EKS, l'approche recommandée consiste à utiliser des groupes de nœuds gérés.

Les principales étapes de la création d'un groupe de nœuds sont les suivantes :

Karpenter

Une alternative efficace pour l'autoscaling est Karpenter, un outil open-source recommandé par AWS pour EKS. Il permet le provisionnement dynamique des nœuds (Graviton/x86), optimise les coûts grâce aux instances Spot et simplifie la configuration pour une gestion des ressources flexible et rentable.

Ordonnancement de pods sur des nœuds ARM

Une fois que les nœuds ARM sont disponibles, vous devez configurer Kubernetes pour déployer vos applications compatibles ARM sur ces nœuds. Pour ce faire, utilisez les mécanismes de planification intégrés de Kubernetes.

Kubernetes attribue automatiquement des étiquettes aux nœuds, comme kubernetes.io/arch=arm64. Ce label peut être utilisé pour s'assurer que vos pods s'exécutent exclusivement sur les nœuds appropriés.

La méthode la plus courante consiste à spécifier un nodeSelector ou une affinité de nœud(nodeAffinity) dans votre définition de déploiement ou de pod.

Voici un exemple simple utilisant nodeSelector:

Cas d'utilisation client : Saut - Migration ARM et mise à niveau de version intégrée

Contexte de la clientèle

Jump est une plateforme française qui permet aux freelances de conserver leur indépendance tout en bénéficiant des droits des salariés (fiche de paie, assurance, congés payés, etc.) grâce au portage salarial. Jump souhaitait optimiser ses coûts d'infrastructure et améliorer les performances de ses applications conteneurisées. Leur architecture existante à base de x86 était stable mais ne permettait plus les gains d'efficacité souhaités. En outre, il était nécessaire de mettre à niveau plusieurs clusters Kubernetes parallèlement à la migration ARM.

Objectifs du projet

Défis rencontrés et solutions apportées

Le projet avec Jump a présenté des défis complexes en raison de la nature combinée de la migration ARM et de la mise à jour de la version de l'écosystème d'applications. Les points les plus critiques étaient les suivants :

Résultats et avantages

La migration réussie et la mise en œuvre de nouvelles pratiques ont permis à Jump de.. :

Ce cas d'usage illustre notre capacité à gérer des projets de migration complexes, intégrant non seulement des changements architecturaux mais aussi des évolutions technologiques profondes et l'optimisation des pratiques DevOps.

Limites et défis de la migration vers l'ARM

Si la migration vers l'architecture ARM offre des avantages substantiels, elle peut également présenter des défis et des limites qu'il est important de prendre en compte :

Il est essentiel d'évaluer soigneusement ces points lors de la planification de la migration afin de s'assurer que les avantages escomptés justifient l'investissement. Une approche progressive et bien structurée est essentielle pour minimiser les perturbations et maximiser le succès de la transition.

Conclusion

La migration vers l'architecture ARM, notamment avec les processeurs Graviton d'AWS, offre une opportunité significative d'optimiser les infrastructures cloud. Notre expertise nous permet d'accompagner nos clients dans cette transition, en gérant les défis et en exploitant pleinement les avantages de cette technologie.

Nous accompagnons nos clients dans la modernisation de leurs applications, leur conteneurisation et la mise en place de pipelines CI/CD. La plupart de ces évolutions devraient être gérées par les meilleures pratiques d'Infrastructure as Code (IaC) et de GitOps. Nous sommes prêts à vous accompagner dans l'adoption de ces pratiques si elles ne sont pas encore en place au sein de votre organisation.

Prêt à transformer vos opérations ? Contactez-nous pour une migration ARM efficace et en douceur.

Merci d'avoir lu cet article. Nous espérons qu'il vous a plu !

Contactez-nous pour plus d'informations sur notre accompagnement et notre expertise !