measurement-and-instrumentation
Azure Devops pour la livraison continue en architecture de microservices
Table of Contents
L'architecture des microservices a transformé l'ingénierie logicielle moderne en décomposition d'applications monolithiques en petits services déployables indépendamment. Cette approche permet aux équipes de travailler en parallèle, de façon sélective et de libérer les fonctionnalités plus rapidement. Cependant, la complexité opérationnelle de la gestion de dizaines ou de centaines de services exige une automatisation robuste pour la construction, l'essai et le déploiement du code, c'est-à-dire que la livraison continue (CD) devient critique. Azure DevOps fournit une plateforme cloud-native, de bout en bout qui simplifie la mise en oeuvre de pipelines CD adaptés aux environnements des microservices.
Qu'est-ce que la livraison continue dans les microservices?
Dans une architecture de microservices, le CD étend ce principe à chaque service. Au lieu de libérer un artefact monolithique, les équipes déploient plusieurs services indépendants, chacun avec son propre pipeline. Cela permet aux services d'évoluer à leur rythme, réduit le rayon de défectuosité et accélère les boucles de rétroaction. Cependant, pour atteindre le CD sur de nombreux services, il faut une orchestration attentive de la version, des dépendances, des séquences de déploiement et des capacités de retour.
Défis dans la prestation continue des microservices
Avant de plonger dans les spécificités de Azure DevOps, il est important de reconnaître les obstacles uniques que les microservices présentent:
- Interdépendances de service: Les services communiquent souvent via des API, des files d'attente de message ou des flux d'événements. La coordination des déploiements sans rupture de contrats n'est pas une règle.
- Complicité de l'infrastructure:[ Chaque service peut exiger sa propre base de données, son propre cache ou ses propres ressources de calcul, augmentant ainsi le nombre d'unités déployables.
- Consistance environnementale:[ Les environnements de développement, d'essai, de mise en scène et de production doivent se ressembler étroitement les uns aux autres pour saisir les problèmes rapidement.
- Version et retour:[ Un déploiement raté d'un service ne devrait pas affecter les autres, mais revenir sur les changements tout en maintenant la compatibilité en arrière peut être difficile.
- Observabilité:[ Sans une exploitation centralisée, des mesures et un traçage, il faut du temps pour cerner la cause profonde des problèmes dans plusieurs services.
Azure DevOps répond à ces défis avec une série d'outils intégrés qui soutiennent le contrôle de version, les pipelines automatisés, la gestion secrète, l'intégration de surveillance et l'infrastructure-comme code.
Azure DevOps: Un aperçu
Azure DevOps est une plateforme Microsoft qui regroupe des outils de développement sous un même parapluie. Elle comprend cinq services de base, chacun jouant un rôle dans la livraison continue:
- Conseils d'Azur – Suivi des travaux et planification agile.
- Repos d'Azure – Dépôts Git avec les politiques de branche et les requêtes de tirage.
- Panolines d'Azur – pipelines CI/CD pour la construction, le test et le déploiement, supportant les agents Linux, macOS et Windows.
- Plans d'essais d'Azure – Outils d'essais manuels et exploratoires.
- Artefacts d'Azur – Gestion de paquets pour Maven, npm, NuGet et Python.
Dans un contexte de microservices, Azure Pipelines est la pierre angulaire, mais les autres services améliorent le flux de travail de CD. Par exemple, Azure Repos fait appliquer les politiques de révision de code, Azure Artifacts héberge des bibliothèques partagées (p. ex., paquets internes NuGet) et Azure Boards relie des modifications aux éléments de travail pour la traçabilité.
Configuration du contrôle de version avec Azure Repos
Un pipeline CD réussi commence par un contrôle de version fiable. Azure Repos prend en charge à la fois Git et Team Foundation Version Control (TFVC).
Chaque microservice devrait résider dans son propre dépôt, un modèle connu sous le nom de -multiple repo. Cela permet aux équipes de se déployer et de se versionner indépendamment. Par ailleurs, certaines organisations adoptent un monorepo (un dépôt unique contenant tous les services), qui simplifie le partage de code et les commits atomiques mais nécessite des déclencheurs de pipeline plus sophistiqués pour éviter de reconstruire chaque service sur chaque commit. Azure Pipelines peut filtrer les changements par chemin de dossier, de sorte que monorepos sont également possibles.
Les principales pratiques de contrôle des versions pour CD comprennent :
- Politiques de branche:[ Exiger des examens de demande de tirage, des constructions réussies et des vérifications de politique avant de fusionner dans les directions principales ou de libérer.
- Stratégie de branchage: Une variante GitHub ou GitFlow fonctionne bien. Les branches de libération (p. ex. ) peuvent déclencher des pipelines de déploiement vers des environnements spécifiques.
- Version sémantique:[ Sorties d'étiquettes avec version sémantique nombres (p. ex., ) pour retracer les artefacts de nouveau au code.
Azure Repos s'intègre aux pipelines Azure via des crochets de service, de sorte qu'un commit poussé peut automatiquement démarrer une construction CI pour le service affecté.
Construction de pipelines CI/CD avec pipelines Azure
Pipeline comme code
Azure Pipelines prend en charge les définitions de pipelines basées sur YAML stockées à côté du code. Cette approche -pipeline comme code - assure la version, la reproductibilité et la collaboration. Un pipeline CI/CD typique pour un microservice comprend des étapes : construire, exécuter des essais unitaires, publier des artefacts, déployer au développement, exécuter des essais d'intégration, déployer au stading, exécuter des essais de fumée et enfin déployer à la production.
Un exemple minimum de LJA:
trigger: branches: include: - main - develop paths: include: - services/user-service/* pool: vmImage: ubuntu-latest variables: serviceName: user-service stages: - stage: Build jobs: - job: Build steps: - script: dotnet build - script: dotnet test - task: PublishBuildArtifacts@1
Remarquez le filtre de chemin . Cela garantit que le pipeline ne déclenche que lorsque des modifications sont apportées à ce répertoire de service spécifique dans un monorepo. Pour les polyrepos, chaque dépôt a son propre .
Pipelines multi-étages
Azure Pipelines vous permet de définir plusieurs étapes (Construction, Test, Déploiement) dans un seul fichier YAML. Des approbations et des barrières peuvent être ajoutées à chaque étape pour faire respecter les sign-offs manuels avant le déploiement de la production. Par exemple, un déploiement à l'étape peut nécessiter un essai automatisé réussi, tandis que la production peut avoir besoin d'une approbation d'un gestionnaire de la production.
Utilisez des groupes d'environnement pour cibler plusieurs services. Par exemple, un environnement -Production - peut englober tous les espaces de noms AKS pour les microservices. Les déploiements dans le même environnement peuvent être sécurisés par des contrôles de santé après chaque mise à jour de service.
Stratégies de déploiement
Le choix de la bonne stratégie de déploiement est essentiel pour les microservices afin de minimiser les temps d'arrêt et les risques. Azure Pipelines prend en charge plusieurs modèles via des emplois de publication et des modèles de déploiement.
Déploiements bleu-vert
Le déploiement bleu vert implique le maintien de deux environnements identiques (bleu et vert). A tout moment, un seul est en direct. Une nouvelle version est déployée dans l'environnement inactif, testée, puis le trafic est commuté. Azure DevOps peut l'implémenter en utilisant des groupes de déploiement ou des espaces de noms Kubernetes. Par exemple, le pipeline se déploie dans une fente --verte, effectue un contrôle de santé, puis met à jour l'équilibreur de charge pour acheminer le trafic vers la nouvelle fente.
Rejets de Canaries
Les versions de Canary déplacent progressivement un petit pourcentage d'utilisateurs vers la nouvelle version tout en surveillant les mesures comme les taux d'erreur et la latence. Azure DevOps s'intègre aux créneaux de déploiement Azure App Service ou au fractionnement du trafic AKS. Une étape canari peut se déployer dans un sous-ensemble de modules (p. ex., 10% de poids) et après une période d'observation, promouvoir à 100%.
Mises à jour en cours d'exécution
Les mises à jour en continu remplacent séquentiellement les instances de l'ancienne version par la nouvelle, garantissant un temps d'arrêt zéro si les sondes de santé sont correctement configurées. Azure DevOps peut utiliser la stratégie de mise à jour en continu Kubernetes (la par défaut dans les tâches Azure DevOps Kubernetes) ou les fentes de déploiement App Service avec auto-swap. Set et dans votre pipeline YAML pour contrôler le rythme de mise à jour.
Drapeaux de caractéristiques
Vous pouvez déployer du code contenant des fonctionnalités inachevées derrière un basculement et les activer lorsque vous êtes prêt. Azure DevOps ne fournit pas de système de gestion de drapeau intégré, mais il s'intègre aux services tiers (LaunchDarkly, Split) ou vous pouvez utiliser la gestion de la fonctionnalité Azure App Configuration. Le pipeline peut transmettre des instantanés de configuration ou des variables d'environnement aux services pour contrôler les états de drapeau.
Infrastructure comme code
Les microservices prospèrent lorsque l'infrastructure est automatisée et contrôlée par version. Azure DevOps prend en charge l'infrastructure comme code (IaC) avec des modèles ARM, Bicep, Terraform et PowerShell. Pour les microservices, traitez chaque infrastructure de service (p. ex., un plan de service d'application Azure, une base de données SQL ou un espace de noms Kubernetes) comme une unité déployable distincte.
Une meilleure pratique consiste à stocker les définitions d'infrastructure dans le même dépôt que le code de service. Un pipeline Azure peut avoir une étape séparée qui fonctionne ou avant de déployer l'application. Cela garantit que l'environnement est fourni exactement comme prévu. Utilisez Azure Key Vault pour stocker des secrets comme les chaînes de connexion de base de données et les tirer au moment du déploiement.
Azure DevOps propose également des règles de protection de l'environnement, comme des serrures exclusives, pour empêcher les déploiements simultanés dans le même environnement – critique lorsque de nombreux services partagent une infrastructure de production.
Conteneurisation et orchestre
Les conteneurs sont un ajustement naturel pour les microservices, fournissant des runtimes cohérents à travers les environnements. Azure DevOps pipelines peuvent construire des images Docker, les pousser à Azure Container Registry (ACR), et les déployer à Azure Kubernetes Service (AKS) ou d'autres orchestres.
Exemple de tâche de construction et de poussée de Docker dans YAML:
- task: Docker@2 displayName: Build and push Docker image inputs: containerRegistry: 'ACR Service Connection' repository: 'my-user-service' command: buildAndPush Dockerfile: '**/Dockerfile' tags: | $(Build.BuildId) latest
Dans une étape ultérieure, les manifestes Helm ou Kubernetes sont appliqués en utilisant la tâche Azure Kubernetes Service. Utilisez Helm pour les déploiements paramétrés, permettant différentes configurations par environnement (p. ex., nombre de répliques, limites de ressources).
Azure Pipelines peut également gérer des secrets pour des applications conteneurisées en injectant des variables d'environnement de Key Vault au moment du déploiement, évitant ainsi les identifiants codés en dur dans les images Docker.
Sécurité et gestion des secrets
Les pipelines de CD de Microservices doivent gérer des informations sensibles telles que les clés API, les chaînes de connexion et les certificats. Azure DevOps s'intègre à Azure Key Vault pour stocker et récupérer des secrets en toute sécurité. Utilisez les groupes de variables de bibliothèque liés à Key Vault : le pipeline récupère des secrets à l'exécution et les injecte comme variables d'environnement ou les monte dans des secrets Kubernetes.
Azure DevOps offre également des connexions de service pour gérer l'authentification aux services externes (ACR, AKS, Azure Resource Manager). Ces connexions utilisent les principaux de service AD Azure ou les identités gérées, éliminant ainsi le besoin de références statiques dans les définitions de pipelines.
Le contrôle d'accès basé sur le rôle (RBC) au sein de Azure DevOps garantit que seules les équipes autorisées peuvent modifier des pipelines ou approuver des déploiements de production. Combinez ceci avec les politiques de la succursale pour faire respecter que les examens de code se produisent avant que l'IC/CD ne déclenche.
Loops de suivi et de rétroaction
Azure DevOps s'intègre à Azure Monitor et Application Insights pour collecter des données, des journaux et des traces. Vous pouvez configurer des barrières post-déploiement qui vérifient la santé des applications avant de déclarer une libération réussie.
Par exemple, un pipeline peut appeler l'API Application Insights pour vérifier que le taux d'erreur reste en dessous d'un seuil pour une période donnée. Si la barrière échoue, la libération est automatiquement retournée. Dans Azure Pipelines, les barrières sont définies dans le travail de déploiement d'une étape :
- stage: Deploy jobs: - deployment: Production environment: 'Production' strategy: runOnce: deploy: steps: - script: kubectl apply -f deploy.yaml on: failure: steps: - script: kubectl rollout undo deployment/my-service postDeploySteps: - task: QueryAzureMonitorAlerts@1 inputs: connectedServiceNameARM: 'Azure subscription' ResourceGroupName: 'my-rg' SeverityFilter: 'Sev0,Sev1' TimeRange: 5
De plus, intégrer avec les cartes Azure : si un feu d'alerte de surveillance, un élément de travail peut être automatiquement créé, reliant l'incident à la libération qui l'a causé.
Avantages et pratiques exemplaires
La mise en œuvre de la prestation continue de microservices avec Azure DevOps apporte des avantages mesurables:
- Les pipelines automatisés réduisent l'effort manuel et permettent des rejets de services parallèles.
- Risque réduit :[ Des changements plus petits et progressifs avec des capacités de test automatisé et de renversement minimisent l'impact de la défaillance.
- Scalabilité: Azure DevOps peut gérer des centaines de pipelines dans de nombreux services et environnements.
- Plateforme unifiée:[Le contrôle des sources, le CI/CD, les essais et la surveillance sont intégrés, assurant une traçabilité de bout en bout.
Pour tirer le meilleur parti des Azure DevOps pour les microservices, suivez ces meilleures pratiques :
- Garder les pipelines rapidement: Utilisez la mise en cache, l'exécution conditionnelle et les travaux parallèles pour éviter les longs temps de construction.
- Normez les modèles : Utilisez les modèles YAML pour partager les étapes communes de construction et de déploiement entre les services, réduisant ainsi le double emploi et l'incohérence.
- Embrace infrastructure comme code:[ Toujours fournir des environnements automatiquement à partir du code, pas manuellement.
- Utilisez des créneaux de déploiement ou des déploiements canari:[ Testez de nouvelles versions avant le déploiement complet et gardez la possibilité de revenir instantanément.
- Surveillez tout : Intégrez les contrôles de santé, les registres et les mesures de performance dans vos pipelines pour attraper les problèmes tôt.
- Secrets de sécurité:[ Ne jamais stocker de secrets dans le code source; utiliser Key Vault et les groupes variables.
Conclusion
Azure DevOps offre une plateforme complète et flexible pour la mise en œuvre de la prestation continue dans les architectures de microservices. En combinant le contrôle de version, les pipelines automatisés, les stratégies de déploiement, l'automatisation de l'infrastructure et la surveillance, les équipes peuvent obtenir des versions rapides, fiables et sûres pour chaque service indépendamment. La clé est d'adapter les services Azure DevOps à vos modèles architecturaux spécifiques – que vous utilisiez des conteneurs, des fonctions sans serveur ou des machines virtuelles. Commencez par un seul pipeline de service, puis le répliquer et le personnaliser pour d'autres, en itérant sur les commentaires pour améliorer continuellement votre processus de livraison.