Kurz: Použití kanárové strategie nasazení pro nasazení Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
Kanárná strategie nasazení znamená nasazení nových verzí aplikace vedle stabilních produkčních verzí. Před povýšením nebo odmítnutím nasazení se pak můžete podívat, jak kanárová verze porovnává se směrným plánem.
Tento podrobný průvodce popisuje, jak používat kanárskou strategii úlohy manifestu Kubernetes. Konkrétně se dozvíte, jak nastavit kanárná nasazení pro Kubernetes a související pracovní postup pro vyhodnocení kódu. Tento kód pak použijete k porovnání standardních a kanárských nasazení aplikací, abyste se mohli rozhodnout, jestli chcete zvýšit úroveň nebo odmítnout kanárské nasazení.
Pokud používáte Službu Azure Kubernetes Service, je nejlepším způsobem připojení služby Azure Resource Manager k privátnímu clusteru nebo clusteru, který má zakázané místní účty.
Požadavky
- Účet Azure s aktivním předplatným. Vytvoření účtu zdarma
- Účet GitHub. Pokud ho ještě nemáte, vytvořte si bezplatný účet GitHubu.
- Azure Container Registrys oprávněními push. Pokud ho ještě nemáte, vytvořte službu Azure Container Registry .
- Cluster Kubernetes. Nasazení clusteru Azure Kubernetes Service (AKS)
Ukázkový kód
Fork následující úložiště na GitHubu
https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s
Tady je stručný přehled souborů v úložišti, které se používají v tomto průvodci:
- ./app:
- app.py – jednoduchý webový server založený na Flasku, který je instrumentovaný pomocí knihovny instrumentace Prometheus pro aplikace Pythonu. Vlastní čítač je nastaven pro počet dobrých a špatných odpovědí zadaných na základě hodnoty
success_rate
proměnné. - Dockerfile – používá se k sestavení image s každou změnou provedenou v app.py. Při každé změně se kanál buildu aktivuje a image se sestaví a odešle do registru kontejneru.
- app.py – jednoduchý webový server založený na Flasku, který je instrumentovaný pomocí knihovny instrumentace Prometheus pro aplikace Pythonu. Vlastní čítač je nastaven pro počet dobrých a špatných odpovědí zadaných na základě hodnoty
- ./manifests:
- deployment.yml – obsahuje specifikaci
sampleapp
úlohy nasazení odpovídající dříve publikované imagi. Tento soubor manifestu použijete nejen pro stabilní verzi objektu nasazení, ale také pro odvození směrného plánu a kanárských variant úloh. - service.yml – vytvoří
sampleapp
službu. Tato služba směruje požadavky na pody aktivované nasazeními (stabilní, směrný plán a kanár) zmíněnými dříve.
- deployment.yml – obsahuje specifikaci
- ./Vedlejší
- service-monitor.yml – slouží k nastavení objektu ServiceMonitor . Tento objekt nastaví výstřižky metrik Prometheus.
- fortio-deploy.yml – používá se k nastavení nasazení fortio. Toto nasazení se později použije jako nástroj pro zátěžové testování k odeslání datového proudu požadavků do
sampleapp
služby nasazené dříve. Stream požadavků odeslaných dosampleapp
podů se směruje ve všech třech nasazeních (stabilní, směrný plán a kanár).
Poznámka:
V této příručce použijete Prometheus pro instrumentaci a monitorování kódu. Jakékoli ekvivalentní řešení, jako je Aplikace Azure Přehledy, lze použít jako alternativu.
Instalace operátoru prometheus-operator
Pokud chcete do clusteru nainstalovat Prometheus, použijte následující příkaz z vývojového počítače. Musíte mít nainstalovaný kubectl a Helm a musíte nastavit kontext na cluster, pro který chcete nasadit. Grafana, kterou později použijete k vizualizaci standardních hodnot a kanárských metrik na řídicích panelech, se nainstaluje jako součást tohoto chartu Helm.
Nejprve do instalace Helmu přidáte úložiště Prometheus Community Kubernetes Helm Charts. Pak nainstalujete sadu kube-prometheus, kolekci manifestů Kubernetes, řídicích panelů Grafana a pravidel Prometheus.
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
Vytvoření připojení služeb
- V nabídce Azure DevOps přejděte na připojení služby Pipelines>Service v nastavení>projectu.
- Vytvořte připojení služby registru Dockeru přidružené k vašemu registru kontejneru. Pojmenujte ho azure-pipelines-canary-k8s.
- Vytvořte připojení služby Kubernetes pro cluster Kubernetes a obor názvů, do kterého chcete nasadit. Pojmenujte ho azure-pipelines-canary-k8s.
Poznámka:
Pokud používáte Službu Azure Kubernetes Service, je nejlepším způsobem připojení služby Azure Resource Manager k privátnímu clusteru nebo clusteru, který má zakázané místní účty.
Nastavení kontinuální integrace
Přejděte do kanálu Create Pipelines> a vyberte úložiště.
Na kartě Konfigurace zvolte Počáteční kanál.
Na kartě Revize nahraďte YAML kanálu tímto kódem.
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)
Pokud je připojení služby registru Dockeru, ke které jste vytvořili, přidruženo
example.azurecr.io
, pak je image naexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
základě předchozí konfigurace.
Úprava souboru manifestu
V manifestech/deployment.yml nahraďte <example>
adresou URL registru kontejneru. Například po nahrazení by pole obrázku mělo vypadat nějak takto contosodemo.azurecr.io/azure-pipelines-canary-k8s
.
Nastavení průběžného nasazování
Následující části obsahují kroky pro nastavení průběžného nasazování, včetně postupu nasazení kanárské fáze a zvýšení úrovně kanáru nebo odmítnutí kanáru prostřednictvím ručního zásahu.
Fáze nasazení kanárů
Nasazení můžete provést pomocí YAML nebo Classic.
Přejděte do prostředí>Pipelines>Create Environment.
Vytvořte nové prostředí.
- Název: akscanary
- Prostředek: Zvolte Kubernetes.
Vyberte Další a nakonfigurujte prostředek Kubernetes následujícím způsobem:
- Poskytovatel: Azure Kubernetes Service
- Předplatné Azure: Zvolte předplatné, které obsahuje váš cluster Kubernetes.
- Cluster: Zvolte cluster.
- Obor názvů: Vytvořte nový obor názvů s názvem canarydemo.
Vyberte Ověřit a vytvořit.
Přejděte na Pipelines (Kanály). Vyberte kanál, který jste vytvořili, a vyberte Upravit.
Změňte krok, který jste vytvořili dříve, a teď použijte fázi. Přidejte dva další kroky pro zkopírování manifestů a chybných adresářů jako artefaktů pro použití v po sobě jdoucích fázích. Můžete také chtít přesunout několik hodnot do proměnných, abyste je mohli později v kanálu snadněji používat. Kompletní YAML by teď měl vypadat takto.
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
Přidejte fázi na konec souboru YAML pro nasazení kanárové verze.
- 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/*
Uložte kanál potvrzením přímo do hlavní větve. Toto potvrzení by již mělo úspěšně spustit váš kanál.
Ruční zásah pro podporu nebo odmítnutí kanárů
Pomocí YAML nebo Classic můžete intervenovat ručně.
Přejděte do nového prostředí Pipelines>Environment.>
Nakonfigurujte nové prostředí.
- Název: akspromote
- Prostředek: Zvolte Kubernetes.
Vyberte Další a nakonfigurujte prostředek Kubernetes následujícím způsobem:
- Poskytovatel: Azure Kubernetes Service
- Předplatné Azure: Zvolte předplatné, které obsahuje váš cluster Kubernetes.
- Cluster: Zvolte cluster.
- Obor názvů: Zvolte obor názvů, canarydemo, který jste vytvořili dříve.
Vyberte Ověřit a vytvořit.
V seznamu prostředí vyberte nové
akspromote
prostředí.Vyberte Schválení a kontroly> Schválení. Pak vyberte ikonu tří teček (tři tečky).
Schválení nakonfigurujte následujícím způsobem:
- Schvalovatelé: Přidejte vlastní uživatelský účet.
- Upřesnit: Ujistěte se, že je zaškrtnuté políčko Povolit schvalovatelům schvalovat vlastní spuštění .
Vyberte Vytvořit.
Přejděte na Kanály a vyberte kanál, který jste vytvořili. Pak vyberte Edit (Upravit).
Přidejte další fázi,
PromoteRejectCanary
na konci souboru YAML, aby se změny propagovaly.- 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)'
Přidejte další fázi,
RejectCanary
na konci souboru YAML, aby se změny vrátily zpět.- 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/*'
Kanál YAML uložte tak , že vyberete Uložit a pak ho potvrdíte přímo do hlavní větve.
Nasazení stabilní verze
Stabilní verzi můžete nasadit pomocí YAML nebo Classic.
Pro první spuštění kanálu stabilní verzi úloh a jejich směrné plány nebo kanárové verze v clusteru neexistují. Nasazení stabilní verze:
- V aplikaci/app.py přejděte
success_rate = 5
nasuccess_rate = 10
. Tato změna aktivuje kanál, což vede k sestavení a nasdílení image do registru kontejneru. Aktivuje se takéDeployCanary
fáze. - Vzhledem k tomu, že jste nakonfigurovali schválení v
akspromote
prostředí, bude verze čekat před spuštěním této fáze. - V souhrnu spuštění vyberte Zkontrolovat>schválení. Tím se do oboru názvů nasadí stabilní verze úloh (
sampleapp
nasazení v manifests/deployment.yml).
Inicializovat kanárný pracovní postup
Stabilní verze úlohy sampleapp
teď v clusteru existuje. Dále proveďte následující změnu aplikace simulace:
V aplikaci/app.py přejděte success_rate = 10
na success_rate = 20
.
Tato změna aktivuje kanál buildu, což vede k sestavení a nasdílení image do registru kontejneru. Tento proces zase aktivuje kanál verze a zahájí fázi nasazení.
Simulace požadavků
Na vývojovém počítači spusťte následující příkazy a udržujte ho spuštěný tak, aby odesílal konstantní datový proud požadavků ve službě sampleapp
. sampleapp
směruje požadavky na pody, které jsou vysunuty stabilním sampleapp
nasazením, a do podů, které jsou roztěsněny a sampleapp-baseline
sampleapp-canary
nasazeními. Selektor zadaný pro sampleapp
je použitelný pro všechny tyto pody.
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/
Nastavení řídicího panelu Grafana
Spusťte na místním vývojovém počítači následující příkaz pro přesměrování portů, abyste měli přístup k Grafana.
kubectl port-forward svc/sampleapp-grafana 3000:80
V prohlížeči otevřete následující adresu URL.
http://localhost:3000/login
Pokud se při instalaci chartu Helm nezobrazí výzva k zadání přihlašovacích údajů,
adminPassword
prometheus-operator
můžete použít následující hodnoty:- uživatelské jméno: správce
- password: prom-operator
V nabídce vlevo zvolte +>Graf řídicího panelu>.
Vyberte libovolné místo na nově přidaném panelu a zadejte
e
panel a upravte ho.Na kartě Metriky zadejte následující dotaz:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Na kartě Obecné změňte název tohoto panelu na Všechny pody ukázkové aplikace.
Na panelu přehledu v horní části stránky změňte rozsah trvání na Posledních 5 minut nebo Posledních 15 minut.
Pokud chcete tento panel uložit, vyberte ikonu pro uložení na panelu přehledu.
Předchozí panel vizualizuje metriky úspěšnosti ze všech variant. Patří mezi ně stabilní (z
sampleapp
nasazení), směrný plán (zsampleapp-baseline
nasazení) a kanár (zsampleapp-canary
nasazení). Pomocí následující konfigurace můžete vizualizovat pouze základní a kanárské metriky přidáním dalšího panelu:- Na kartě Obecné v části Název vyberte směrný plán ukázkové aplikace a kanár.
- Na kartě Metriky použijte následující dotaz:
rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
Poznámka:
Panel standardních a kanárských metrik bude mít k dispozici pouze metriky pro porovnání za určitých podmínek. Tyto podmínky jsou v případě úspěšného dokončení fáze nasazení canary a fáze povýšení/odmítnutí čeká na ruční zásah.
Tip
Nastavte poznámky pro řídicí panely Grafana tak, aby vizuálně znázorňovaly události dokončení fáze pro kanárku Deploy a Promote/reject kanár. To je užitečné, abyste věděli, kdy začít porovnávat směrný plán s kanárkou a kdy se povýšení nebo odmítnutí kanárky dokončilo.
Porovnání směrného plánu a kanáru
V tuto chvíli se fáze nasazení úspěšně dokončila (na základě změny
success_rate
z10
na20
). Fáze kanárů povýšení /odmítnutí čeká na ruční zásah. Teď můžete porovnat míru úspěšnosti (podlecustom_status=good
určení) směrného plánu a kanárkové varianty na řídicím panelu Grafana. Mělo by to vypadat nějak takto:Na základě pozorování, že míra úspěšnosti je vyšší pro kanár, propagujte kanár. V úloze ručního zásahu vyberte Pokračovat .
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro