Share via


Tutoriel : Utiliser une stratégie de déploiement de contrôles de validité des déploiements Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Une stratégie de déploiement canary signifie déployer de nouvelles versions d’une application à côté de versions stables et de production. Vous pouvez ensuite voir comment la version canary se compare à la base de référence, avant de promouvoir ou de rejeter le déploiement.

Ce guide pas à pas explique comment utiliser la stratégie canary de la tâche de manifeste Kubernetes. Plus précisément, vous allez apprendre à configurer des déploiements canary pour Kubernetes et le workflow associé pour évaluer le code. Vous utilisez ensuite ce code pour comparer les déploiements de base de référence et d’applications canary, afin de pouvoir décider de promouvoir ou de rejeter le déploiement canary.

Si vous utilisez Azure Kubernetes Service, le type de connexion de service Azure Resource Manager est le meilleur moyen de vous connecter à un cluster privé ou à un cluster pour lequel les comptes locaux sont désactivés.

Prérequis

Exemple de code

Dupliquez le dépôt suivant sur GitHub.

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Voici une brève vue d’ensemble des fichiers du dépôt qui sont utilisés dans ce guide :

  • ./app :
    • app.py : serveur web simple basé sur Flask instrumenté à l’aide de la bibliothèque d’instrumentation Prometheus pour les applications Python. Un compteur personnalisé est configuré pour le nombre de réponses positives et incorrectes fournies, en fonction de la valeur de la variable success_rate.
    • Dockerfile : utilisé pour générer l’image avec chaque modification apportée à app.py. À chaque modification, le pipeline de build est déclenché et l’image est générée et envoyée au registre de conteneurs.
  • ./manifests :
    • deployment.yml : contient la spécification de la charge de travail de déploiement sampleapp correspondant à l’image publiée précédemment. Vous utilisez ce fichier manifeste non seulement pour la version stable de l’objet de déploiement, mais également pour dériver les variantes de base et canary des charges de travail.
    • service.yml : crée le service sampleapp. Ce service achemine les demandes vers les pods lancés par les déploiements (stables, de référence et canary) mentionnés précédemment.
  • ./misc
    • service-monitor.yml : utilisé pour configurer un objet ServiceMonitor. Cet objet configure le scraping des métriques Prometheus.
    • fortio-deploy.yml : utilisé pour configurer un déploiement fortio. Ce déploiement est ensuite utilisé comme outil de test de charge pour envoyer un flux de demandes au service sampleapp déployé précédemment. Le flux de requêtes envoyées à sampleapp est routé vers des pods dans les trois déploiements (stable, de référence et canary).

Notes

Dans ce guide, vous allez utiliser Prometheus pour l’instrumentation et la surveillance du code. Toute solution équivalente, comme Azure Application Insights, peut être utilisée comme alternative.

Installer prometheus-operator

Pour installer Prometheus sur votre cluster, utilisez la commande suivante à partir de votre ordinateur de développement. Kubectl et Helm doivent être installés, et vous devez définir le contexte sur le cluster sur lequel vous souhaitez effectuer le déploiement. Grafana, que vous utiliserez ultérieurement pour visualiser les métriques de base et de validité sur les tableaux de bord, est installé dans le cadre de ce graphique Helm.

Vous allez d’abord ajouter le référentiel Prometheus Community Kubernetes Helm Charts à votre installation Helm. Ensuite, vous allez installer la pile kube-prometheus, une collection de manifestes Kubernetes, des tableaux de bord Grafana et des règles Prometheus.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update # update local cache
helm install --name sampleapp  prometheus-community/kube-prometheus-stack

Création de connexions de service

  1. Accédez à Paramètres du projet>Pipelines>Connexions de service dans le menu Azure DevOps.
  2. Créez une Connexion de service de registre Docker associée à votre registre de conteneurs. Nommez-le azure-pipelines-canary-k8s.
  3. Créez une Connexion de service Kubernetes pour le cluster et l’espace de noms Kubernetes sur lesquels vous souhaitez effectuer le déploiement. Nommez-le azure-pipelines-canary-k8s.

Notes

