Introdução
O Spinnaker é um sistema de entrega contínua de código aberto criado pela Netflix e pelo Google para gerenciar a implantação de apps em diferentes plataformas de computação, incluindo o App Engine, o GKE, o Compute Engine, a AWS e o Azure. Com o Spinnaker, é possível implementar métodos avançados de implantação, incluindo implantações canário.
Em uma implantação canário, você expõe uma nova versão do seu app a uma pequena parte do tráfego de produção e analisa o comportamento dele antes de continuar o processo. Isso permite reduzir os riscos antes de implantar uma nova versão para todos os usuários. Para usar implantações canário, você precisa comparar com precisão o comportamento das versões antiga e nova do aplicativo. As diferenças podem ser sutis e levar algum tempo para aparecer. Além disso, talvez você precise analisar várias métricas diferentes. Leia mais sobre o padrão canário em Estratégias de implantação e teste de aplicativos.
Para resolver esses problemas, há um recurso de análise automática de canários no Spinnaker: as métricas de ambas as versões no sistema de monitoramento são lidas, e uma análise estatística é feita para automatizar a comparação. Neste tutorial, mostramos como fazer uma análise automática de teste canário em um aplicativo implantado no GKE e monitorado pelo Cloud Monitoring.
O Spinnaker é uma plataforma avançada de implantação e gerenciamento de aplicativos para organizações com cenários complexos de implantação, geralmente com uma função de engenharia de versões dedicada. É possível seguir este tutorial sem ter experiência anterior com o Spinnaker. No entanto, a implementação de análise automática de canários na produção geralmente é feita por equipes que têm experiência com o Spinnaker, contam com um sistema de monitoramento forte e sabem como determinar se uma versão é segura.
Sobre este tutorial
O aplicativo neste tutorial é um simples "Hello World" que tem a taxa de erro configurada com uma variável de ambiente. É fornecida uma imagem pré-criada do Docker para esse aplicativo. Conforme ilustrado na imagem a seguir, o aplicativo expõe métricas no formato Prometheus, um sistema de monitoramento de código aberto conhecido na comunidade do Kubernetes e compatível com o Cloud Monitoring.
Objetivos
- Instalar o Spinnaker para o Google Cloud.
- Implantar um aplicativo no GKE sem uma implantação canário.
- Configurar e executar uma implantação canário do aplicativo.
- Configurar a análise automática de canários.
- Testar a análise automática de canários.
Custos
- GKE
- Monitoring
Antes de começar
Selecione ou crie um projeto do Google Cloud.
Ative o faturamento no projeto.
Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Veja mais detalhes em Limpeza.
Implantar o Spinnaker para o Google Cloud usando o Cloud Shell
Nesta seção, você configura a infraestrutura necessária para concluir o tutorial. Execute todos os comandos do terminal no Cloud Shell.
O Spinnaker para Google Cloud oferece uma maneira de configurar e gerenciar o Spinnaker em uma configuração pronta para produção, otimizada para o Google Cloud.
O Spinnaker para Google Cloud configura muitos recursos (GKE, Memorystore, buckets do Cloud Storage e contas de serviço) necessários para executar o Spinnaker no Google Cloud, integra o Spinnaker a serviços relacionados, como o Cloud Build, e fornece um ambiente de gerenciamento baseado no Cloud Shell para suas instalações do Spinnaker, com auxiliares e ferramentas comuns, como spin
e hal
.
No Cloud Shell, abra o Spinnaker para o Google Cloud. Isso clona o repositório do Spinnaker para Google Cloud (em inglês) no ambiente do Cloud Shell e inicia as instruções detalhadas de instalação.
Instale o Spinnaker para o Google Cloud:
PROJECT_ID=${DEVSHELL_PROJECT_ID} ~/cloudshell_open/spinnaker-for-gcp/scripts/install/setup_properties.sh ~/cloudshell_open/spinnaker-for-gcp/scripts/install/setup.sh
Instale o plug-in de integração do Monitoring-Prometheus:
export KUBE_NAMESPACE=prometheus export GCP_PROJECT=$DEVSHELL_PROJECT_ID export DATA_DIR=/prometheus/ export DATA_VOLUME=prometheus-storage-volume export SIDECAR_IMAGE_TAG=0.7.0 export GCP_REGION=us-east1-c export KUBE_CLUSTER=spinnaker-1 export PROMETHEUS_VER_TAG=latest kubectl create namespace ${KUBE_NAMESPACE} kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-stackdriver-gke/master/prometheus-service-account.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-stackdriver-gke/master/prometheus-configmap.yaml curl -sS https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-stackdriver-gke/master/gke-prometheus-deployment.yaml | \ envsubst | \ kubectl apply -f -
Reinicie o Cloud Shell para carregar as novas configurações de ambiente.
Conecte-se ao Spinnaker:
~/cloudshell_open/spinnaker-for-gcp/scripts/manage/connect_unsecured.sh
No Cloud Shell, selecione o ícone Visualização da Web e Visualizar na porta 8080.
Como implantar um aplicativo com o Spinnaker
Nesta seção, mostramos como configurar o Spinnaker para implantar um aplicativo no cluster do GKE.
Criar um aplicativo do Spinnaker
Antes de implantar, crie o aplicativo Spinnaker.
No Spinnaker, selecione Ações e Criar aplicativo.
Na caixa de diálogo Novo aplicativo, insira os seguintes valores:
- Nome:
sampleapp
E-mail do proprietário:
[example@example.com]
- Nome:
Selecione Criar.
Você está agora no sampleapp do Spinnaker. A configuração ainda não foi feita, por isso, a maioria das guias está vazia.
Criar e executar um pipeline de implantação
Nesta seção, primeiro implante o aplicativo com um pipeline simples do Spinnaker que usa um parâmetro successRate
para criar uma implantação do GKE com quatro pods. Esses Pods geram erros aleatoriamente a uma taxa correspondente ao parâmetro successRate
. Neste tutorial, eles lançam 500 erros a uma taxa de 100 - successRate
.
No Cloud Shell, crie o pipeline com o arquivo JSON fornecido. O comando a seguir publica a definição JSON do pipeline diretamente na API Spinnaker.
cd ~ wget https://raw.githubusercontent.com/spinnaker/spinnaker/master/solutions/kayenta/pipelines/simple-deploy.json sed "s/my-kubernetes-account/spinnaker-install-account/g" simple-deploy.json > updated-simple-deploy.json spin pipeline save --file updated-simple-deploy.json
Na seção "Pipelines" do Spinnaker, um pipeline chamado
Simple deploy
é exibido. Se ele não estiver visível, atualize a página. Selecione Iniciar execução manual.Na janela Confirmar execução, selecione uma Taxa de sucesso de 70 e selecione Executar. Após alguns segundos, a configuração do aplicativo e quatro Pods terão sido implantados com sucesso pelo pipeline.
No Cloud Shell, crie um Pod para fazer solicitações ao novo aplicativo até o final do tutorial.
kubectl -n default run injector --generator=run-pod/v1 --image=alpine:3.10 -- \ /bin/sh -c "apk add --no-cache curl; \ while true; do curl -sS --max-time 3 \ http://sampleapp:8080/; done"
Verificar os registros do injetor
Para ver o comportamento do aplicativo, verifique os registros do injetor:
kubectl -n default logs -f \ $(kubectl -n default get pods -l run=injector \ -o=jsonpath='{.items[0].metadata.name}')
Os registros exibem um grande número de mensagens de erro interno do servidor. Para parar de acompanhar os registros do injetor, pressione Ctrl + C.
Verificar a integridade do aplicativo
Agora que o aplicativo está implantado e disponibilizando tráfego, veja se ele está se comportando corretamente. Claro que, neste tutorial, você já sabe que não está, porque implantou o aplicativo com uma taxa de sucesso de apenas 70%.
O aplicativo expõe um endpoint /metrics
com métricas no formato Prometheus que são ingeridas pelo Monitoring. Nesta seção, você visualiza essas métricas no Monitoring.
No Console do Google Cloud, acesse o Monitoring.
Se o Metrics Explorer for exibido no painel de navegação, selecione
Metrics Explorer. Caso contrário, selecione apps Recursos e, em seguida, Metrics Explorer.
Verifique se Configuração é a guia selecionada.
Marque a caixa Métrica e insira
external.googleapis.com/prometheus/rest_client_requests_total
.Para refinar o gráfico, no campo Agrupar por, digite
code
.No gráfico a seguir, as taxas de solicitações HTTP respondidas pelo aplicativo são agrupadas pelo código de status HTTP:
Se você não tiver dados no Monitoring ou se não conseguir encontrar a métrica external.googleapis.com/prometheus/rest_client_requests_total, aguarde alguns minutos para que os dados sejam processados pelo Monitoring antes de recarregar o Metrics Explorer.
Como visto no gráfico, o app atualmente tem uma taxa de erro inaceitável, em torno de 30%, conforme o esperado. No restante do tutorial, você saberá como configurar um pipeline de implantação canário e uma análise automática para evitar implantações futuras de apps com taxa de erro tão alta.
Como criar uma implantação canário
Nesta seção, você cria um pipeline de implantação canário sem análise automática para testar a nova versão do app antes de implantá-lo totalmente na produção. Para simplificar, o pipeline criado nesta seção depende do balanceamento de carga do Kubernetes para enviar tráfego para a versão canário. Como consequência, não é possível escolher qual parte do tráfego será encaminhada para o canário. Para implementar políticas avançadas de roteamento de tráfego, use o Istio.
Na imagem a seguir, são descritos diferentes estágios desse pipeline:
Etapa 0: assim como no pipeline Simple Deploy, um parâmetro de Success Rate é usado como entrada. No novo pipeline, esse parâmetro é usado para simular diferentes taxas de sucesso. Esta é a configuração do pipeline.
Etapa 1: a etapa Find Baseline Version recupera a versão atual do app em execução na produção a partir da execução mais recente do pipeline Simple Deploy. Neste tutorial, a taxa de sucesso do aplicativo implantado atualmente é recuperada.
Simultaneamente à etapa Find Baseline Version, a nova configuração de taxa de sucesso da versão canário do app é implantada na etapa Deploy Canary Config.
Etapa 2: as etapas Deploy Canary e Deploy Baseline implantam as duas versões para comparação: a nova versão canário e uma versão de referência. A versão canário usa a configuração criada em Implantar configuração canário, enquanto a de referência usa a configuração usada pela versão de produção.
Etapa 3: a etapa Manual Judgement interrompe o pipeline até que você o continue. Durante essa etapa, é possível verificar se o comportamento da versão canário está correto.
Etapa 4: se você continuar depois da etapa Manual Judgement, as etapas Delete Canary e Delete Baseline apagarão a infraestrutura.
Simultaneamente à limpeza, a etapa Deploy to Production é iniciada, e o pipeline Simple Deploy é acionado com o mesmo parâmetro de Success Rate fornecido inicialmente. A mesma versão do aplicativo que você testou em uma implantação canário é implantada na produção.
A etapa Implantar para a produção será acionada somente se você optar por continuar durante a etapa Julgamento manual.
Etapa 5: por último, a etapa Successful Deployment confirma que todo o pipeline foi bem-sucedido. Sua autorização no estágio Julgamento manual é verificada, e a execução só ocorrerá se os estágios Implantar para produção, Excluir implantação canário e Excluir valor de referência forem executadas com êxito.
Agora, crie e execute o pipeline Canary Deploy.
Crie o pipeline Implantação canário. Para isso, execute o seguinte comando para buscar o ID do pipeline Implantação simples e injetá-lo no pipeline Implantação canário:
cd ~ wget https://raw.githubusercontent.com/spinnaker/spinnaker/master/solutions/kayenta/pipelines/canary-deploy.json export PIPELINE_ID=$(spin pipeline get -a sampleapp -n 'Simple deploy' | jq -r '.id') jq '(.stages[] | select(.refId == "9") | .pipeline) |= env.PIPELINE_ID | (.stages[] | select(.refId == "8") | .pipeline) |= env.PIPELINE_ID' canary-deploy.json | \ sed "s/my-kubernetes-account/spinnaker-install-account/g" > updated-canary-deploy.json spin pipeline save --file updated-canary-deploy.json
Se você não encontrar o pipeline Implantação canário no Spinnaker, atualize a página sampleapp e selecione Pipelines.
Para iniciar o pipeline Canary Deploy:
- Selecione Iniciar execução manual.
- Selecione uma Taxa de sucesso de 80.
- Selecione Executar.
Quando o pipeline chegar ao estágio Julgamento manual, não selecione Continuar porque você precisa comparar a versão canário com a versão de referência.
No Cloud Shell, execute o comando
kubectl -n default get pods
para ver os novos Pods rotulados comocanary
ebaseline
:NAME READY STATUS RESTARTS AGE injector-66bd655ffd-9ntwx 1/1 Running 0 30m sampleapp-5cdf8f55dd-995rz 1/1 Running 0 28m sampleapp-5cdf8f55dd-dqq8n 1/1 Running 0 28m sampleapp-5cdf8f55dd-ntq57 1/1 Running 0 28m sampleapp-5cdf8f55dd-rlpzp 1/1 Running 0 28m sampleapp-baseline-567b8d6849-gsgqr 1/1 Running 0 4m sampleapp-canary-54b9759dd6-gmjhc 1/1 Running 0 4m
No Console do Google Cloud, acesse o Monitoring.
Se o Metrics Explorer for exibido no painel de navegação, selecione
Metrics Explorer. Caso contrário, selecione appsRecursos e, em seguida, Metrics Explorer.
Verifique se Configuração é a guia selecionada.
Para exibir a taxa de erro do valor de referência e do canário, especifique os seguintes parâmetros:
- Métrica:
external.googleapis.com/prometheus/rest_client_requests_total
- No campo Agrupar por, digite
code
.
Se faltarem alguns dados no Monitoring, aguarde alguns minutos.
- Métrica:
Compare a versão canário (em roxo no gráfico a seguir) com a de referência (em azul no gráfico a seguir). As cores podem ser diferentes no seu gráfico. Neste tutorial, a versão canário tem uma taxa de erro menor que a de referência. Portanto, é seguro implantar a versão canário por completo na produção. Se ela não tiver uma taxa de erro menor, interrompa a implantação nesse estágio e faça algumas correções no app.
No Spinnaker, na caixa de diálogo Julgamento manual, selecione Continuar.
Quando a implantação for concluída, volte para o Monitoring.
Se o Metrics Explorer for exibido no painel de navegação, selecione
Metrics Explorer. Caso contrário, selecione apps Recursos e, em seguida, Metrics Explorer.
Verifique se Configuração é a guia selecionada.
Marque a caixa Métrica e, em seguida, insira ou selecione o nome do recurso e da métrica no menu. Use as informações a seguir para preencher os campos dessa caixa de texto:
- Em Métrica, selecione ou insira
external.googleapis.com/prometheus/rest_client_requests_total
. - No campo Agrupar por, digite
code
.
No gráfico a seguir, a taxa de solicitações HTTP respondidas pelo aplicativo é dividida pelo código de status HTTP:
Neste gráfico, é exibida a taxa de códigos HTTP, 200 e 500, para todos os Pods: produção, referência e canário. Como a versão canário apresentava uma taxa de erro menor, você a implantou na produção. Após um curto período de tempo durante a implantação, em que o número total de solicitações é um pouco menor, é possível ver que a taxa de erro geral foi reduzida: a versão canário foi implantada corretamente na produção.
- Em Métrica, selecione ou insira
Como automatizar a análise de canários
Uma implantação canário é útil, mas a maneira como ela é configurada atualmente é um processo manual. É preciso verificar manualmente se o comportamento do canário é o que você quer antes de executar uma implantação completa, e a diferença entre a versão canário e a de referência nem sempre é clara.
Automatizar a análise de canários é uma boa ideia: você não precisa fazer isso sozinho e, para detectar problemas em um conjunto de métricas, uma análise estatística automática é mais adequada que uma análise humana. Nesta seção, o estágio Julgamento manual é substituído por uma análise automática de teste canário.
Ativar o suporte ao canário
No Spinnaker, primeiro configure o recurso de análise automática de canários, chamado Kayenta. Para configurar o Kayenta, use o Halyard, a mesma ferramenta usada para configurar e implantar o Spinnaker.
Configure o Kayenta para usar o Monitoring como back-end:
hal config canary google enable hal config canary google account add kayenta-tutorial --project $DEVSHELL_PROJECT_ID hal config canary google edit --stackdriver-enabled=true
Aplique a nova configuração:
~/cloudshell_open/spinnaker-for-gcp/scripts/manage/push_and_apply.sh
A implantação leva alguns minutos para ser concluída.
Configurar o recurso de análise automática de teste canário
Agora que o Kayenta está ativado, configure-o para sampleapp
.
No Spinnaker, selecione Config.
Na seção Recursos, selecione Canário e selecione Salvar alterações.
Criar uma configuração canário
Na análise automática de canários do Spinnaker, um teste estatístico é realizado com base em diferentes métricas, e uma pontuação é gerada. Essa pontuação, que pode variar de 0 a 100, representa o número de métricas que são aprovadas ou reprovadas na comparação entre a referência e o canário. É possível manipular a pontuação ao colocar as métricas em grupos diferentes, com pesos distintos para cada um. Dependendo da pontuação da análise, cabe a você decidir se prossegue ou não com a implantação. Se você usar uma só métrica, como neste tutorial, a pontuação só poderá ser 0 (falha) ou 100 (aprovação).
Um app pode ter várias configurações canário que podem ser compartilhadas em diversos aplicativos. Uma configuração canário tem dois elementos principais:
- Um conjunto de métricas para analisar, possivelmente em grupos diferentes
- Limites marginal e de aprovação para a pontuação
Em um pipeline de implantação, uma configuração canário é usada durante a etapa Canary Analysis, em que pode haver várias execuções da versão canário. Se a pontuação de qualquer execução estiver abaixo do limite marginal, a etapa será interrompida e as outras execuções não serão feitas. A pontuação da última execução precisa estar acima do limite de aprovação para que toda a etapa seja considerada bem-sucedida.
Para criar uma configuração canário, siga estas etapas:
- Agora que o canário está ativado, a seção Pipelines é substituída por Delivery. Caso a seção Delivery não apareça, recarregue o Spinnaker. Na seção Envio, acesse Configs canários.
- Selecione Adicionar configuração.
- Em Nome da configuração, digite
kayenta-test
. - Na seção Métricas, selecione Adicionar métrica.
Na caixa de diálogo Adicionar métrica, insira os seguintes valores e selecione OK:
- Nome:
error_rate
- Falha em:
increase
- Tipo de recurso:
k8s_container
- Tipo de métrica:
external.googleapis.com/prometheus/rest_client_requests_total
- Alinhador:
ALIGN_RATE
Modelo de filtro: escolha Criar novo
- Em Nome do novo modelo de filtro, insira:
http_code
- Em Modelo do novo modelo de filtro, insira:
metric.labels.http_code = "500" AND resource.label.pod_name = starts_with("${scope}")
- Selecione Salvar.
- Em Nome do novo modelo de filtro, insira:
- Nome:
Na seção Pontuação, defina o Grupo 1 como 100.
Selecione Salvar alterações.
Adicionar um estágio de análise de teste canário ao pipeline
Agora que você tem uma configuração canário, modifique o pipeline de implantação atual para substituir a etapa Manual Judgement por uma Canary Analysis que use essa configuração.
Acesse Envio > Pipelines e, no pipeline Implantação canário, selecione Configurar.
Selecione Adicionar estágio.
Para Tipo, selecione Análise de teste canário.
Na seção Depends On, modifique a nova etapa para que dependa das seleções a seguir:
- Implantar canário
- Implantar valor de referência
Preencha a seção Configuração da análise de teste canário com os seguintes valores:
Nome do parâmetro Valor Definição Analysis Type Real Time (Manual) O modo automático, em que o canário e a referência são criados automaticamente, ainda não está disponível para o Kubernetes. Config Name kayenta-test
O nome da configuração canário que você criou anteriormente. Lifetime 0 hours 5 minutes Quanto tempo a análise de canários costuma durar. Atraso 0 O tempo que você dá ao aplicativo para aquecer antes da análise. Interval 5 A janela de tempo que o Kayenta usa para executar uma única análise estatística. Baseline sampleapp-baseline
A implantação do GKE usada como referência pelo Kayenta. Baseline Location default O namespace do GKE em que a referência é encontrada. Canary sampleapp-canary
A implantação do GKE usada como canário pelo Kayenta. Canary Location default Namespace do GKE em que o canário reside. Marginal 75 A pontuação limite para um passe canário. Pass 95 A pontuação limite para um passe canário geral. Na seção Execution Options, selecione Ignore the failure. Ignore a falha para que seja possível destruir a referência e os canários, mesmo em caso de falha da análise. Posteriormente, no tutorial, você modificará os estágios para considerar uma potencial falha dos canários.
No esquema do pipeline, selecione Implantar para produção.
Altere a seção Depende de para os seguintes parâmetros:
- Adicione Análise de teste canário.
- Remova Julgamento manual.
Para garantir que a implantação só ocorra na produção se a análise de teste canário for bem-sucedida, altere o parâmetro Condições na expressão.
${ #stage('Canary Analysis')['status'].toString() == 'SUCCEEDED'}
No esquema do pipeline, selecione Excluir canário e altere a seção Depende de para os seguintes parâmetros:
- Adicione Análise de teste canário.
- Remova Julgamento manual.
No esquema do pipeline, selecione Excluir valor de referência e altere a seção Depende de.
- Adicione Análise de teste canário.
- Remova Julgamento manual.
Para garantir que todo o pipeline falhe se a análise de teste canário falhar, selecione Implantação bem-sucedida no esquema do pipeline e, em seguida, selecione o ícone Editar.
Altere Expressão para:
${ #stage('Canary Analysis')['status'].toString() == 'SUCCEEDED'}
Selecione Atualizar.
Termine de substituir o cenário Julgamento manual pelo cenário recém-criado análise de teste canário.
- No esquema do pipeline, selecione Julgamento manual.
- Selecione Remover estágio.
Selecione Salvar alterações.
O pipeline agora se parece com a imagem a seguir:
Testar o novo pipeline
Agora que a análise automática de teste canário está configurada, teste o pipeline para garantir que ele tenha o comportamento esperado.
Acesse Envio > Pipelines e, no pipeline implantação canário ou Implantação canário automatizada, selecione Iniciar execução manual se você tiver usado a CLI.
Selecione uma Taxa de sucesso de 60 e selecione Executar.
Para verificar o progresso atual da análise de teste canário, selecione Análise de teste canários e selecione Status da tarefa. Após alguns minutos, o estágio Análise de teste canário falha, porque a taxa de sucesso atual na produção é
80
. Quando a Análise de teste canário falhar, acesse o relatório dessa análise.- Selecione Análise de teste canário.
- Selecione Resumo canário.
Selecione o ícone Relatório.
Na página do relatório, a taxa de erro é maior para a versão canário do que para a de referência.
Repita as etapas desta seção, mas selecione uma Taxa de sucesso de 90 para conseguir uma análise de teste canário bem-sucedida.
Limpeza
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
- No Console do Google Cloud, acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.
Excluir os recursos
Se você quiser manter o projeto do Google Cloud usado neste tutorial, exclua os recursos individuais:
Exclua o cluster do GKE.
gcloud container clusters delete spinnaker-1
Quando a confirmação for solicitada, digite
Y
.
A seguir
- Leia mais sobre o Spinnaker.
- Assista ao vídeo que mostra como o Waze e a Netflix usam o Spinnaker e o Kayenta.
- Consulte todos os recursos sobre entrega contínua.
- Veja um codelab que abrange a entrega contínua para GKE usando o Spinnaker.
- Confira o spin, uma ferramenta de CLI para gerenciar aplicativos e pipelines do Spinnaker.
- Leia sobre outras estratégias de implantação e teste de aplicativos.
- Explore arquiteturas de referência, diagramas, tutoriais e práticas recomendadas sobre o Google Cloud. Confira o Centro de arquitetura do Cloud.