Générer et déployer sur Azure Kubernetes Service avec Azure Pipelines

Azure DevOps Services

Utilisez Azure Pipelines pour déployer automatiquement sur Azure Kubernetes Service (AKS). Azure Pipelines vous permet de créer, tester et déployer avec l’intégration continue (CI) et la livraison continue (CD) à l’aide d’Azure DevOps.

Dans cet article, vous allez apprendre à créer un pipeline qui génère et déploie en continu votre application. Chaque fois que vous modifiez votre code dans un dépôt contenant un Dockerfile, les images sont envoyées (push) à votre registre de conteneurs Azure, puis les manifestes sont déployés sur votre cluster AKS.

Prérequis

Obtenir le code

Dupliquez (fork) le dépôt suivant contenant un exemple d’application et un Dockerfile :

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Création de ressources Azure

Connectez-vous au portail Azure, puis sélectionnez le bouton Cloud Shell dans le coin supérieur droit. Utilisez Azure CLI ou PowerShell pour créer un cluster AKS.

Créer un registre de conteneur

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Se connecter à Azure Pipelines

Connectez-vous à Azure Pipelines. Une fois que vous êtes connecté, votre navigateur accède à https://dev.azure.com/my-organization-name et affiche votre tableau de bord Azure DevOps.

Dans votre organisation sélectionnée, créez un projet. Si votre organisation ne compte aucun projet, l’écran Pour commencer, créez un projet s’affiche. Dans le cas contraire, sélectionnez le bouton Créer un project dans l’angle supérieur droit du tableau de bord.

Créer le pipeline

Connecter et sélectionner votre dépôt

  1. Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.

  2. Accédez à Pipelines, puis sélectionnez Nouveau pipeline.

  3. Effectuez les étapes de l’Assistant en sélectionnant d’abord GitHub comme emplacement du code source.

  4. Vous serez peut-être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub.

  5. Quand la liste des dépôts s’affiche, sélectionnez le vôtre.

  6. Vous serez peut-être redirigé vers GitHub pour pouvoir installer l’application Azure Pipelines. Si c’est le cas, sélectionnez Approuver & installer.

  7. Sélectionnez Déployer sur Azure Kubernetes Service.

  8. Si vous y êtes invité, sélectionnez l’abonnement dans lequel vous avez créé votre registre et votre cluster.

  9. Sélectionnez le cluster myapp.

  10. Pour Espace de noms, sélectionnez Existant, puis Par défaut.

  11. Sélectionnez le nom de votre registre de conteneurs.

  12. Vous pouvez conserver le nom d’image par défaut.

  13. Définissez le port de service sur 8080.

  14. Définir la case à cocher Activer l’évaluation d’application pour les demandes de tirage pour que la configuration liée à l’évaluation d’application soit incluse dans le fichier YAML du pipeline généré automatiquement lors des étapes suivantes.

  15. Sélectionnez Valider et configurer.

    À mesure qu’Azure Pipelines crée votre pipeline, le processus va effectuer les opérations suivants :

    • Créer une connexion de service de registre Docker pour permettre à votre pipeline d’envoyer (push) des images à votre registre de conteneurs.

    • Créer un environnement et une ressource Kubernetes au sein de l’environnement. Pour un cluster avec RBAC activé, la ressource Kubernetes créée va implicitement créer des objets ServiceAccount et RoleBinding dans le cluster afin que le compte de service créé ne puisse pas effectuer d’opérations en dehors de l’espace de noms choisi.

    • Générer un fichier azure-pipelines.yml, qui définit votre pipeline.

    • Générer des fichiers manifeste Kubernetes. Ces fichiers sont générés en alimentant les modèles deployment.yml et service.yml en fonction des sélections que vous avez effectuées. Lorsque vous êtes prêt, sélectionnez Enregistrer et exécuter.

  16. Sélectionnez Enregistrer et exécuter.

  17. Vous pouvez remplacer le message de validation par un message qui invite à ajouter un pipeline à notre dépôt. Quand vous êtes prêt, sélectionnez Enregistrer et exécuter pour valider le nouveau pipeline dans votre dépôt, puis lancez la première exécution de votre nouveau pipeline.

Voir votre application se déployer

Regardez votre pipeline s’exécuter et observez la phase de génération, puis la phase de déploiement passer tour à tour de bleu (en cours d’exécution) à vert (terminé). Vous pouvez choisir durant quelles phases et tâches vous souhaitez regarder votre pipeline en action.

Notes

Si vous utilisez un agent hébergé par Microsoft, vous devez ajouter sa plage d’adresses IP à votre pare-feu. Obtenez la liste hebdomadaire des plages d’adresses IP à partir du fichier JSON hebdomadaire publié tous les mercredis. Les nouvelles plages d’adresses IP prennent effet le lundi suivant. Pour plus d’informations, consultez Agents hébergés par Microsoft. Pour trouver les plages d’adresses IP nécessaires à votre organisation Azure DevOps, découvrez comment identifier les plages d’adresses IP possibles pour les agents hébergés par Microsoft.

Une fois l’exécution du pipeline terminée, examinez ce qui s’est passé, puis observez votre application déployée. À partir du résumé du pipeline :

  1. Sélectionnez l’onglet Environnements.

  2. Sélectionnez Voir l’environnement.

  3. Sélectionnez l’instance de votre application pour l’espace de noms sur lequel vous l’avez déployée. Si vous avez utilisé la valeur par défaut, alors il s’agit de l’application myapp dans l’espace de noms par défaut.

  4. Sélectionnez l’onglet Services.

  5. Sélectionnez l’adresse IP externe et copiez-la dans votre Presse-papiers.

  6. Ouvrez un nouvel onglet de navigateur ou une nouvelle fenêtre, puis entrez l’<adresse IP>:8080.

Si vous générez notre exemple d’application, Hello World s’affiche dans votre navigateur.

Mode de génération du pipeline

Quand vous avez terminé de sélectionner les options, effectuez la validation et la configuration du pipeline créé par Azure Pipelines pour vous, à l’aide du modèle Déployer sur Azure Kubernetes Service.

La phase de génération utilise la tâche Docker pour générer et envoyer (push) l’image au registre de conteneurs Azure.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

La phase de déploiement utilise la tâche du manifeste Kubernetes pour créer le imagePullSecret que les nœuds de cluster Kubernetes exigent de tirer (pull) de la ressource Azure Container Registry. Les fichiers manifeste sont ensuite utilisés par la tâche du manifeste Kubernetes pour effectuer le déploiement sur le cluster Kubernetes. Les fichiers manifeste (service.yml et deployment.yml) ont été générés lorsque vous avez utilisé le modèle Déployer sur Azure Kubernetes Service.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Nettoyer les ressources

Chaque fois que vous avez terminé d’utiliser les ressources que vous avez créées, vous pouvez utiliser la commande suivante pour les supprimer :

az group delete --name myapp-rg

Entrez y à l’invite.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Utilisez Azure Pipelines pour déployer automatiquement sur Azure Kubernetes Service (AKS). Azure Pipelines vous permet de créer, tester et déployer avec l’intégration continue (CI) et la livraison continue (CD) à l’aide d’Azure DevOps.

Dans cet article, vous allez apprendre à créer un pipeline qui génère et déploie en continu votre application. Chaque fois que vous modifiez votre code dans un dépôt contenant un Dockerfile, les images sont envoyées (push) à votre registre de conteneurs Azure, puis les manifestes sont déployés sur votre cluster AKS.

Prérequis

Obtenir le code

Dupliquez (fork) le dépôt suivant contenant un exemple d’application et un Dockerfile :

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Création de ressources Azure

Connectez-vous au portail Azure, puis sélectionnez le bouton Cloud Shell dans le coin supérieur droit. Utilisez Azure CLI ou PowerShell pour créer un cluster AKS.

Créer un registre de conteneur

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

configurer l’authentification ;

Quand vous utilisez Azure Container Registry (ACR) avec Azure Kubernetes Service (AKS), vous devez établir un mécanisme d’authentification. Vous pouvez le faire de deux manières :

  1. Accorder à AKS un accès à ACR. Consultez S’authentifier auprès d’Azure Container Registry à partir d’Azure Kubernetes Service.

  2. Utilisez un secret d’extraction d’image Kubernetes. Vous pouvez créer un secret d’extraction d’image à l’aide de la tâche de déploiement Kubernetes.

Créer un pipeline de mise en production

Le pipeline de build utilisé pour configurer l’intégration continue (CI) a déjà généré une image Docker et l’a envoyée (push) à un registre de conteneurs Azure. Il a également empaqueté et publié un chart Helm sous forme d’artefact. Dans le pipeline de mise en production, nous allons déployer l’image conteneur sous forme d’application Helm sur le cluster AKS.

  1. Dans Azure Pipelines, ouvrez le résumé de votre build.

  2. Dans le résumé de la build, choisissez l’icône Mise en production pour démarrer un nouveau pipeline de mise en production.

    Si vous avez déjà créé un pipeline de mise en production qui utilise ces artefacts de build, vous êtes plutôt être invité à créer une mise en production. Dans ce cas, accédez à la page Mises en production et démarrez un nouveau pipeline de mise en production en choisissant l’icône +.

  3. Sélectionnez le modèle Tâche vide.

  4. Ouvrez la page Tâches et sélectionnez Travail de l’Agent.

  5. Choisissez + pour ajouter une nouvelle tâche et ajoutez une tâche Programme d’installation de l’outil Helm. Ainsi, Helm et Kubectl seront bien installés sur l’agent qui va exécuter les tâches ultérieures.

  6. Choisissez encore + et ajoutez une tâche Créer des packages de charts Helm et les déployer. Configurez les paramètres de cette tâche comme suit :

    • Type de connexion : Sélectionnez Azure Resource Manager pour vous connecter à un cluster AKS à l’aide d’une connexion de service Azure. Si vous voulez vous connecter à un cluster Kubernetes à l’aide de kubeconfig ou d’un compte de service, vous pouvez également sélectionner Connexion de service Kubernetes. Dans ce cas, vous avez besoin de créer et de sélectionner une connexion de service Kubernetes au lieu d’un abonnement Azure pour le paramètre suivant.

    • Abonnement Azure : Sélectionnez une connexion dans la liste figurant sous Connexions au service Azure disponibles, ou créez une connexion avec des autorisations plus limitées à votre abonnement Azure. Si vous voyez un bouton Autoriser en regard de l’entrée, utilisez-le pour autoriser la connexion à votre abonnement Azure. Si l’abonnement Azure nécessaire ne figure pas dans la liste des abonnements, consultez Créer une connexion de service Azure pour configurer manuellement la connexion.

    • Groupe de ressources : Entrez ou sélectionnez le groupe de ressources contenant votre cluster AKS.

    • Cluster Kubernetes : Entrez ou sélectionnez le cluster AKS que vous avez créé.

    • Commande : Sélectionnez init comme commande Helm. Cette commande installe Tiller sur votre cluster Kubernetes en cours d’exécution. Elle va aussi effectuer toute la configuration locale nécessaire. Cochez Utilisez le contrôle de validité de la version d’image pour installer la dernière préversion de Tiller. Vous pouvez également choisir de mettre à niveau Tiller, s’il est préinstallé, en cochant Mettre à niveau Tiller. Si ces options sont activées, la tâche exécute la commande helm init --canary-image --upgrade

  7. Choisissez + dans Travail de l’Agent et ajoutez une autre tâche Créer des packages de charts Helm et les déployer. Configurez les paramètres de cette tâche comme suit :

    • Cluster Kubernetes : Entrez ou sélectionnez le cluster AKS que vous avez créé.

    • Espace de noms : Entrez l’espace de noms de votre cluster Kubernetes dans lequel vous voulez déployer votre application. Kubernetes prend en charge plusieurs clusters virtuels soutenus par le même cluster physique. Ces clusters virtuels sont appelés espaces de noms. Vous pouvez utiliser des espaces de noms pour créer différents environnements, à savoir dev, test et préproduction, dans le même cluster.

    • Commande : Sélectionnez upgrade comme commande Helm. Vous pouvez exécuter n’importe quelle commande Helm à l’aide de cette tâche et passer des options de commande en tant qu’arguments. Quand vous sélectionnez la commande upgrade, la tâche présente d’autres champs :

      • Type de chart : Sélectionnez Chemin de fichier. Vous pouvez également spécifier un nom de chart si vous voulez spécifier une URL ou un nom de chart. Par exemple, si le nom du graphique est stable/mysql, la tâche exécute la commande helm upgrade stable/mysql

      • Chemin de chart : Il peut s’agir d’un chemin de chart empaqueté ou d’un chemin de répertoire de chart décompressé. Dans cet exemple, vous publiez le chart à l’aide d’une build CI. Vous devez donc sélectionner le package de fichiers à l’aide du sélecteur de fichiers ou entrer $(System.DefaultWorkingDirectory)/**/*.tgz

      • Nom de la mise en production : Entrez un nom pour votre mise en production, par exemple : azuredevops

      • Recréez les pods : Cochez cette case en cas de modification de la configuration pendant la mise en production et si vous voulez remplacer un pod en cours d’exécution par la nouvelle configuration.

      • Réinitialisez les valeurs : Cochez cette case si vous voulez que les valeurs intégrées dans le chart remplacent toutes les valeurs fournies par la tâche.

      • Forcer : Cochez cette case si, en cas de conflits, vous voulez effectuer une mise à niveau et une restauration pour supprimer, recréer la ressource et réinstaller la mise en production complète. Cette option s’avère utile dans les scénarios où l’application de correctifs peut échouer (par exemple, pour les services, car l’adresse IP du cluster est immuable).

      • Arguments : Entrez les arguments de la commande Helm et leurs valeurs. Pour cet exemple : --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) Consultez cette section pour obtenir la description de la raison pour laquelle nous utilisons ces arguments.

      • Activer TLS : Cochez cette case pour activer des connexions TLS fortes entre Helm et Tiller.

      • Certificat d’autorité de certification : Spécifiez un certificat d’autorité de certification à charger et à utiliser pour émettre des certificats pour le client Tiller et le client Helm.

      • Certificat : Spécifiez le certificat Tiller ou le certificat du client Helm.

      • Clé : Spécifiez la clé Tiller ou la clé du client Helm.

  8. Dans la page Variables du pipeline, ajoutez une variable nommée imageRepoName et définissez sa valeur sur le nom de votre dépôt d’images Helm. En règle générale, son format est le suivant : example.azurecr.io/coderepository

  9. Enregistrez le pipeline de mise en production.