Si vous utilisez Azure Kubernetes Service, le type de connexion de service Azure Resource Manager est le meilleur moyen de vous connecter à un cluster privé ou à un cluster pour lequel les comptes locaux sont désactivés.

Configurer l’intégration continue

  1. Accédez à Pipelines>Créer un pipeline, puis sélectionnez votre dépôt.

  2. Sous l’onglet Configurer, choisissez Pipeline de démarrage.

  3. Sous l’onglet Révision, remplacez le pipeline YAML par ce code.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
    
    steps:
    - task: Docker@2
      displayName: Build and push image
      inputs:
        containerRegistry: azure-pipelines-canary-k8s #replace with name of your Docker registry service connection
        repository: $(imageName)
        command: buildAndPush
        Dockerfile: app/Dockerfile
        tags: |
          $(Build.BuildId)
    

    Si la connexion au service de Registre Docker que vous avez créée est associée à example.azurecr.io, l’image est sur example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId), conformément à la configuration précédente.

Modifier le fichier manifeste

Dans manifests/deployment.yml, remplacez <example> par l’URL de votre registre de conteneurs. Par exemple, après remplacement, le champ d’image doit ressembler à contosodemo.azurecr.io/azure-pipelines-canary-k8s.

Configurer un déploiement continu

Les sections suivantes fournissent des étapes pour configurer le déploiement continu, notamment comment déployer la phase canary et comment promouvoir ou rejeter le canary par le biais d’une intervention manuelle.

Phase de déploiement de canary

