Implementações canárias no GKE e GKE Enterprise através de redes baseadas em serviços

Este documento descreve como configurar e usar implementações canary para implementar as suas aplicações no GKE ou GKE Enterprise através da implementação na nuvem com redes baseadas em serviços.

Uma implementação canária é uma implementação progressiva de uma nova versão da sua aplicação, em que aumenta gradualmente a percentagem de tráfego enviado para a nova versão, enquanto monitoriza o desempenho da aplicação. Isto ajuda a detetar potenciais problemas antecipadamente e a minimizar o impacto nos seus utilizadores.

Como funcionam as implementações canárias para o GKE e o GKE Enterprise com redes baseadas em serviços

  1. Indica o nome do recurso de implementação e do recurso de serviço.

  2. O Cloud Deploy cria um recurso de implementação adicional com o nome da sua implementação atual mais -canary.

Os segredos e os ConfigMaps também são copiados e renomeados com -canary.

  1. O Cloud Deploy modifica o serviço para ajustar o seletor de modo a selecionar os pods na implementação atual e os pods de teste.

    O Cloud Deploy calcula o número de pods a usar para o canary com base no cálculo descrito na secção de aprovisionamento de pods. Esse cálculo difere consoante ative ou desative o aprovisionamento excessivo de pods.

    Se passarmos para a fase stable O Cloud Deploy adiciona as etiquetas a usar para corresponder aos pods, pelo que estão disponíveis para execuções canárias subsequentes.

    O Cloud Deploy cria uma implementação que inclui a percentagem de pods específica da fase, atualizando-a para cada fase. Isto é feito calculando o número de grupos como uma percentagem do número original de grupos. Isto pode resultar numa divisão de tráfego inexata. Se precisar de uma divisão exata do tráfego, pode consegui-lo através da API Gateway.

  2. Durante a fase stable, a implementação -canary é reduzida a zero e a implementação original é substituída pela nova implementação.

    O Cloud Deploy não modifica a implementação original até à fase stable, a menos que desative o aprovisionamento excessivo.

O Cloud Deploy aprovisiona agrupamentos para alcançar a percentagem de testes canários pedida o mais próximo possível. Isto baseia-se no número de grupos de anúncios e não no tráfego para os grupos de anúncios. Se quiser que o teste canary se baseie no tráfego, tem de usar a API Gateway.

Para o teste de canários baseado na rede do GKE, pode ativar ou desativar o aprovisionamento excessivo de pods. As secções seguintes descrevem como o Cloud Deploy calcula o número de pods a aprovisionar para a implementação de testes beta para cada fase de testes beta.

Aprovisionamento de agrupamentos com aprovisionamento excessivo ativado

A ativação do aprovisionamento excessivo (disablePodOverprovisioning: false) permite que o Cloud Deploy crie pods adicionais suficientes para executar a percentagem de testes canários pretendida, com base no número de pods que executam a sua implementação existente. A fórmula seguinte mostra como o Cloud Deploy calcula o número de pods a aprovisionar para a implementação canária para cada fase canária, quando o aprovisionamento excessivo de pods está ativado:

math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))

Com esta fórmula, a contagem de réplicas atual (o número de pods que já tem, antes desta versão canary) é multiplicada pela percentagem da versão canary para a fase, e o resultado é dividido por (100 menos a percentagem).

Por exemplo, se já tiver 4 pods e a fase de teste canary for de 50%, o número de pods de teste canary é 4. (O resultado de 100-percentage é usado como uma percentagem: 100-50=50, tratado como .50.)

O aprovisionamento excessivo de pods é o comportamento predefinido.

Aprovisionamento de agrupamentos com o aprovisionamento excessivo desativado

Pode desativar o aprovisionamento excessivo (disablePodOverprovisioning: true) para garantir que o Cloud Deploy não aumenta o número de réplicas.

A fórmula seguinte mostra como o Cloud Deploy calcula o aprovisionamento de pods para a implementação de testes canários para cada fase de testes canários, quando o aprovisionamento excessivo de pods está desativado:

math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)

Nesta fórmula, ReplicaCountOfCanaryDeploymentOnCluster só existe se já tiver existido uma fase de teste beta. Se esta for a primeira fase de teste canário, não existe ReplicaCountOfCanaryDeploymentOnCluster.

