Exercice - Créer une action GitHub pour déployer sur AKS

Effectué

Dans cet exercice, vous allez effectuer les tâches suivantes :

  • Améliorez l’action GitHub existante pour inclure une tâche de déploiement.
  • Vérifier que les changements se déploient sur le cluster Azure Kubernetes Service (AKS).
  • Restaurer le déploiement.

Mettre à jour le manifeste Kubernetes pour le service de produit

Pour déployer de nouvelles versions du service de produit eShop, modifiez le fichier product.yml pour qu’il pointe vers le registre ACR (Azure Container Registry) que vous avez utilisé dans l’unité précédente.

  1. Dans votre dépôt dupliqué, sélectionnez code tab, puis le fichier product.yml.

  2. Pour modifier le fichier, sélectionnez l’icône d’édition (crayon).

  3. Modifiez la ligne :

    containers:
      - image: [replace with your ACR name].azurecr.io/productservice:latest
    

    remplacez [replace with your ACR name] par le nom de votre ACR ; par exemple, acseshop186748394.

  4. En haut à droite, sélectionnez Valider les modifications... puis, dans la boîte de dialogue, sélectionnez Valider les modifications.

Créer l'action de déploiement

Le code YAML ajoute une étape GitHub qui :

dispose d’une étape qui déploie de nouvelles images. Voici les étapes d’un exécuteur ubuntu-latest :

  1. extrait le référentiel dans lequel se trouve ce fichier.
  2. Azure Login se connecte à Azure avec les informations d’identification du principal de service.
  3. Configurer kubelogin pour la connexion non interactive configure le fichier kubeconfig pour l’authentification Azure.
  4. Obtenir le contexte K8s définit les informations d’identification Azure Kubernetes Service (AKS) dans le fichier .kube/config de l’exécuteur.
  5. Déployer l’application déploie l’application sur AKS à l’aide de l’image générée à l’étape précédente et du fichier manifeste Kubernetes que vous avez modifié précédemment.

Effectuez les étapes suivantes pour créer une action GitHub qui déploie le service de coupons :

  1. Dans votre référentiel dupliqué, dans le code tab, sélectionnez l’onglet .github/workflows.

  2. Sélectionnez azure-kubernetes-service.yml.

  3. Pour modifier le fichier, sélectionnez l’icône d’édition (crayon).

  4. En bas du fichier, collez le code YAML suivant dans l’éditeur :

    
      deploy:
        permissions:
          actions: read
          contents: read
          id-token: write
        runs-on: ubuntu-latest
        needs: [buildImage]
        steps:
          # Checks out the repository this file is in
          - uses: actions/checkout@v3
    
          # Logs in with your Azure credentials
          - name: Azure login
            uses: azure/login@v1.4.6
            with:
              creds: '${{ secrets.AZURE_CREDENTIALS }}'
    
          # Use kubelogin to configure your kubeconfig for Azure auth
          - name: Set up kubelogin for non-interactive login
            uses: azure/use-kubelogin@v1
            with:
              kubelogin-version: 'v0.0.25'
    
          # Retrieves your Azure Kubernetes Service cluster's kubeconfig file
          - name: Get K8s context
            uses: azure/aks-set-context@v3
            with:
              resource-group: ${{ env.RESOURCE_GROUP }}
              cluster-name: ${{ env.CLUSTER_NAME }}
              admin: 'false'
              use-kubelogin: 'true'
    
          # Deploys application based on given manifest file
          - name: Deploys application
            uses: Azure/k8s-deploy@v4
            with:
              action: deploy
              manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
              images: |
                ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
              pull-images: false
    
    
  5. En haut à droite, sélectionnez Commiter les modifications..., puis dans la boîte de dialogue, sélectionnez Commiter les modifications.

Déclencher un déploiement

La mise à jour du fichier azure-kubernetes-service.yml et la validation des modifications déclenche automatiquement un autre déploiement. Découvrez maintenant comment apporter une modification de code déclenche un autre déploiement.