Vous pouvez effectuer un déploiement avec YAML ou Classic.

  1. Accédez à Pipelines>Environnements>Créer un environnement.

  2. Créez un environnement.

    • Nom : akscanary
    • Ressource : choisissez Kubernetes.
  3. Sélectionnez Suivant, puis configurez votre ressource Kubernetes comme suit :

    • Fournisseur : Azure Kubernetes Service
    • Abonnement Azure : choisissez l’abonnement qui contient votre cluster Kubernetes.
    • Cluster : choisissez votre cluster.
    • Espace de noms : créez un espace de noms nommé canarydemo.
  4. Sélectionnez Valider et créer.

  5. Accédez à Pipelines. Sélectionnez le pipeline que vous avez créé, puis Modifier.

  6. Modifiez l’étape que vous avez créée précédemment pour utiliser maintenant une phase. Ajoutez deux étapes supplémentaires pour copier les manifestes et les répertoires misc en tant qu’artefacts à utiliser par des phases consécutives. Vous pouvez également déplacer quelques valeurs vers des variables pour faciliter leur utilisation plus tard dans votre pipeline. Votre YAML complet devrait maintenant ressembler à ceci.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      imageName: azure-pipelines-canary-k8s
      dockerRegistryServiceConnection: dockerRegistryServiceConnectionName #replace with name of your Docker registry service connection
      imageRepository: 'azure-pipelines-canary-k8s'
      containerRegistry: example.azurecr.io #replace with the name of your container registry, Should be in the format example.azurecr.io
      tag: '$(Build.BuildId)'
    
    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: ubuntu-latest
        steps:
        - task: Docker@2
          displayName: Build and push image
          inputs:
            containerRegistry: $(dockerRegistryServiceConnection)
            repository: $(imageName)
            command: buildAndPush
            Dockerfile: app/Dockerfile
            tags: |
              $(tag)
    
        - publish: manifests
          artifact: manifests
    
        - publish: misc
          artifact: misc
    
  7. Ajoutez une phase à la fin de votre fichier YAML pour déployer la version canary.

    - stage: DeployCanary
      displayName: Deploy canary
      dependsOn: Build
      condition: succeeded()
    
      jobs:
      - deployment: Deploycanary
        displayName: Deploy canary
        pool:
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:
              - task: KubernetesManifest@0
                displayName: Create imagePullSecret
                inputs:
                  action: createSecret
                  secretName: azure-pipelines-canary-k8s
                  dockerRegistryEndpoint: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy to Kubernetes cluster
                inputs:
                  action: 'deploy'
                  strategy: 'canary'
                  percentage: '25'
                  manifests: |
                    $(Pipeline.Workspace)/manifests/deployment.yml
                    $(Pipeline.Workspace)/manifests/service.yml
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: azure-pipelines-canary-k8s
    
              - task: KubernetesManifest@0
                displayName: Deploy Forbio and ServiceMonitor
                inputs:
                  action: 'deploy'
                  manifests: |
                    $(Pipeline.Workspace)/misc/*
    
  8. Enregistrez votre pipeline en validant directement dans la branche main. Cette validation devrait déjà exécuter votre pipeline avec succès.

Intervention manuelle pour promouvoir ou rejeter canary

Vous pouvez intervenir manuellement avec YAML ou Classic.

  1. Accédez à Pipelines>Environnements>Nouvel environnement.

  2. Configurez le nouvel environnement.

    • Nom : akspromote
    • Ressource : choisissez Kubernetes.
  3. Sélectionnez Suivant, puis configurez votre ressource Kubernetes comme suit :

    • Fournisseur : Azure Kubernetes Service
    • Abonnement Azure : choisissez l’abonnement qui contient votre cluster Kubernetes.
    • Cluster : choisissez votre cluster.
    • Espace de noms : choisissez l’espace de noms canarydemo que vous avez créé précédemment.
  4. Sélectionnez Valider et créer.

  5. Sélectionnez votre nouvel environnement akspromote dans la liste des environnements.

  6. Sélectionnez Approbations et vérifications>Approbations. Sélectionnez ensuite l’icône de sélection (les trois points).

  7. Configurez votre approbation comme suit :

    • Approbateurs : ajoutez votre propre compte d’utilisateur.
    • Avancé : vérifiez que la zone Autoriser les approbateurs à approuver leurs propres exécutions est cochée.
  8. Sélectionnez Create (Créer).

  9. Accédez à Pipelines, puis sélectionnez le pipeline que vous avez créé. Sélectionnez ensuite Modifier.

  10. Ajoutez une autre phase, PromoteRejectCanary, à la fin de votre fichier YAML, pour promouvoir les modifications.

    - stage: PromoteRejectCanary
      displayName: Promote or Reject canary
      dependsOn: DeployCanary
      condition: succeeded()
    
      jobs:
      - deployment: PromoteCanary
        displayName: Promote Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akspromote.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: promote canary
                inputs:
                  action: 'promote'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
                  containers: '$(containerRegistry)/$(imageRepository):$(tag)'
                  imagePullSecrets: '$(imagePullSecret)'
    
  11. Ajoutez une autre phase, RejectCanary, à la fin de votre fichier YAML, pour restaurer les modifications.

    - stage: RejectCanary
      displayName: Reject canary
      dependsOn: PromoteRejectCanary
      condition: failed()
    
      jobs:
      - deployment: RejectCanary
        displayName: Reject Canary
        pool: 
          vmImage: ubuntu-latest
        environment: 'akscanary.canarydemo'
        strategy:
          runOnce:
            deploy:
              steps:            
              - task: KubernetesManifest@0
                displayName: reject canary
                inputs:
                  action: 'reject'
                  strategy: 'canary'
                  manifests: '$(Pipeline.Workspace)/manifests/*'
    
  12. Enregistrez votre pipeline YAML en sélectionnant Enregistrer, puis validez-le directement dans la branche main.

Déployer une version stable

Vous pouvez déployer une version stable avec YAML ou Classic.

Pour la première exécution du pipeline, la version stable des charges de travail et leurs versions de base ou de validité n’existent pas dans le cluster. Pour déployer la version stable :

  1. Dans app/app.py, remplacez success_rate = 5 par success_rate = 10. Cette modification déclenche le pipeline, ce qui entraîne une build et un envoi de l’image vers le registre de conteneurs. Cela déclenche également la phase DeployCanary.
  2. Étant donné que vous avez configuré une approbation sur l’environnement akspromote, la mise en production attend avant d’exécuter cette phase.
  3. Dans le résumé de l’exécution, sélectionnez Vérifier>Approuver. Cette opération déploie la version stable des charges de travail (le déploiement sampleapp dans manifests/deployment.yml) sur l’espace de noms.

Lancer le workflow canary

La version stable de la charge de travail sampleapp existe maintenant dans le cluster. Ensuite, apportez la modification suivante à l’application de simulation :

Dans app/app.py, remplacez success_rate = 10 par success_rate = 20.

Cette modification déclenche le pipeline de build, ce qui entraîne la build et l’envoi de l’image au registre de conteneurs. Ce processus déclenche à son tour le pipeline de mise en production et commence la phase Déployer canary.

Simuler des requêtes

Sur votre ordinateur de développement, exécutez les commandes suivantes et continuez à les exécuter pour envoyer un flux constant de requêtes au service sampleapp. sampleapp achemine les requêtes vers les pods lancés par le déploiement stable sampleapp, et vers les pods lancés par les déploiements sampleapp-baseline et sampleapp-canary. Le sélecteur spécifié pour sampleapp s’applique à tous ces pods.

FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
kubectl exec -it $FORTIO_POD -c fortio /usr/bin/fortio -- load -allow-initial-errors -t 0 http://sampleapp:8080/

Configurer le tableau de bord Grafana

  1. Exécutez la commande de transfert de port suivante sur votre ordinateur de développement local pour pouvoir accéder à Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. Dans un navigateur, ouvrez l’URL suivante.

    http://localhost:3000/login
    
  3. Lorsque vous êtes invité à entrer des informations d’identification, sauf si la valeur adminPassword a été remplacée lors de l’installation du graphique Helm prometheus-operator, vous pouvez utiliser les valeurs suivantes :

    • Nom d’utilisateur : admin
    • password: prom-operator
  4. Dans le menu de gauche, choisissez +>Tableau de bord>Graph.

  5. Sélectionnez n’importe quel endroit du panneau qui vient d’être ajouté, puis tapez e pour modifier le panneau.

  6. Sous l’onglet Métriques, entrez la requête suivante :

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Sous l’onglet Général, remplacez le nom de ce panneau par Tous les pods sampleapp.

  8. Dans la barre de vue d’ensemble située en haut de la page, remplacez la plage de durée par 5 dernières minutes ou 15 dernières minutes.

  9. Pour enregistrer ce panneau, sélectionnez l’icône Enregistrer dans la barre de vue d’ensemble.

  10. Le panneau précédent visualise les métriques de taux de réussite de toutes les variantes. Il s’agit notamment de stable (à partir du déploiement sampleapp), de référence (à partir du déploiement sampleapp-baseline) et canary (à partir du déploiement sampleapp-canary). Vous pouvez visualiser uniquement les métriques de référence et canary en ajoutant un autre panneau, avec la configuration suivante :

    • Sous l’onglet Général, pour Titre, sélectionnez Base de référence d’application sampleapp et canary.
    • Sous l’onglet Métriques, utilisez la requête suivante :
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Notes

    Le panneau pour les métriques de référence et canary n’aura de métriques disponibles pour la comparaison que dans certaines conditions. Ces conditions sont lorsque la phase Déployer canary est terminée avec succès et que la phase Promouvoir/rejeter canary attend une intervention manuelle.

    Conseil

    Configurez des annotations pour les tableaux de bord Grafana afin de représenter visuellement les événements d’achèvement de phase pour Déployer canary et Promouvoir/rejeter canary. Cela est utile afin que vous sachiez quand commencer à comparer la référence avec le canary, et quand la promotion ou le rejet du canary se termine, respectivement.

Comparer la référence et canary

  1. À ce stade, la phase Déployer canary s’est terminée (changement de success_rate de 10 à 20). La phase Promouvoir/rejeter canary attend une intervention manuelle. Vous pouvez maintenant comparer le taux de réussite (déterminé par custom_status=good) des variantes de référence et canary dans le tableau de bord Grafana. Celui-ci doit se présenter comme suit :

    Screenshot that shows a comparison of baseline and canary metrics.

  2. Sur la base de l’observation que le taux de réussite est plus élevé pour canary, promouvez le canary. Sélectionnez Reprendre dans la tâche d’intervention manuelle.