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

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.
  • ./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.
  • ./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 para sampleapp 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

  1. Vá para Configurações>do projeto Pipelines Conexões de serviço no menu Azure DevOps.>
  2. Crie uma conexão de serviço de registro do Docker associada ao seu registro de contêiner. Nomeie-o azure-pipelines-canary-k8s.
  3. 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

  1. Vá para Pipelines>Create Pipeline e selecione seu repositório.

  2. Na guia Configurar, escolha Pipeline inicial.

  3. 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á para example.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-k8sa .

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.

  1. Vá para Pipelines>Environments>Create environment.

  2. Crie um novo ambiente.

    • Designação: akscanary
    • Recurso: Escolha Kubernetes.
  3. 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.
  4. Selecione Validar e Criar.

  5. Aceda a Pipelines. Selecione o pipeline que você criou e selecione Editar.

  6. 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
    
  7. 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/*
    
  8. 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.

  1. Vá para Pipelines>Environments>Novo ambiente.

  2. Configure o novo ambiente.

    • Designação: akspromote
    • Recurso: Escolha Kubernetes.
  3. 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.
  4. Selecione Validar e Criar.

  5. Selecione seu novo akspromote ambiente na lista de ambientes.

  6. Selecione Aprovações e verifica>Aprovações. Em seguida, selecione o ícone de reticências (os três pontos).

  7. 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.
  8. Selecione Criar.

  9. Vá para Pipelines e selecione o pipeline que você criou. Em seguida, selecione Editar.

  10. Adicione outra etapa, , no final do seu arquivo YAML, PromoteRejectCanarypara 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)'
    
  11. Adicione outro estágio, , no final do arquivo YAML, RejectCanarypara 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/*'
    
  12. 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:

  1. Em app/app.py, mude success_rate = 5 para success_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á o DeployCanary palco.
  2. Como você configurou uma aprovação no ambiente, a akspromote liberação aguardará antes de executar esse estágio.
  3. 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

  1. 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
    
  2. Em um navegador, abra o seguinte URL.

    http://localhost:3000/login
    
  3. Quando forem solicitadas credenciais, a menos que o adminPassword valor tenha sido substituído durante a instalação do prometheus-operator gráfico de leme, você poderá usar os seguintes valores:

    • nome de usuário: admin
    • senha: prom-operator
  4. No menu à esquerda, escolha +>Dashboard>Graph.

  5. Selecione qualquer lugar no painel recém-adicionado e digite e para editar o painel.

  6. Na guia Métricas, insira a seguinte consulta:

    rate(requests_total{pod=~"sampleapp-.*", custom_status="good"}[1m])
    
  7. Na guia Geral, altere o nome deste painel para Todos os pods sampleapp.

  8. 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.

  9. Para salvar esse painel, selecione o ícone Salvar na barra de visão geral.

  10. 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 sampleappsampleapp-baselinesampleapp-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

  1. Neste ponto, o estágio canário de implantação foi concluído com êxito (com base na mudança de de success_rate de 10 para 20). A fase Promover/rejeitar canário está à espera de intervenção manual. Agora você pode comparar a taxa de sucesso (conforme determinado por custom_status=good) das variantes linha de base e canário no painel do Grafana. Deve ter um aspeto semelhante ao seguinte:

    Screenshot that shows a comparison of baseline and canary metrics.

  2. 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.