Vous avez un nouveau produit que votre équipe marketing souhaite ajouter au catalogue.

  1. Dans votre référentiel dupliqué, dans le fichier code tab, sélectionnez le dossier Products.

  2. Sélectionnez le dossier Data.

  3. Sélectionnez le fichier ProductDataContext.c.

  4. Pour modifier le fichier, sélectionnez l’icône d’édition (crayon).

  5. En bas du fichier, ajoutez un nouveau produit au tableau Produits :

    new Product {  Name = "Camping Tent 2", Description = "This updated tent is improved and cheaper, perfect for your next trip.", Price = 79.99m, ImageUrl = "product9.png" },
    
  6. En haut à droite, sélectionnez Valider les modifications... puis, dans la boîte de dialogue, sélectionnez Valider les modifications.

Surveillance du déploiement

  1. Pour monitorer la progression du déploiement, sélectionnez l’onglet Actions.

  2. Sélectionnez l'exécution la plus récente répertoriée pour le workflow Build and deploy an app to AKS. Le nom de l’exécution est le message de commit utilisé à l’étape précédente.

  3. Sélectionnez la tâche deploy pour afficher les détails de cette exécution de flux de travail.

    Screenshot that shows the deploy job selected with a list of all the steps.

  4. Dans le terminal, exécutez la commande suivante pour monitorer les pods du service de coupons dans votre cluster AKS. L’indicateur --selector filtre la liste uniquement sur les pods du service de coupons, et l’indicateur --watch indique à kubectl de surveiller les changements.

    kubectl get pods --selector=app=productservice --watch
    

    Pendant le déploiement, une variante de la sortie suivante s’affiche :

    NAME                             READY   STATUS    RESTARTS   AGE
    productservice-7979d4c47-xlcrr   1/1     Running   0          17m
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     ContainerCreating   0          0s
    productservice-ff98b6d8d-7wmsh   1/1     Running             0          4s
    productservice-7979d4c47-xlcrr   1/1     Terminating         0          19m
    

    Dans la sortie précédente, notez qu’un nouveau pod productservice est créé. Quand le nouveau pod est prêt, l’ancien est mis hors service. Grâce à ce processus, la transition vers la nouvelle version est relativement fluide.

Vérifier l’application

Effectuez les étapes suivantes pour vérifier que votre application fonctionne toujours :

  • Affichez l’eShop déployé en exécutant cette commande dans le terminal :

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    La commande ci-dessus retourne l’adresse IP externe de l’application web. Maintenez la touche CTRL enfoncée et sélectionnez le lien pour ouvrir l’application dans un nouvel onglet.

Accédez à la page des produits pour afficher la nouvelle tente répertoriée en bas de la page.

Restaurer le déploiement

En cas de problème de production, l’atténuation courante est de rétablir un déploiement connu qui fonctionne. Kubernetes gère un historique de déploiement que vous pouvez utiliser pour restaurer une version précédente de votre application.

Dans votre terminal, exécutez cette commande pour supprimer la nouvelle tente que vous venez d’ajouter au site web :

kubectl rollout undo deployment/productservice

Ce message de console doit s’afficher :

deployment.apps/productservice rolled back

Actualisez la page des produits dans votre navigateur, et la nouvelle tente ne doit plus être répertoriée.

Remarque

Dans un scénario réel, vous déployez les artefacts de build dans plusieurs environnements. Par exemple, vous disposerez peut-être d'environnements de développement, de test et de préparation. Vous pouvez déclencher des workflows de déploiement en fonction d’événements comme la fusion des PR. Vous pouvez ajouter des portes d’approbation, comme l’approbation des PR par une partie prenante, pour éviter les déploiements inattendus en production.

Contrôle de vos connaissances

1.

Quel est le meilleur endroit pour stocker des informations sensibles, comme des informations d’identification, pour GitHub Actions ?

2.

Pourquoi créer un principal de service Azure Active Directory à l’usage de GitHub Actions ?

3.

Pendant le déploiement d’une mise à niveau, pourquoi AKS crée-t-il un conteneur alors que l’ancien est toujours en cours d’exécution ?