Delen via


Zelfstudie: Een canary-implementatiestrategie gebruiken voor Kubernetes-implementaties

Azure DevOps Services | Azure DevOps Server 2022

Een canary-implementatiestrategie betekent het implementeren van nieuwe versies van een toepassing naast stabiele, productieversies. Vervolgens kunt u zien hoe de canary-versie zich verhoudt tot de basislijn, voordat u de implementatie promoveert of weigert.

In deze stapsgewijze handleiding wordt beschreven hoe u de canary-strategie van de Kubernetes-manifesttaak gebruikt. In het bijzonder leert u hoe u canary-implementaties instelt voor Kubernetes en de bijbehorende werkstroom om code te evalueren. Vervolgens gebruikt u die code om implementaties van basislijnen en canary-apps te vergelijken, zodat u kunt bepalen of u de canary-implementatie wilt promoveren of afwijzen.

Als u Azure Kubernetes Service gebruikt, is het verbindingstype van de Azure Resource Manager-service de beste manier om verbinding te maken met een privécluster of een cluster waarvoor lokale accounts zijn uitgeschakeld.

Vereisten

Voorbeeldcode

Fork de volgende opslagplaats op GitHub.

https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s

Hier volgt een kort overzicht van de bestanden in de opslagplaats die tijdens deze handleiding worden gebruikt:

  • ./app:
    • app.py : een eenvoudige, op Flask gebaseerde webserver die wordt geïnstrufieerd met behulp van de Prometheus-instrumentatiebibliotheek voor Python-toepassingen. Er wordt een aangepaste teller ingesteld voor het aantal goede en slechte antwoorden dat is opgegeven, op basis van de waarde van de success_rate variabele.
    • Dockerfile : wordt gebruikt voor het bouwen van de installatiekopieën met elke wijziging die is aangebracht in app.py. Bij elke wijziging wordt de build-pijplijn geactiveerd en wordt de installatiekopie gebouwd en naar het containerregister gepusht.
  • ./manifesten:
    • deployment.yml: bevat de specificatie van de sampleapp implementatieworkload die overeenkomt met de installatiekopieën die eerder zijn gepubliceerd. U gebruikt dit manifestbestand niet alleen voor de stabiele versie van het implementatieobject, maar ook voor het afleiden van de basislijn- en canary-varianten van de workloads.
    • service.yml - Hiermee maakt u de sampleapp service. Deze service routeert aanvragen naar de pods die eerder zijn vermeld door de implementaties (stabiel, basislijn en canary).
  • ./MISC
    • service-monitor.yml : wordt gebruikt om een ServiceMonitor-object in te stellen. Met dit object wordt metrische scraping van Prometheus ingesteld.
    • fortio-deploy.yml: wordt gebruikt voor het instellen van een fortio-implementatie. Deze implementatie wordt later gebruikt als hulpprogramma voor belastingtests om een stroom aanvragen te verzenden naar de sampleapp service die eerder is geïmplementeerd. De stroom aanvragen die naar sampleapp worden verzonden, worden gerouteerd naar pods onder alle drie de implementaties (stabiel, basislijn en kanarie).

Notitie

In deze handleiding gebruikt u Prometheus voor code-instrumentatie en -bewaking. Elke equivalente oplossing, zoals Azure-toepassing Insights, kan als alternatief worden gebruikt.

Prometheus-operator installeren

Als u Prometheus op uw cluster wilt installeren, gebruikt u de volgende opdracht vanaf uw ontwikkelcomputer. U moet kubectl en Helm hebben geïnstalleerd en u moet de context instellen op het cluster waarop u wilt implementeren. Grafana, die u later gebruikt om de basislijn en canaire metrische gegevens op dashboards te visualiseren, wordt geïnstalleerd als onderdeel van deze Helm-grafiek.

U voegt eerst de Opslagplaats voor Prometheus Community Kubernetes Helm Charts toe aan uw Helm-installatie. Vervolgens installeert u de kube-prometheus-stack, een verzameling Kubernetes-manifesten, Grafana-dashboards en Prometheus-regels.

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

Serviceverbindingen maken

  1. Ga naar Project settings>Pipelines>Service-verbindingen in het menu Azure DevOps.
  2. Maak een Docker-registerserviceverbinding die is gekoppeld aan uw containerregister. Noem het azure-pipelines-canary-k8s.
  3. Maak een Kubernetes-serviceverbinding voor het Kubernetes-cluster en de naamruimte waarnaar u wilt implementeren. Noem het azure-pipelines-canary-k8s.

Notitie

Als u Azure Kubernetes Service gebruikt, is het verbindingstype van de Azure Resource Manager-service de beste manier om verbinding te maken met een privécluster of een cluster waarvoor lokale accounts zijn uitgeschakeld.

Het instellen van continue integratie

  1. Ga naar Pipelines>Create Pipeline en selecteer uw opslagplaats.

  2. Kies Starter-pijplijn op het tabblad Configureren.

  3. Vervang op het tabblad Controleren de YAML van de pijplijn door deze 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)
    

    Als de Docker-registerserviceverbinding die u hebt gemaakt, is gekoppeld aan example.azurecr.iode installatiekopieën example.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)op basis van de voorgaande configuratie.

Manifestbestand bewerken

Vervang in manifesten/deployment.yml door <example> de URL van het containerregister. Na vervanging ziet het afbeeldingsveld er bijvoorbeeld ongeveer als volgt contosodemo.azurecr.io/azure-pipelines-canary-k8suit.

Doorlopende implementatie instellen

De volgende secties bevatten stappen voor het instellen van continue implementatie, waaronder het implementeren van de canary-fase en het promoten of afwijzen van de kanarie via handmatige interventie.

Canary-fase implementeren

U kunt implementeren met YAML of klassiek.

  1. Ga naar Pipelines>Environments>Create environment.

  2. Maak een nieuwe omgeving.

    • Naam: akscanary
    • Resource: Kies Kubernetes.
  3. Selecteer Volgende en configureer uw Kubernetes-resource als volgt:

    • Provider: Azure Kubernetes Service
    • Azure-abonnement: kies het abonnement dat uw Kubernetes-cluster bevat.
    • Cluster: Kies uw cluster.
    • Naamruimte: Maak een nieuwe naamruimte met de naam canarydemo.
  4. Selecteer Valideren en maken.

  5. Ga naar Pijplijnen. Selecteer de pijplijn die u hebt gemaakt en selecteer Bewerken.

  6. Wijzig de stap die u eerder hebt gemaakt om nu een fase te gebruiken. Voeg nog twee stappen toe om de manifesten en misc directory's te kopiëren als artefacten voor gebruik door opeenvolgende fasen. U kunt ook een aantal waarden naar variabelen verplaatsen, zodat u deze later in uw pijplijn eenvoudiger kunt gebruiken. Uw volledige YAML moet er nu als volgt uitzien.

    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
    
  7. Voeg een fase toe aan het einde van uw YAML-bestand om de canary-versie te implementeren.

    - 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/*
    
  8. Sla uw pijplijn op door rechtstreeks door te voeren naar de hoofdbranch. Met deze doorvoering moet uw pijplijn al worden uitgevoerd.

Handmatige interventie voor het bevorderen of afwijzen van kanarie

U kunt handmatig tussenbeide komen met YAML of klassiek.

  1. Ga naar Pipelines>Environments New environments.>

  2. Configureer de nieuwe omgeving.

    • Naam: akspromote
    • Resource: Kies Kubernetes.
  3. Selecteer Volgende en configureer uw Kubernetes-resource als volgt:

    • Provider: Azure Kubernetes Service
    • Azure-abonnement: kies het abonnement dat uw Kubernetes-cluster bevat.
    • Cluster: Kies uw cluster.
    • Naamruimte: Kies de naamruimte, canarydemo, die u eerder hebt gemaakt.
  4. Selecteer Valideren en maken.

  5. Selecteer uw nieuwe akspromote omgeving in de lijst met omgevingen.

  6. Selecteer Goedkeuringen en controleert>goedkeuringen. Selecteer vervolgens het beletselteken (de drie puntjes).

  7. Configureer uw goedkeuring als volgt:

    • Goedkeurders: Voeg uw eigen gebruikersaccount toe.
    • Geavanceerd: Zorg ervoor dat het vak Goedkeurders toestaan om hun eigen uitvoeringsvak goed te keuren is geselecteerd.
  8. Selecteer Maken.

  9. Ga naar Pijplijnen en selecteer de pijplijn die u hebt gemaakt. Selecteer vervolgens Edit.

  10. Voeg een andere fase toe, PromoteRejectCanaryaan het einde van uw YAML-bestand, om de wijzigingen te promoten.

    - 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)'
    
  11. Voeg een andere fase toe, RejectCanaryaan het einde van uw YAML-bestand, om de wijzigingen terug te draaien.

    - 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/*'
    
  12. Sla uw YAML-pijplijn op door Opslaan te selecteren en deze vervolgens rechtstreeks door te voeren naar de hoofdvertakking.

Een stabiele versie implementeren

U kunt een stabiele versie implementeren met YAML of Klassiek.

Voor de eerste uitvoering van de pijplijn bestaat de stabiele versie van de workloads en zijn de basislijn- of kanarieversies niet aanwezig in het cluster. De stabiele versie implementeren:

  1. Ga in app/app.py naar success_rate = 5 success_rate = 10. Deze wijziging activeert de pijplijn, wat leidt tot een build en push van de installatiekopieën naar het containerregister. Ook wordt de DeployCanary fase geactiveerd.
  2. Omdat u een goedkeuring voor de akspromote omgeving hebt geconfigureerd, wacht de release voordat deze fase wordt uitgevoerd.
  3. Selecteer >Goedkeuren in het overzicht van de uitvoering. Hiermee wordt de stabiele versie van de workloads (de sampleapp implementatie in manifesten/deployment.yml) geïmplementeerd in de naamruimte.

Kanaire werkstroom initiëren

De stabiele versie van de workload sampleapp bestaat nu in het cluster. Breng vervolgens de volgende wijziging aan in de simulatietoepassing:

Ga in app/app.py naar success_rate = 10 success_rate = 20.

Deze wijziging activeert de build-pijplijn, wat resulteert in de build en push van de installatiekopieën naar het containerregister. Met dit proces wordt de release-pijplijn geactiveerd en wordt de canary-fase Deploy gestart.

Aanvragen simuleren

Voer op uw ontwikkelcomputer de volgende opdrachten uit en houd deze actief om een constante stroom aanvragen bij de sampleapp service te verzenden. sampleapp stuurt de aanvragen naar de pods die worden spunen door de stabiele sampleapp implementatie en naar de pods die door de sampleapp-baseline en sampleapp-canary implementaties worden gesponnen. De opgegeven sampleapp selector is van toepassing op al deze 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/

Grafana-dashboard instellen

  1. Voer de volgende opdracht voor het doorsturen van poorten uit op uw lokale ontwikkelcomputer om toegang te krijgen tot Grafana.

    kubectl port-forward svc/sampleapp-grafana 3000:80
    
  2. Open in een browser de volgende URL.

    http://localhost:3000/login
    
  3. Wanneer u wordt gevraagd om referenties, tenzij de adminPassword waarde tijdens de installatie van de prometheus-operator Helm-grafiek is overschreven, kunt u de volgende waarden gebruiken:

    • gebruikersnaam: beheerder
    • wachtwoord: prom-operator
  4. Kies Dashboard>Graph in het menu aan de linkerkant.+>

  5. Selecteer ergens in het zojuist toegevoegde deelvenster en typ e om het deelvenster te bewerken.

  6. Voer op het tabblad Metrische gegevens de volgende query in:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Wijzig op het tabblad Algemeen de naam van dit deelvenster in Alle sampleapp-pods.

  8. Wijzig in de overzichtsbalk boven aan de pagina het duurbereik in Afgelopen 5 minuten of Afgelopen 15 minuten.

  9. Als u dit deelvenster wilt opslaan, selecteert u het pictogram Opslaan in de overzichtsbalk.

  10. In het voorgaande deelvenster worden metrische succespercentagegegevens van alle varianten gevisualiseerd. Deze omvatten stabiele (van de sampleapp implementatie), basislijn (van de sampleapp-baseline implementatie) en kanarie (van de sampleapp-canary implementatie). U kunt alleen de basislijn- en canary-metrische gegevens visualiseren door een ander deelvenster toe te voegen, met de volgende configuratie:

    • Selecteer op het tabblad Algemeen voor Titel de basislijn van de sampleapp en de canary.
    • Gebruik op het tabblad Metrische gegevens de volgende query:
    rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
    

    Notitie

    In het deelvenster voor basislijn- en canary-metrische gegevens zijn alleen metrische gegevens beschikbaar voor vergelijking onder bepaalde voorwaarden. Deze voorwaarden zijn wanneer de canary-fase Implementeren is voltooid en de canary-fase Promoveren/afwijzen wacht op handmatige interventie.

    Tip

    Annotaties instellen voor Grafana-dashboards om fasevoltooiingsgebeurtenissen visueel weer te geven voor Deploy canary en Promote/reject canary. Dit is handig, zodat u weet wanneer u begint met het vergelijken van de basislijn met de canary en wanneer de promotie of afwijzing van de kanarie respectievelijk is voltooid.

Basislijn en canary vergelijken

  1. Op dit moment is de canary-fase Implementeren voltooid (op basis van de wijziging van van success_rate 10 in 20). De canary-fase Promoveren/weigeren wacht op handmatige interventie. U kunt nu het slagingspercentage (zoals bepaald door custom_status=good) van de basislijn en kanarievarianten in het Grafana-dashboard vergelijken. Dit moet er ongeveer als volgt uitzien:

    Schermopname van een vergelijking van basislijn- en canary-metrische gegevens.

  2. Op basis van de waarneming dat het slagingspercentage hoger is voor kanarie, promoveert u de kanarie. Selecteer Hervatten in de handmatige interventietaak.