Se começar com 4 pods, esse número é multiplicado pela percentagem de teste canário (por exemplo, 50% ou .5) para obter 2. Assim, a implementação original é agora reduzida para 2 e são criados 2 novos pods para a implementação canary. Se tiver uma fase de teste de 75%, tem 2 (implementação original) +2 (primeira fase de teste), *.75, para obter 3 pods de teste e 1 pod a executar a implementação original.

Com o Cloud Deploy, pode configurar implementações canary para o GKE e o GKE Enterprise numa única fase ou em várias fases.

As instruções aqui incluem apenas o que é específico da configuração de testes canários. O documento Implemente num cluster do Google Kubernetes Engine tem as instruções gerais para configurar e executar o pipeline de implementação.

Certifique-se de que tem as autorizações necessárias

Além de outras autorizações de gestão de identidades e acessos necessárias para usar o Cloud Deploy, precisa das seguintes autorizações para realizar ações adicionais que podem ser necessárias para uma implementação canary:

  • clouddeploy.rollouts.advance
  • clouddeploy.rollouts.ignoreJob
  • clouddeploy.rollouts.cancel
  • clouddeploy.rollouts.retryJob
  • clouddeploy.jobRuns.get
  • clouddeploy.jobRuns.list
  • clouddeploy.jobRuns.terminate

Consulte as funções e autorizações de IAM para mais informações sobre as funções disponíveis que incluem estas autorizações.

Prepare o seu skaffold.yaml

O ficheiro skaffold.yaml define como os seus manifestos do Kubernetes são renderizados e implementados. Para uma implementação canary no GKE/GKE Enterprise, certifique-se de que aponta corretamente para os seus manifestos e define todos os artefactos de compilação necessários. Não é necessária nenhuma configuração especial específica do teste canário no próprio skaffold.yaml, além do que é necessário para uma implementação padrão. Pode usar perfis do Skaffold para gerir diferentes variações de manifestos para fases de testes canários personalizados.

Prepare os manifestos do Kubernetes

Os seus manifestos do Kubernetes têm de incluir um recurso Deployment e um recurso Service. O Service tem de definir um selector que corresponda às etiquetas dos agrupamentos geridos pelo Deployment. A etiqueta predefinida que o Cloud Deploy procura é app, mas pode ser configurada no pipeline.

Configure um teste canário automatizado

Configure um lançamento canary automatizado diretamente na definição do pipeline de entrega para uma fase específica do GKE ou GKE Enterprise através da rede de serviços Kubernetes padrão.

Na fase do pipeline, inclua uma propriedade strategy, da seguinte forma:

serialPipeline:
  stages:
  - targetId: prod
    profiles: []
    strategy:
      canary:
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "SERVICE_NAME"
              deployment: "DEPLOYMENT_NAME"
              podSelectorLabel: "LABEL"
        canaryDeployment:
          percentages: [PERCENTAGES]
          verify: true|false
          predeploy:
            actions: "PREDEPLOY_ACTION"
          postdeploy:
            actions: "POSTDEPLOY_ACTION"

Nesta configuração…

  • SERVICE_NAME é o nome do serviço Kubernetes, definido no seu manifesto.

  • DEPLOYMENT_NAME é o nome da sua implementação do Kubernetes, definido no manifesto.

  • LABEL é uma etiqueta de seletor de pod. Tem de corresponder ao seletor de etiquetas no serviço Kubernetes definido no seu manifesto. Esta ação é opcional. A predefinição é app.

  • PERCENTAGES é uma lista de valores de percentagem separados por vírgulas que representam os seus incrementos de teste canário, por exemplo, [5, 25, 50].

    Além disso, isto não inclui 100, porque a implementação de 100% é presumida no teste canary e é processada pela fase stable

  • Pode ativar a validação da implementação (verify: true). Se o fizer, é ativada uma tarefa verify em cada fase.

  • PREDEPLOY_ACTION

    É igual ao ACTION_NAME que usou no seu skaffold.yaml para definir a ação personalizada que quer executar antes de implementar.

  • POSTDEPLOY_ACTION

    É igual ao ACTION_NAME que usou no seu skaffold.yaml para definir a ação personalizada que quer executar após a implementação.

