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] naam van uw ACR, bijvoorbeeld acseshop186748394.

  4. Selecteer wijzigingen doorvoeren in de rechterbovenhoek. Selecteer vervolgens in het dialoogvenster Wijzigingen doorvoeren.

De implementatie-actie maken

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

Heeft één stap waarmee nieuwe installatiekopieën worden geïmplementeerd. Dit zijn de stappen in een ubuntu-latest runner:

  1. Controleert de opslagplaats waarin dit bestand zich bevindt.
  2. Azure-aanmelding meldt zich aan bij Azure met de referenties van de service-principal.
  3. Kubelogin instellen voor niet-interactieve aanmelding configureert het kubeconfig-bestand voor Azure-verificatie.
  4. Met contextsetcontext van K8s worden de AKS-referenties (Azure Kubernetes Service) in het bestand van .kube/config de runner ingesteld.
  5. Hiermee wordt de toepassing geïmplementeerd 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 het .github/workflows tabblad in de geforkte opslagplaats op het code tabtabblad.

  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 uw geforkte opslagplaats op de code tabmap.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 productmatrix :

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

De implementatie bewaken

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

  2. Selecteer de meest recente uitvoering van de werkstroom die wordt weergegeven voor de werkstroom Build and deploy an app to AKS. 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.

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

  4. Voer in de terminal de volgende opdracht uit om de couponservicepods in uw AKS-cluster te bewaken. De --selector vlag filtert kubectl de lijst op alleen pods voor de couponservice en de --watch vlag geeft aan om te kijken naar 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 productservicepod wordt gemaakt. Wanneer de nieuwe pod gereed is, wordt de oude beëindigd. Dit proces zorgt ervoor dat de overgang naar de nieuwe versie zo soepel mogelijk gaat.

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 pagina producten om de nieuwe tent onder aan de pagina weer te geven.

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

Dit consolebericht wordt weergegeven:

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 kunt bijvoorbeeld ontwikkel-, test- en faseringsomgevingen hebben. U kunt implementatiewerkstromen activeren op gebeurtenissen zoals het samenvoegen van PULL's. U kunt kwaliteits- of goedkeuringspoorten, zoals de goedkeuring van een belanghebbende, toevoegen om onverwachte implementaties naar productie te voorkomen.

Kennis testen

1.

Wat is de beste plek om gevoelige informatie, zoals referenties, op te slaan voor GitHub Actions?

2.

Wat is het doel van het maken van een Azure Active Directory-service-principal voor GitHub Actions die moet worden gebruikt?

3.

Waarom maakt AKS tijdens de upgrade-implementatie een nieuwe container terwijl de oude nog steeds wordt uitgevoerd?