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
- Een Azure-account met een actief abonnement. Gratis een account maken
- Een GitHub-account. Maak een gratis GitHub-account als u er nog geen hebt.
- Een Azure Container Registrymet pushbevoegdheden. Maak een Azure Container Registry als u er nog geen hebt.
- Een Kubernetes-cluster. Een AKS-cluster (Azure Kubernetes Service) implementeren.
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.
- 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
- ./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).
- deployment.yml: bevat de specificatie van de
- ./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 naarsampleapp
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
- Ga naar Project settings>Pipelines>Service-verbindingen in het menu Azure DevOps.
- Maak een Docker-registerserviceverbinding die is gekoppeld aan uw containerregister. Noem het azure-pipelines-canary-k8s.
- 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
Ga naar Pipelines>Create Pipeline en selecteer uw opslagplaats.
Kies Starter-pijplijn op het tabblad Configureren.
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.io
de installatiekopieënexample.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-k8s
uit.
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.
Ga naar Pipelines>Environments>Create environment.
Maak een nieuwe omgeving.
- Naam: akscanary
- Resource: Kies Kubernetes.
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.
Selecteer Valideren en maken.
Ga naar Pijplijnen. Selecteer de pijplijn die u hebt gemaakt en selecteer Bewerken.
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
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/*
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.
Ga naar Pipelines>Environments New environments.>
Configureer de nieuwe omgeving.
- Naam: akspromote
- Resource: Kies Kubernetes.
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.
Selecteer Valideren en maken.
Selecteer uw nieuwe
akspromote
omgeving in de lijst met omgevingen.Selecteer Goedkeuringen en controleert>goedkeuringen. Selecteer vervolgens het beletselteken (de drie puntjes).
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.
Selecteer Maken.
Ga naar Pijplijnen en selecteer de pijplijn die u hebt gemaakt. Selecteer vervolgens Edit.
Voeg een andere fase toe,
PromoteRejectCanary
aan 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)'
Voeg een andere fase toe,
RejectCanary
aan 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/*'
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:
- 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 deDeployCanary
fase geactiveerd. - Omdat u een goedkeuring voor de
akspromote
omgeving hebt geconfigureerd, wacht de release voordat deze fase wordt uitgevoerd. - 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
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
Open in een browser de volgende URL.
http://localhost:3000/login
Wanneer u wordt gevraagd om referenties, tenzij de
adminPassword
waarde tijdens de installatie van deprometheus-operator
Helm-grafiek is overschreven, kunt u de volgende waarden gebruiken:- gebruikersnaam: beheerder
- wachtwoord: prom-operator
Kies Dashboard>Graph in het menu aan de linkerkant.+>
Selecteer ergens in het zojuist toegevoegde deelvenster en typ
e
om het deelvenster te bewerken.Voer op het tabblad Metrische gegevens de volgende query in:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Wijzig op het tabblad Algemeen de naam van dit deelvenster in Alle sampleapp-pods.
Wijzig in de overzichtsbalk boven aan de pagina het duurbereik in Afgelopen 5 minuten of Afgelopen 15 minuten.
Als u dit deelvenster wilt opslaan, selecteert u het pictogram Opslaan in de overzichtsbalk.
In het voorgaande deelvenster worden metrische succespercentagegegevens van alle varianten gevisualiseerd. Deze omvatten stabiele (van de
sampleapp
implementatie), basislijn (van desampleapp-baseline
implementatie) en kanarie (van desampleapp-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
Op dit moment is de canary-fase Implementeren voltooid (op basis van de wijziging van van
success_rate
10
in20
). De canary-fase Promoveren/weigeren wacht op handmatige interventie. U kunt nu het slagingspercentage (zoals bepaald doorcustom_status=good
) van de basislijn en kanarievarianten in het Grafana-dashboard vergelijken. Dit moet er ongeveer als volgt uitzien:Op basis van de waarneming dat het slagingspercentage hoger is voor kanarie, promoveert u de kanarie. Selecteer Hervatten in de handmatige interventietaak.