Arguments utilisés dans la tâche de mise à niveau Helm

Dans le pipeline de build, l’image conteneur est marquée avec $(Build.BuildId) et elle est envoyée (push) à un registre de conteneurs Azure. Dans un chart Helm, vous pouvez paramétrer les détails de l’image conteneur, comme son nom et son étiquette, car le même chart peut être utilisé pour un déploiement sur différents environnements. Ces valeurs peuvent également être spécifiées dans le fichier values.yaml ou être remplacées par un fichier de valeurs fourni par l’utilisateur, qui peut à son tour être remplacé par des paramètres --set lors de l’installation ou de la mise à niveau de Helm.

Dans cet exemple, nous passons les arguments suivants :

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

La valeur de $(imageRepoName) a été définie dans la page Variables (ou la section variables de votre fichier YAML). Vous pouvez également la remplacer directement par le nom de votre dépôt d’images indiqué dans la valeur des arguments --set ou le fichier values.yaml. Par exemple :

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Une autre solution consiste à définir l’option Valeurs définies de la tâche pour spécifier les valeurs d’argument sous forme de paires clé-valeur séparées par des virgules.

Créer une mise en production pour déployer votre application

Vous êtes maintenant prêt à créer une mise en production, ce qui signifie que vous pouvez démarrer le processus d’exécution du pipeline de mise en production avec les artefacts produits par une build spécifique. Ces résultats dans le déploiement de la build :

  1. Choisissez + Mise en production et sélectionnez Créer une mise en production.

  2. Dans le panneau Créer une mise en production, vérifiez que la version d’artefact que vous voulez utiliser est sélectionnée et choisissez Créer.

  3. Choisissez le lien de mise en production dans le message de la barre d’informations. Par exemple : « Mise en production Mise en production-1 a été créée. »

  4. Dans la vue du pipeline, choisissez le lien d’état dans les phases du pipeline pour voir les journaux et la sortie de l’agent.