Tutorial: Use uma estratégia de implantação canary para implantações do Kubernetes
Serviços de DevOps do Azure | Azure DevOps Server 2022
Uma estratégia de implantação canária significa implantar novas versões de um aplicativo ao lado de versões estáveis de produção. Em seguida, você pode ver como a versão canária se compara à linha de base, antes de promover ou rejeitar a implantação.
Este guia passo a passo aborda como usar a estratégia canária da tarefa de manifesto do Kubernetes. Especificamente, você aprenderá como configurar implantações canárias para Kubernetes e o fluxo de trabalho associado para avaliar o código. Em seguida, use esse código para comparar implantações de aplicativo de linha de base e canary, para que possa decidir se deseja promover ou rejeitar a implantação canary.
Se você estiver usando o Serviço Kubernetes do Azure, o tipo de conexão de serviço do Azure Resource Manager é a melhor maneira de se conectar a um cluster privado ou a um cluster que tenha contas locais desabilitadas.
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- Uma conta GitHub. Crie uma conta gratuita no GitHub, se ainda não tiver uma.
- Um Registrode Contêiner do Azure com privilégios de push. Crie um Registro de Contêiner do Azure se ainda não tiver um.
- Um cluster Kubernetes. Implante um cluster do Serviço Kubernetes do Azure (AKS).
Código de exemplo
Fork o seguinte repositório no GitHub.
https://github.com/MicrosoftDocs/azure-pipelines-canary-k8s
Aqui está uma breve visão geral dos arquivos no repositório que são usados durante este guia:
- ./app:
- app.py - Um servidor web simples, baseado em Flask, que é instrumentado usando a biblioteca de instrumentação Prometheus para aplicações Python. Um contador personalizado é configurado para o número de respostas boas e ruins dadas, com base no valor da
success_rate
variável. - Dockerfile - Usado para criar a imagem a cada alteração feita no app.py. A cada alteração, o pipeline de compilação é acionado e a imagem é criada e enviada para o registro do contêiner.
- app.py - Um servidor web simples, baseado em Flask, que é instrumentado usando a biblioteca de instrumentação Prometheus para aplicações Python. Um contador personalizado é configurado para o número de respostas boas e ruins dadas, com base no valor da
- ./manifestos:
- deployment.yml - Contém a especificação da
sampleapp
carga de trabalho de implantação correspondente à imagem publicada anteriormente. Você usa esse arquivo de manifesto não apenas para a versão estável do objeto de implantação, mas também para derivar as variantes de linha de base e canárias das cargas de trabalho. - service.yml - Cria o
sampleapp
serviço. Esse serviço roteia solicitações para os pods girados pelas implantações (estável, linha de base e canário) mencionadas anteriormente.
- deployment.yml - Contém a especificação da
- ./misc
- service-monitor.yml - Usado para configurar um objeto ServiceMonitor . Este objeto configura a raspagem métrica Prometheus.
- fortio-deploy.yml - Usado para configurar uma implantação fortio. Essa implantação é usada posteriormente como uma ferramenta de teste de carga, para enviar um fluxo de solicitações para o serviço implantado
sampleapp
anteriormente. O fluxo de solicitações enviadas para são roteadas parasampleapp
pods em todas as três implantações (estável, linha de base e canário).
Nota
Neste guia, você usa o Prometheus para instrumentação e monitoramento de código. Qualquer solução equivalente, como o Azure Application Insights, pode ser usada como alternativa.
Instalar prometheus-operator
Para instalar o Prometheus no cluster, use o seguinte comando da máquina de desenvolvimento. Você deve ter kubectl e Helm instalados e definir o contexto para o cluster contra o qual deseja implantar. O Grafana, que você usa posteriormente para visualizar a linha de base e as métricas canárias nos painéis, é instalado como parte deste gráfico de leme.
Primeiro, você adicionará o repositório Prometheus Community Kubernetes Helm Charts à sua instalação do Helm. Em seguida, você instalará a pilha kube-prometheus, uma coleção de manifestos do Kubernetes, painéis do Grafana e regras do 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
Criar conexões de serviço
- Vá para Configurações>do projeto Pipelines Conexões de serviço no menu Azure DevOps.>
- Crie uma conexão de serviço de registro do Docker associada ao seu registro de contêiner. Nomeie-o azure-pipelines-canary-k8s.
- Crie uma conexão de serviço Kubernetes para o cluster e namespace do Kubernetes que você deseja implantar. Nomeie-o azure-pipelines-canary-k8s.
Nota
Se você estiver usando o Serviço Kubernetes do Azure, o tipo de conexão de serviço do Azure Resource Manager é a melhor maneira de se conectar a um cluster privado ou a um cluster que tenha contas locais desabilitadas.
Configurar a integração contínua
Vá para Pipelines>Create Pipeline e selecione seu repositório.
Na guia Configurar, escolha Pipeline inicial.
Na guia Revisão, substitua o pipeline YAML por este código.
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)
Se a conexão do serviço de registro do Docker que você criou estiver associada ao
example.azurecr.io
, a imagem será paraexample.azurecr.io/azure-pipelines-canary-k8s:$(Build.BuildId)
, com base na configuração anterior.
Editar arquivo de manifesto
Em manifests/deployment.yml, substitua <example>
pela URL do seu registro de contêiner. Por exemplo, após a substituição, o campo de imagem deve ter uma aparência semelhante contosodemo.azurecr.io/azure-pipelines-canary-k8s
a .
Set up continuous deployment (Configurar a implementação contínua)
As seções a seguir fornecem etapas para configurar a implantação contínua, incluindo como implantar o estágio canário e como promover ou rejeitar o canário por meio de intervenção manual.
Implantar estágio canário
Você pode implantar com YAML ou Classic.
Vá para Pipelines>Environments>Create environment.
Crie um novo ambiente.
- Designação: akscanary
- Recurso: Escolha Kubernetes.
Selecione Avançar e configure seu recurso Kubernetes da seguinte maneira:
- Provedor: Serviço Kubernetes do Azure
- Assinatura do Azure: escolha a assinatura que contém seu cluster do Kubernetes.
- Cluster: escolha o cluster.
- Namespace: crie um novo namespace, com o nome canarydemo.
Selecione Validar e Criar.
Aceda a Pipelines. Selecione o pipeline que você criou e selecione Editar.
Altere a etapa criada anteriormente para agora usar um palco. Adicione mais duas etapas para copiar os manifestos e diretórios misc como artefatos para uso por estágios consecutivos. Você também pode querer mover alguns valores para variáveis, para facilitar o uso mais tarde em seu pipeline. O seu YAML completo deve agora ter este aspeto.
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
Adicione um estágio no final do seu arquivo YAML para implantar a versão canária.
- 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/*
Salve seu pipeline comprometendo-se diretamente com a filial principal. Essa confirmação já deve executar seu pipeline com êxito.
Intervenção manual para promover ou rejeitar canários
Você pode intervir manualmente com YAML ou Classic.
Vá para Pipelines>Environments>Novo ambiente.
Configure o novo ambiente.
- Designação: akspromote
- Recurso: Escolha Kubernetes.
Selecione Avançar e configure seu recurso Kubernetes da seguinte maneira:
- Provedor: Serviço Kubernetes do Azure
- Assinatura do Azure: escolha a assinatura que contém seu cluster do Kubernetes.
- Cluster: escolha o cluster.
- Namespace: escolha o namespace, canarydemo, que você criou anteriormente.
Selecione Validar e Criar.
Selecione seu novo
akspromote
ambiente na lista de ambientes.Selecione Aprovações e verifica>Aprovações. Em seguida, selecione o ícone de reticências (os três pontos).
Configure sua aprovação da seguinte maneira:
- Aprovadores: adicione sua própria conta de usuário.
- Avançado: verifique se a caixa Permitir que os aprovadores aprovem suas próprias execuções está selecionada.
Selecione Criar.
Vá para Pipelines e selecione o pipeline que você criou. Em seguida, selecione Editar.
Adicione outra etapa, , no final do seu arquivo YAML,
PromoteRejectCanary
para promover as alterações.- 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)'
Adicione outro estágio, , no final do arquivo YAML,
RejectCanary
para reverter as alterações.- 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/*'
Salve seu pipeline YAML selecionando Salvar e confirme-o diretamente na ramificação principal.
Implantar uma versão estável
Você pode implantar uma versão estável com YAML ou Classic.
Para a primeira execução do pipeline, a versão estável das cargas de trabalho e suas versões de linha de base ou canárias não existem no cluster. Para implantar a versão estável:
- Em app/app.py, mude
success_rate = 5
parasuccess_rate = 10
. Essa alteração aciona o pipeline, levando a uma compilação e envio da imagem para o registro do contêiner. Também desencadeará oDeployCanary
palco. - Como você configurou uma aprovação no ambiente, a
akspromote
liberação aguardará antes de executar esse estágio. - No resumo da execução, selecione Revisão>Aprovar. Isso implanta a versão estável das cargas de trabalho (a
sampleapp
implantação em manifests/deployment.yml) no namespace.
Iniciar fluxo de trabalho canário
A versão estável da carga de trabalho sampleapp
agora existe no cluster. Em seguida, faça a seguinte alteração no aplicativo de simulação:
Em app/app.py, mude success_rate = 10
para success_rate = 20
.
Essa alteração aciona o pipeline de compilação, resultando na compilação e envio por push da imagem para o registro do contêiner. Esse processo, por sua vez, aciona o pipeline de liberação e inicia o estágio canário de implantação.
Simular solicitações
Em sua máquina de desenvolvimento, execute os seguintes comandos e mantenha-a em execução para enviar um fluxo constante de solicitações no sampleapp
serviço. sampleapp
encaminha as solicitações para os pods girados pela implantação estável sampleapp
e para os pods girados pelas sampleapp-baseline
implantações e sampleapp-canary
. O seletor especificado para sampleapp
é aplicável a todos esses 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/
Configurar o painel do Grafana
Execute o seguinte comando de encaminhamento de porta em sua máquina de desenvolvimento local para poder acessar o Grafana.
kubectl port-forward svc/sampleapp-grafana 3000:80
Em um navegador, abra o seguinte URL.
http://localhost:3000/login
Quando forem solicitadas credenciais, a menos que o
adminPassword
valor tenha sido substituído durante a instalação doprometheus-operator
gráfico de leme, você poderá usar os seguintes valores:- nome de usuário: admin
- senha: prom-operator
No menu à esquerda, escolha +>Dashboard>Graph.
Selecione qualquer lugar no painel recém-adicionado e digite
e
para editar o painel.Na guia Métricas, insira a seguinte consulta:
rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
Na guia Geral, altere o nome deste painel para Todos os pods sampleapp.
Na barra de visão geral na parte superior da página, altere o intervalo de duração para Últimos 5 minutos ou Últimos 15 minutos.
Para salvar esse painel, selecione o ícone Salvar na barra de visão geral.
O painel anterior visualiza métricas de taxa de sucesso de todas as variantes. Estes incluem estável (da implantação), linha de base (da implantação) e canário (da
sampleapp
sampleapp-baseline
sampleapp-canary
implantação). Você pode visualizar apenas as métricas de linha de base e canárias adicionando outro painel, com a seguinte configuração:- Na guia Geral, para Título, selecione sampleapp baseline e canary.
- Na guia Métricas, use a seguinte consulta:
rate(requests_total{pod=~"sampleapp-baseline-.*|sampleapp-canary-.*", custom_status="good"}[1m])
Nota
O painel para métricas de linha de base e canárias só terá métricas disponíveis para comparação sob determinadas condições. Essas condições são quando o estágio Canário de Implantação foi concluído com êxito e o estágio Canário de Promoção/Rejeição está aguardando intervenção manual.
Gorjeta
Configure anotações para painéis do Grafana para retratar visualmente eventos de conclusão de estágio para Implantar canário e Promover/rejeitar canário. Isso é útil para que você saiba quando começar a comparar a linha de base com o canário, e quando a promoção ou rejeição do canário foi concluída, respectivamente.
Comparar linha de base e canário
Neste ponto, o estágio canário de implantação foi concluído com êxito (com base na mudança de de
success_rate
de10
para20
). A fase Promover/rejeitar canário está à espera de intervenção manual. Agora você pode comparar a taxa de sucesso (conforme determinado porcustom_status=good
) das variantes linha de base e canário no painel do Grafana. Deve ter um aspeto semelhante ao seguinte:Com base na observação de que a taxa de sucesso é maior para o canário, promova o canário. Selecione Retomar na tarefa de intervenção manual.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários