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
Indica o nome do recurso de implementação e do recurso de serviço.
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
.
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.
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 fasestable
Pode ativar a validação da implementação (
verify: true
). Se o fizer, é ativada uma tarefaverify
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
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.
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.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
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.
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.
Repare que, neste exemplo, a implementação tem uma fase
canary-50
e uma fasestable
. A implementação pode ter mais fases ou fases diferentes.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?
Experimente o início rápido da implementação canary.
Saiba como gerir o ciclo de vida das implementações de testes beta.
Saiba mais sobre a implementação em paralelo.
Saiba mais sobre as estratégias de implementação do Cloud Deploy.