Este guia explica como fazer implementações azul/verde sem tempo de inatividade em grupos de instâncias geridos (MIGs) do Compute Engine através do Cloud Build e do Terraform.
O Cloud Build permite-lhe automatizar uma variedade de processos de programadores, incluindo a criação e a implementação de aplicações em vários Google Cloud tempos de execução como o Compute Engine, Google Kubernetes Engine, GKE Enterprise e funções do Cloud Run.
Os GIGs do Compute Engine permitem-lhe operar aplicações em várias máquinas virtuais (VMs) idênticas. Pode tornar as suas cargas de trabalho escaláveis e altamente disponíveis tirando partido dos serviços de MIG automatizados, incluindo: escalamento automático, autocura, implementação regional (várias zonas) e atualização automática. Com o modelo de implementação contínua azul/verde, vai aprender a transferir gradualmente o tráfego de utilizadores de um MIG (azul) para outro MIG (verde), ambos em execução na produção.
Vista geral do design
O diagrama seguinte mostra o modelo de implementação azul/verde usado no exemplo de código descrito neste documento:
A um nível elevado, este modelo inclui os seguintes componentes:
- Dois conjuntos de VMs do Compute Engine: azul e verde.
- Três balanceadores de carga HTTP(S) externos:
- Um equilibrador de carga azul/verde que encaminha o tráfego dos utilizadores finais para o conjunto azul ou verde de instâncias de VM.
- Um equilibrador de carga azul que encaminha o tráfego de engenheiros de CQ e programadores para o conjunto de instâncias de VM azul.
- Um equilibrador de carga verde que encaminha o tráfego de engenheiros de CQ e programadores para o conjunto de instâncias verde.
- Dois conjuntos de utilizadores:
- Utilizadores finais que têm acesso ao equilibrador de carga azul/verde, que os direciona para o conjunto de instâncias azul ou verde.
- Engenheiros de controlo de qualidade e programadores que precisam de acesso a ambos os conjuntos de pools para fins de desenvolvimento e testes. Podem aceder aos balanceadores de carga azuis e verdes, que os encaminham para o conjunto de instâncias azuis e o conjunto de instâncias verdes, respetivamente.
Os conjuntos de VMs azuis e verdes são implementados como MIGs do Compute Engine, e os endereços IP externos são encaminhados para as VMs no MIG através de equilibradores de carga HTTP(s) externos. O exemplo de código descrito neste documento usa o Terraform para configurar esta infraestrutura.
O diagrama seguinte ilustra as operações do programador que ocorrem na implementação:
No diagrama acima, as setas vermelhas representam o fluxo de arranque que ocorre quando configura a infraestrutura de implementação pela primeira vez, e as setas azuis representam o fluxo GitOps que ocorre durante cada implementação.
Para configurar esta infraestrutura, executa um script de configuração que inicia o processo de arranque e configura os componentes para o fluxo do GitOps.
O script de configuração executa um pipeline do Cloud Build que realiza as seguintes operações:
- Cria um repositório nos Cloud Source Repositories
denominado
copy-of-gcp-mig-simple
e copia o código fonte do repositório de exemplo do GitHub para o repositório nos Cloud Source Repositories. - Cria dois acionadores do Cloud Build com os nomes
apply
edestroy
.
O acionador apply
está anexado a um ficheiro do Terraform denominado main.tfvars
nos
Cloud Source Repositories. Este ficheiro contém as variáveis do Terraform que representam os balanceadores de carga azuis e verdes.
Para configurar a implementação, atualize as variáveis no ficheiro main.tfvars
.
O acionador apply
executa um pipeline do Cloud Build que executa
tf_apply
e realiza as seguintes operações:
- Cria dois GIGs do Compute Engine (um para o verde e outro para o azul), quatro instâncias de VM do Compute Engine (duas para o GIG verde e duas para o GIG azul), os três balanceadores de carga (azul, verde e o divisor) e três endereços IP públicos.
- Imprime os endereços IP que pode usar para ver as aplicações implementadas nas instâncias azuis e verdes.
O acionador de destruição é acionado manualmente para eliminar todos os recursos criados pelo acionador de aplicação.
Objetivos
Use o Cloud Build e o Terraform para configurar balanceadores de carga de HTTP(S) externos com back-ends de grupos de instâncias de VMs do Compute Engine.
Fazer implementações azul/verde nas instâncias de VM.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Verify that billing is enabled for your Google Cloud project.
Execute o script de configuração a partir do repositório de exemplos de código da Google:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/setup.sh)
Quando o script de configuração pedir o consentimento do utilizador, introduza yes.
O script termina a execução em alguns segundos.
Na Google Cloud consola, abra a página Histórico de compilações do Cloud Build:
Clique na compilação mais recente.
É apresentada a página Detalhes da compilação, que mostra um pipeline do Cloud Build com três passos de compilação: o primeiro passo de compilação cria um repositório nos Cloud Source Repositories, o segundo passo clona o conteúdo do repositório de exemplo no GitHub para os Cloud Source Repositories e o terceiro passo adiciona dois acionadores de compilação.
Abra os Cloud Source Repositories:
Na lista de repositórios, clique em
copy-of-gcp-mig-simple
.No separador Histórico na parte inferior da página, é apresentado um commit com a descrição
A copy of https://github.com/GoogleCloudPlatform/cloud-build-samples.git
criado pelo Cloud Build para criar um repositório com o nomecopy-of-gcp-mig-simple
.Abra a página Acionadores do Cloud Build:
Para iniciar o processo de implementação, atualize o ficheiro
infra/main.tfvars
:Na janela do terminal, crie e navegue para uma pasta com o nome
deploy-compute-engine
:mkdir ~/deploy-compute-engine cd ~/deploy-compute-engine
Clone o repositório
copy-of-gcp-mig-simple
:gcloud source repos clone copy-of-mig-blue-green
Navegue para o diretório clonado:
cd ./copy-of-mig-blue-green
Atualize
infra/main.tfvars
para substituir o azul por verde:sed -i'' -e 's/blue/green/g' infra/main.tfvars
Adicione o ficheiro atualizado:
git add .
Consolide o ficheiro:
git commit -m "Promote green"
Envie o ficheiro:
git push
Fazer alterações a
infra/main.tfvars
aciona a execução doapply
acionador, que inicia a implementação.
Abra os Cloud Source Repositories:
Na lista de repositórios, clique em
copy-of-gcp-mig-simple
.Verá a confirmação com a descrição
Promote green
no separador Histórico na parte inferior da página.Para ver a execução do acionador
apply
, abra a página Histórico de compilação na consola Google Cloud :Abra a página Detalhes da compilação clicando na primeira compilação.
É apresentada a pipeline de acionadores
apply
com dois passos de compilação. O primeiro passo de compilação executa o comando Terraform apply para criar os recursos do Compute Engine e de balanceamento de carga para a implementação. O segundo passo de compilação imprime o endereço IP onde pode ver a aplicação em execução.Abra o endereço IP correspondente ao MIG verde num navegador. É apresentada uma captura de ecrã semelhante à seguinte que mostra a implementação:
Aceda à página Grupo de instâncias do Compute Engine para ver os grupos de instâncias azul e verde:
Abra a página Instâncias de VM para ver as quatro instâncias de VM:
Abra a página Endereços IP externos para ver os três balanceadores de carga:
- Código fonte relacionado com o script de configuração.
- Código fonte relacionado com os pipelines do Cloud Build.
- Código fonte relacionado com os modelos do Terraform.
- Ativa as APIs Cloud Build, Resource Manager, Compute Engine e Cloud Source Repositories.
- Concede a função de IAM
roles/editor
à conta de serviço do Cloud Build no seu projeto. Esta função é necessária para que o Cloud Build crie e configure os componentes GitOps necessários para a implementação. - Concede a função de IAM
roles/source.admin
à conta de serviço do Cloud Build no seu projeto. Esta função é necessária para que a conta de serviço do Cloud Build crie os Cloud Source Repositories no seu projeto e clone o conteúdo do repositório GitHub de exemplo para os seus Cloud Source Repositories. Gera um pipeline do Cloud Build denominado
bootstrap.cloudbuild.yaml
inline que:- Cria um novo repositório nos Cloud Source Repositories.
- Copia o código fonte do repositório GitHub de exemplo para o novo repositório nos Cloud Source Repositories.
- Cria os acionadores de compilação de aplicação e destruição.
tf_apply build
passo de criação que chama a funçãotf_install_in_cloud_build_step
, que instala o Terraform.tf_apply
que cria os recursos usados no fluxo GitOps. As funçõestf_install_in_cloud_build_step
etf_apply
são definidas embash_utils.sh
, e a etapa de compilação usa o comandosource
para as chamar.describe_deployment
passo de compilação que chama a funçãodescribe_deployment
que imprime os endereços IP dos balanceadores de carga.main.tf
: este é o ficheiro de configuração do Terraformmain.tfvars
: este ficheiro define as variáveis do Terraform.mig/
esplitter/
: estas pastas contêm os módulos que definem os balanceadores de carga. A pastamig/
contém o ficheiro de configuração do Terraform que define o MIG para os equilibradores de carga azul e verde. Os MIGs azuis e verdes são idênticos, pelo que são definidos uma vez e instanciados para os objetos azuis e verdes. O ficheiro de configuração do Terraform para o equilibrador de carga do divisor encontra-se na pastasplitter/
.- Uma variável está definida para o projeto Google Cloud .
- A Google está definida como fornecedor do Terraform.
- Uma variável é definida para o espaço de nomes. Todos os objetos criados pelo Terraform têm o prefixo desta variável para que seja possível implementar várias versões da aplicação no mesmo projeto e os nomes dos objetos não entrem em conflito entre si.
- As variáveis
MIG_VER_BLUE
,MIG_VER_BLUE
eMIG_ACTIVE_COLOR
são as associações para as variáveis no ficheiroinfra/main.tfvars
. Elimine os recursos do Compute Engine criados pelo acionador de aplicação:
Abra a página Acionadores do Cloud Build:
Na tabela Acionadores, localize a linha correspondente ao acionador destroy e clique em Executar. Quando o acionador conclui a execução, os recursos criados pelo acionador apply são eliminados.
Elimine os recursos criados durante o arranque executando o seguinte comando na janela do terminal:
bash <(curl https://raw.githubusercontent.com/GoogleCloudPlatform/cloud-build-samples/main/mig-blue-green/teardown.sh)
- Saiba mais sobre os acionadores de compilação.
- Saiba como ver a proveniência da compilação.
Experimentar
São apresentados dois acionadores de compilação com os nomes apply
e destroy
. O acionador apply
está anexado ao ficheiro infra/main.tfvars
no ramo main
. Este acionador é executado sempre que o ficheiro é atualizado. O acionador destroy
é um acionador manual.
Compreender o código
O código-fonte deste exemplo de código inclui:
Script de configuração
setup.sh
é o script de configuração que executa o processo de arranque e cria os componentes para a implementação azul/verde. O script realiza as seguintes operações:
Pipelines do Cloud Build
apply.cloudbuild.yaml
e destroy.cloudbuild.yaml
são os ficheiros de configuração do Cloud Build que o script de configuração usa para configurar os recursos para o fluxo GitOps. apply.cloudbuild.yaml
contém dois passos de compilação:
destroy.cloudbuild.yaml
chama tf_destroy
que elimina todos os recursos criados por tf_apply
.
As funções tf_install_in_cloud_build_step
, tf_apply
,
describe_deployment
e tf_destroy
estão definidas no ficheiro bash_utils.sh
.
Os ficheiros de configuração de compilação usam o comando source
para chamar as funções.
O código seguinte mostra a função tf_install_in_cloud_build_step
definida em bash_utils.sh
. Os ficheiros de configuração da compilação chamam esta função para
instalar o Terraform rapidamente. Cria um contentor do Cloud Storage para
registar o estado do Terraform.
O seguinte fragmento do código mostra a função tf_apply
definida em
bash_utils.sh
. Primeiro, chama terraform init
que carrega todos os módulos e bibliotecas personalizadas e, em seguida, executa terraform apply
para carregar as variáveis do ficheiro main.tfvars
.
O seguinte fragmento do código mostra a função describe_deployment
definida em bash_utils.sh
. Usa o gcloud compute addresses describe
para obter os endereços IP dos balanceadores de carga através do nome e imprimi-los.
O seguinte fragmento do código mostra a função tf_destroy
definida em
bash_utils.sh
. Chama terraform init
que carrega todos os módulos e bibliotecas personalizadas e, em seguida, executa terraform destroy
que descarrega as variáveis do Terraform.
Modelos do Terraform
Vai encontrar todos os ficheiros de configuração e variáveis do Terraform na pasta copy-of-gcp-mig-simple/infra/
.
O seguinte fragmento do código mostra o conteúdo de infra/main.tfvars
. Contém três variáveis: duas que determinam que versão da aplicação implementar nos conjuntos azul e verde, e uma variável para a cor ativa: azul ou verde. As alterações a este ficheiro acionam a implementação.
Segue-se um fragmento de código de infra/main.tf
. Neste fragmento:
O seguinte fragmento do código de infra/main.tf
mostra a instanciação do módulo de divisão. Este módulo recebe a cor ativa para que o balanceador de carga do divisor saiba em que MIG implementar a aplicação.
O seguinte fragmento do código de infra/main.tf
define dois módulos idênticos
para os MIGs azuis e verdes. Recebe a cor, a rede e a sub-rede, que são definidas no módulo divisor.
O ficheiro splitter/main.tf
define os objetos criados para o MIG do separador. Segue-se um fragmento de código de splitter/main.tf
que contém a lógica para alternar entre o MIG verde e o azul. É suportado pelo serviço google_compute_region_backend_service
, que pode encaminhar o tráfego para duas regiões de back-end: var.instance_group_blue
ou var.instance_group_green
.
capacity_scaler
define a quantidade de tráfego a encaminhar.
O código seguinte encaminha 100% do tráfego para a cor especificada, mas pode atualizar este código para a implementação canary de modo a encaminhar o tráfego para um subconjunto dos utilizadores.
O ficheiro mig/main.tf
define os objetos relativos aos MIGs azuis e verdes. O seguinte fragmento do código deste ficheiro define o modelo de instância do Compute Engine que é usado para criar os conjuntos de VMs. Tenha em atenção que este modelo de instância tem a propriedade do ciclo de vida do Terraform definida como create_before_destroy
.
Isto acontece porque, quando atualiza a versão do conjunto, não pode usar o modelo para criar a nova versão dos conjuntos quando ainda está a ser usado pela versão anterior do conjunto. No entanto, se a versão mais antiga do conjunto for destruída antes de criar o novo modelo, haverá um período em que os conjuntos estão inativos. Para evitar este cenário, definimos o ciclo de vida do Terraform como
create_before_destroy
para que a versão mais recente de um conjunto de VMs seja criada primeiro
antes de a versão mais antiga ser destruída.
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Elimine recursos individuais
Elimine o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID