Kurz: Použití kanárové strategie nasazení pro Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
Tento podrobný průvodce popisuje, jak používat úlohu manifestu canary
Kubernetes se strategií. Kanárná strategie nasazení nasadí nové verze aplikace vedle stabilních produkčních verzí.
Přidružený pracovní postup použijete k nasazení kódu a porovnání standardních hodnot a nasazení kanárských aplikací. Na základě vyhodnocení se rozhodnete, jestli chcete zvýšit úroveň nebo odmítnout nasazení kanárů.
Tento kurz používá připojení ke službám Docker Registry a Azure Resource Manageru k připojení k prostředkům Azure. Pro privátní cluster Azure Kubernetes Service (AKS) nebo cluster, který má zakázané místní účty, je lepší způsob připojení služby Azure Resource Manager.
Požadavky
Projekt Azure DevOps s alespoň uživatelskými oprávněními
Účet Azure. Vytvoření účtu zdarma
Instance služby Azure Container Registry s oprávněními nabízených oznámení.
Nasazený cluster Azure Kubernetes Service (AKS). Cluster AKS můžete připojit ke clusteru Azure Container Registry, když nasadíte cluster AKS nebo potom.
Účet GitHub. Vytvořte si bezplatný účet GitHubu.
Fork úložiště https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s GitHub.
Důležité
Během následujících postupů se může zobrazit výzva k vytvoření připojení služby GitHub nebo k přesměrování na GitHub, abyste se mohli přihlásit, nainstalovat Azure Pipelines nebo autorizovat Azure Pipelines. Dokončete proces podle pokynů na obrazovce. Další informace najdete v tématu Přístup k úložištím GitHub.
Soubory úložiště GitHub
Úložiště GitHub obsahuje následující soubory:
Soubor | Popis |
---|---|
./app/app.py | Jednoduchý webový server založený na Flasku . Soubor nastaví vlastní čítač pro počet dobrých a špatných odpovědí na základě hodnoty success_rate proměnné. |
./app/Dockerfile | Používá se k vytvoření image s každou změnou app.py. Každá změna aktivuje kanál buildu pro sestavení image a nasdílí ji do registru kontejneru. |
./manifests/deployment.yml | Obsahuje specifikaci sampleapp úlohy nasazení odpovídající publikované imagi. Tento soubor manifestu použijete pro stabilní verzi objektu nasazení a pro odvození směrného plánu a kanárských variant úloh. |
./manifests/service.yml | sampleapp Vytvoří službu. Tato služba směruje požadavky na pody, které se roztáhnou stabilním, směrným plánem a kanárnými nasazeními. |
./misc/fortio.yml | Nastaví nasazení fortio. Toto nasazení je nástroj pro zátěžové testování, který odesílá stream požadavků do nasazené sampleapp služby. Stream požadavků směruje pody ve třech nasazeních: stabilní, směrný plán a kanár. |
Vytvoření připojení služeb
- V projektu Azure DevOps přejděte na připojení Pipelines>Service nastavení> projektu.
- Vytvořte připojení služby Docker Registry s názvem azure-pipelines-canary-acr , které je přidružené k vaší instanci služby Azure Container Registry.
- Vytvořte připojení služby Azure Resource Manageru s identitou úlohy s názvem azure-pipelines-canary-k8s pro vaši skupinu prostředků.
Přidání fáze sestavení
V projektu Azure DevOps přejděte na Kanály>vytvořit kanál nebo nový kanál.
Jako umístění kódu vyberte GitHub a vyberte úložiště forked azure-pipelines-canary-k8s .
Na kartě Konfigurace zvolte Počáteční kanál.
Na kartě Revize nahraďte YAML kanálu následujícím kódem.
trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s # name of ACR image dockerRegistryServiceConnection: azure-pipelines-canary-acr # name of ACR service connection imageRepository: 'azure-pipelines-canary-k8s' # name of image repository containerRegistry: example.azurecr.io # name of Azure container registry 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)
Pokud je připojení služby registru Dockeru, které jste vytvořili, přidruženo k registru kontejneru s názvem
example.azurecr.io
, pak je image nastavena naexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
.Vyberte Uložit a spusťte a ujistěte se, že se úloha úspěšně spustí.
Úprava souboru manifestu
Ve forku úložiště upravte manifesty/deployment.yml tak, aby se nahradily <foobar>
adresou URL registru kontejneru, například example.azurecr.io/azure-pipelines-canary-k8s
.
Nastavení průběžného nasazování
Teď nastavte průběžné nasazování, nasaďte kanárku a propagujte nebo odmítněte kanáru prostřednictvím ručního schválení.
Vytvořit prostředí
Nasazení můžete provést pomocí YAML nebo Classic.
- V projektu Azure DevOps přejděte do prostředí Pipelines>a pak vyberte Vytvořit prostředí nebo Nové prostředí.
- Na první obrazovce Nové prostředí zadejte akscanary v části Název, vyberte Kubernetes v části Prostředek a vyberte Další.
- Vyplňte obrazovku prostředku Kubernetes následujícím způsobem:
- Poskytovatel: Vyberte službu Azure Kubernetes Service.
- Předplatné Azure: Vyberte své předplatné Azure.
- Cluster: Vyberte cluster AKS.
- Obor názvů: Vyberte Nový a zadejte canarydemo.
- Vyberte Ověřit a vytvořit.
Přidání kanárové fáze
Přejděte na Kanály, vyberte kanál, který jste vytvořili, a vyberte Upravit.
Nahraďte celý kanál YAML následujícím kódem.
Tento kód změní
Docker@2
krok, který jste spustili dříve, aby se použila fáze, a přidá dva další kroky ke zkopírování manifestů a chybných adresářů jako artefaktů pro po sobě jdoucí fáze, které se mají použít.Kód také přesune některé hodnoty do proměnných pro snadnější použití později v kanálu.
containerRegistry
V proměnné nahraďte<example>
názvem vašeho registru kontejneru.trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: azure-pipelines-canary-acr imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: <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
Na konec souboru YAML přidejte další fázi pro nasazení kanárové verze. Nahraďte hodnoty
my-resource-group
amy-aks-cluster
skupinou prostředků a názvem clusteru Azure Kubernetes Service.trigger: - main pool: vmImage: ubuntu-latest variables: imageName: azure-pipelines-canary-k8s dockerRegistryServiceConnection: azure-pipelines-canary-acr imageRepository: 'azure-pipelines-canary-k8s' containerRegistry: yourcontainerregistry.azurecr.io #update with container registry 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 - stage: DeployCanary displayName: Deploy canary dependsOn: Build condition: succeeded() jobs: - deployment: Deploycanary displayName: Deploy canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: Deploy to Kubernetes cluster inputs: action: 'deploy' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' strategy: 'canary' percentage: '25' manifests: | $(Pipeline.Workspace)/manifests/deployment.yml $(Pipeline.Workspace)/manifests/service.yml containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: 'my-acr-secret' - task: KubernetesManifest@1 displayName: Deploy Forbio to Kubernetes cluster inputs: action: 'deploy' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' manifests: '$(Pipeline.Workspace)/misc/*'
Vyberte Ověřit a uložit a uložte kanál přímo do hlavní větve.
Přidání ručního schválení pro zvýšení nebo odmítnutí kanárského nasazení
Pomocí YAML nebo Classic můžete intervenovat ručně.
- Vytvořte nové prostředí Kubernetes označované jako akspromote.
- Otevřete nové prostředí akspromote ze seznamu prostředí a na kartě Schválení a kontroly vyberte Schválení.
- Na obrazovce Schválení přidejte do části Schvalovatelé vlastní uživatelský účet.
- Rozbalte položku Upřesnit a ujistěte se, že je vybraná možnost Povolit schvalovatelům schvalovat vlastní spuštění .
- Vyberte Vytvořit.
Přidání fází zvýšení úrovně a zamítnutí do kanálu
Přejděte na Kanály, vyberte kanál, který jste vytvořili, a vyberte Upravit.
Na konec souboru YAML přidejte následující
PromoteRejectCanary
fázi, která podporuje změny.- stage: PromoteRejectCanary displayName: Promote or Reject canary dependsOn: DeployCanary condition: succeeded() jobs: - deployment: PromoteCanary displayName: Promote Canary pool: vmImage: ubuntu-latest environment: 'akspromote' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret for akspromote inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: promote canary inputs: action: 'promote' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' containers: '$(containerRegistry)/$(imageRepository):$(tag)' imagePullSecrets: 'my-acr-secret' ```
Na konec souboru přidejte následující
RejectCanary
fázi, která vrátí změny zpět.- stage: RejectCanary displayName: Reject canary dependsOn: PromoteRejectCanary condition: failed() jobs: - deployment: RejectCanary displayName: Reject Canary pool: vmImage: ubuntu-latest environment: 'akscanary' strategy: runOnce: deploy: steps: - task: KubernetesManifest@1 displayName: Create Docker Registry Secret for reject canary inputs: action: 'createSecret' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'kubernetes-testing' kubernetesCluster: 'my-aks-cluster' secretType: 'dockerRegistry' secretName: 'my-acr-secret' dockerRegistryEndpoint: 'azure-pipelines-canary-acr' - task: KubernetesManifest@1 displayName: Reject canary deployment inputs: action: 'reject' connectionType: 'azureResourceManager' azureSubscriptionConnection: 'azure-pipelines-canary-sc' azureResourceGroup: 'my-resource-group' kubernetesCluster: 'my-aks-cluster' namespace: 'default' strategy: 'canary' manifests: '$(Pipeline.Workspace)/manifests/*' ```
Vyberte Ověřit a uložit a uložte kanál přímo do hlavní větve.
Nasazení stabilní verze
Pro první spuštění kanálu neexistují stabilní verze úloh a jejich standardní nebo kanárové verze v clusteru. Následujícím způsobem nasaďte stabilní verzi sampleapp
úlohy.
Stabilní verzi můžete nasadit pomocí YAML nebo Classic.
- V aplikaci/app.py přejděte
success_rate = 50
nasuccess_rate = 100
. Tato změna aktivuje kanál, sestaví a nasdílí image do registru kontejneru a aktivuje takéDeployCanary
fázi. - Vzhledem k tomu, že jste nakonfigurovali schválení v
akspromote
prostředí, čeká verze před spuštěním této fáze. Na stránce souhrnu spuštění sestavení vyberte Zkontrolovat a pak vyberte Schválit.
Po schválení kanál nasadí stabilní verzi sampleapp
úlohy v manifestech/deployment.yml do oboru názvů.
Zahájení pracovního postupu kanárů a odmítnutí schválení
Stabilní verze sampleapp
úlohy teď v clusteru existuje. Dále proveďte následující změnu aplikace simulace.
- V aplikaci/app.py přejděte
success_rate = 50
nasuccess_rate = 100
. Tato změna aktivuje kanál, sestaví a nasdílí image do registru kontejneru a aktivuje takéDeployCanary
fázi. - Vzhledem k tomu, že jste nakonfigurovali schválení v
akspromote
prostředí, čeká verze před spuštěním této fáze. - Na stránce souhrnu spuštění sestavení vyberte Zkontrolovat a v následujícím dialogovém okně vyberte Odmítnout . Tím se nasazení odmítne.
Po zamítnutí kanál zabrání nasazení kódu.
Vyčištění
Pokud tuto aplikaci nebudete dál používat, odstraňte skupinu prostředků na webu Azure Portal a projekt v Azure DevOps.