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
- Compte Azure avec un abonnement actif. Créez un compte gratuitement.
- Un compte GitHub. Créez un compte GitHub gratuit si vous n’en avez pas déjà un.
- Azure Container Registry avec des privilèges d’envoi. Créez une instance Azure Container Registry si vous n’en avez pas déjà une.
- Un cluster Kubernetes. Déployer un cluster Azure Kubernetes Service (AKS).
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.
- 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
- ./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.
- deployment.yml : contient la spécification de la charge de travail de déploiement
- ./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
- Accédez à Paramètres du projet>Pipelines>Connexions de service dans le menu Azure DevOps.
- Créez une Connexion de service de registre Docker associée à votre registre de conteneurs. Nommez-le azure-pipelines-canary-k8s.
- 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
Accédez à Pipelines>Créer un pipeline, puis sélectionnez votre dépôt.
Sous l’onglet Configurer, choisissez Pipeline de démarrage.
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 surexample.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.
Accédez à Pipelines>Environnements>Créer un environnement.
Créez un environnement.
- Nom : akscanary
- Ressource : choisissez Kubernetes.
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.
Sélectionnez Valider et créer.
Accédez à Pipelines. Sélectionnez le pipeline que vous avez créé, puis Modifier.
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
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/*
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.
Accédez à Pipelines>Environnements>Nouvel environnement.
Configurez le nouvel environnement.
- Nom : akspromote
- Ressource : choisissez Kubernetes.
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.
Sélectionnez Valider et créer.
Sélectionnez votre nouvel environnement
akspromote
dans la liste des environnements.Sélectionnez Approbations et vérifications>Approbations. Sélectionnez ensuite l’icône de sélection (les trois points).
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.
Sélectionnez Create (Créer).
Accédez à Pipelines, puis sélectionnez le pipeline que vous avez créé. Sélectionnez ensuite Modifier.
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)'
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/*'
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 :
- Dans app/app.py, remplacez
success_rate = 5
parsuccess_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 phaseDeployCanary
. - Étant donné que vous avez configuré une approbation sur l’environnement
akspromote
, la version attend avant d’exécuter cette étape. - 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
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
Dans un navigateur, ouvrez l’URL suivante.
http://localhost:3000/login
Lorsque vous êtes invité à entrer des informations d’identification, sauf si la valeur
adminPassword
a été remplacée lors de l’installation du graphique Helmprometheus-operator
, vous pouvez utiliser les valeurs suivantes :- Nom d’utilisateur : admin
- password: prom-operator
Dans le menu de gauche, choisissez +>Tableau de bord>Graph.
Sélectionnez n’importe quel endroit du panneau qui vient d’être ajouté, puis tapez
e
pour modifier le panneau.Sous l’onglet Métriques, entrez la requête suivante :
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Sous l’onglet Général, remplacez le nom de ce panneau par Tous les pods sampleapp.
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.
Pour enregistrer ce panneau, sélectionnez l’icône Enregistrer dans la barre de vue d’ensemble.
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éploiementsampleapp-baseline
) et canary (à partir du déploiementsampleapp-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
À ce stade, la phase Déployer canary s’est terminée (changement de
success_rate
de10
à20
). La phase Promouvoir/rejeter canary attend une intervention manuelle. Vous pouvez maintenant comparer le taux de réussite (déterminé parcustom_status=good
) des variantes de référence et canary dans le tableau de bord Grafana. Celui-ci doit se présenter comme suit :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.