Oefening: een GitHub-actie maken om te implementeren in AKS

Voltooid

In deze oefening voert u de volgende taken uit:

  • Verbeter de bestaande GitHub-actie om een implementatietaak op te nemen.
  • Controleer of de wijzigingen worden geïmplementeerd in het AKS-cluster (Azure Kubernetes Service).
  • De implementatie terugdraaien.

Het Kubernetes-manifest voor de productservice bijwerken

Als u nieuwe versies van de eShop-productservice wilt implementeren, bewerkt u het product.yml-bestand om te verwijzen naar de Azure Container Registry (ACR) die u in de vorige les hebt gebruikt.

  1. Selecteer in de geforkte opslagplaats de code taben selecteer vervolgens het product.yml-bestand.

  2. Als u het bestand wilt bewerken, selecteert u het bewerkingspictogram (potlood).

  3. Bewerk de regel:

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

    Vervang de [replace with your ACR name] door de naam van uw ACR; bijvoorbeeld acseshop186748394.

  4. Selecteer rechtsboven Wijzigingen doorvoeren... en selecteer vervolgens in het dialoogvenster Wijzigingen doorvoeren.

De implementatieactie maken

De YAML-code voegt een GitHub-stap toe die:

Heeft één stap die nieuwe afbeeldingen uitvoert. Dit zijn de stappen in een ubuntu-latest-runner:

  1. Controleert de opslagplaats waarin dit bestand zich bevindt.
  2. Azure Login meldt zich aan bij Azure met de referenties van de service-principal.
  3. Kubelogin instellen voor niet-interactieve aanmelding het kubeconfig-bestand configureert voor Azure-verificatie.
  4. K8s-context ophalen context instelt, worden de AKS-referenties (Azure Kubernetes Service) ingesteld in het .kube/config-bestand van de runner.
  5. Implementeert de toepassing de toepassing implementeert in AKS, met behulp van de installatiekopie die in de vorige stap is gebouwd en het Kubernetes-manifestbestand dat u eerder hebt bewerkt.

Voer de volgende stappen uit om een GitHub-actie te maken waarmee de couponservice wordt geïmplementeerd:

  1. Selecteer in de geforkte opslagplaats op de code tabhet tabblad .github/workflows.

  2. Selecteer azure-kubernetes-service.yml.

  3. Als u het bestand wilt bewerken, selecteert u het bewerkingspictogram (potlood).

  4. Plak onderaan het bestand de volgende YAML-code in de editor:

    
      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. Selecteer in de rechterbovenhoek Wijzigingen doorvoeren...en selecteer vervolgens in het dialoogvenster Wijzigingen doorvoeren.

Een implementatie activeren

Als u het azure-kubernetes-service.yml-bestand bijwerkt en de wijzigingen doorvoert, wordt automatisch een andere implementatie geactiveerd. Bekijk nu hoe het maken van een codewijziging een andere implementatie activeert.

U hebt een nieuw product dat uw marketingteam aan de catalogus wil toevoegen.

  1. Selecteer in de geforkte opslagplaats op het code tabde map Products.

  2. Selecteer de map Data.

  3. Selecteer het bestand ProductDataContext.c.

  4. Als u het bestand wilt bewerken, selecteert u het bewerkingspictogram (potlood).

  5. Voeg onderaan het bestand een nieuw product toe aan de producten matrix:

    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. Selecteer in de rechterbovenhoek Wijzigingen doorvoeren... selecteer vervolgens in het dialoogvenster Wijzigingen doorvoeren.

De implementatie bewaken

  1. Als u de voortgang van de implementatie wilt controleren, selecteert u het tabblad Actions.

  2. Selecteer de meest recente werkstroomuitvoering die wordt vermeld voor de Build and deploy an app to AKS werkstroom. De naam van de uitvoering is het doorvoerbericht dat u in de vorige stap hebt gebruikt.

  3. Selecteer de deploy taak om details voor deze werkstroomuitvoering weer te geven.

    Schermopname van de implementatietaak die is geselecteerd met een lijst met alle stappen.

  4. Voer in de terminal de volgende opdracht uit om de couponservicepods in uw AKS-cluster te bewaken. Met de vlag --selector wordt de lijst gefilterd zodat alleen pods voor de couponservice worden weergegeven, en de vlag --watch geeft kubectl de opdracht om te controleren op wijzigingen.

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

    Tijdens de implementatie wordt een variatie van de volgende uitvoer weergegeven:

    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
    

    In de voorgaande uitvoer ziet u dat er een nieuwe productservice pod wordt gemaakt. Wanneer de nieuwe pod gereed is, wordt de oude beëindigd. Dit proces maakt de overgang naar de nieuwe versie zo soepel mogelijk.

De app controleren

Voer de volgende stappen uit om te controleren of uw app nog steeds werkt:

  • Bekijk de geïmplementeerde eShop door deze opdracht uit te voeren in de terminal:

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

    Met de bovenstaande opdracht wordt het externe IP-adres voor de web-app geretourneerd. Houd Ctrl- ingedrukt en selecteer de koppeling om de app op een nieuw tabblad te openen.

Ga naar de productpagina om de nieuwe tent onderaan de pagina te bekijken.

De implementatie terugdraaien

Een veelvoorkomende oplossing voor productieproblemen is om terug te keren naar een bekende goede implementatie. Kubernetes onderhoudt een implementatiegeschiedenis die u kunt gebruiken om terug te keren naar een eerdere versie van uw app.

Voer in uw terminal deze opdracht uit om de nieuwe tent te verwijderen die u zojuist hebt toegevoegd aan de website:

kubectl rollout undo deployment/productservice

U zou dit consolebericht moeten zien:

deployment.apps/productservice rolled back

Vernieuw de pagina producten in uw browser en de nieuwe tent mag niet meer worden vermeld.

Notitie

In een praktijkscenario implementeert u de artefacten van de build in meerdere omgevingen. U hebt bijvoorbeeld ontwikkel-, test- en faseringsomgevingen. U kunt implementatiewerkstromen activeren door gebeurtenissen zoals het samenvoegen van pull-aanvragen. U kunt kwaliteitscontrole- of goedkeuringspoorten toevoegen, zoals de goedkeuring van een belanghebbende, om onverwachte implementaties naar productie te voorkomen.