Configure um canary automatizado personalizado

Isto combina a definição de fases personalizadas (nomes, percentagens, perfis, validação, hooks) com a gestão de tráfego automática do Cloud Deploy para o GKE ou o GKE Enterprise. Define as fases, mas o Cloud Deploy processa a manipulação de recursos subjacente com base nas percentagens e no runtimeConfig escolhido.

Para configurar esta opção, inclua uma secção runtimeConfig com serviceNetworking e a secção customCanaryDeployment (que define phaseConfigs) no bloco strategy.canary. O Cloud Deploy usa os perfis do Skaffold especificados para a renderização, mas ajusta automaticamente o tráfego de acordo com as percentagens de runtimeConfig e de fases.

serialPipeline:
  stages:
  - targetId: gke-prod
    profiles: []
    strategy:
      canary:
        # Include runtimeConfig for automatic traffic management
        runtimeConfig:
          kubernetes:
            serviceNetworking:
              service: "my-app"
              deployment: "my-deployment"
        # Include customCanaryDeployment for phase customization
        customCanaryDeployment:
          phaseConfigs:
          - phaseId: "warmup"
            percentage: 10
            profiles: ["profile-a"] # Profile used for rendering this phase
            verify: true
          - phaseId: "scaling"
            percentage: 50
            profiles: ["profile-b"] # Different profile for this phase
            verify: true
          - phaseId: "stable"
            percentage: 100
            profiles: ["profile-b"] # Can reuse profiles
            verify: true

Execute o teste canary do GKE ou GKE Enterprise

  1. Registe o pipeline e os alvos: aplique os ficheiros de configuração do pipeline de entrega e do alvo do GKE ou GKE Enterprise.

    
    gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION
    gcloud deploy apply --file=gke-targets.yaml --region=REGION
    

    O pipeline de implementação inclui a configuração canary automática ou personalizada para o tempo de execução escolhido.

  2. Crie uma versão: inicie a implementação, indicando o nome da imagem.

    
    gcloud deploy releases create RELEASE_NAME \
                                    --delivery-pipeline=PIPELINE_NAME \
                                    --region=REGION
      # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1
      # Add --skaffold-file or --source if not using default Skaffold config discovery
    

    O pipeline de entrega identificado por PIPELINE_NAME contém a configuração de teste canary automatizada ou personalizada descrita neste documento.

  3. Avançar o teste:

    CLI gcloud

    gcloud deploy rollouts advance ROLLOUT_NAME \
                                --release=RELEASE_NAME \
                                --delivery-pipeline=PIPELINE_NAME \
                                --region=REGION
    

    Onde:

    ROLLOUT_NAME é o nome da implementação atual que está a avançar para a fase seguinte.

    RELEASE_NAME é o nome do lançamento do qual esta implementação faz parte.

    PIPELINE_NAME é o nome do pipeline de entrega que está a usar para gerir a implementação deste lançamento.

    REGION é o nome da região em que o lançamento foi criado, por exemplo, us-central1. Este campo é obrigatório.

    Consulte a referência do Google Cloud SDK para mais informações acerca do comando gcloud deploy rollouts advance.

    Google Cloud consola

    1. Abra a página Pipelines de fornecimento.

    2. Clique no pipeline apresentado na lista de pipelines de fornecimento.

      A página de detalhes do pipeline de fornecimento mostra uma representação gráfica do progresso do pipeline de fornecimento.

    3. No separador Implementações, em Detalhes do pipeline de fornecimento, clique no nome da implementação.

      É apresentada a página de detalhes da implementação para essa implementação.

      detalhes da implementação na consola Google Cloud

      Repare que, neste exemplo, a implementação tem uma fase canary-50 e uma fase stable. A implementação pode ter mais fases ou fases diferentes.

    4. Clique em Avançar implementação.

      A implementação avança para a fase seguinte.

Fases ignoradas

Se implementar uma versão canary e a sua aplicação ainda não tiver sido implementada nesse tempo de execução, o Cloud Deploy ignora a fase canary e executa a fase estável. Consulte a secção Ignorar fases na primeira vez para saber por que motivo isto acontece.

O que se segue?