Pipelines de entrega contínua com Spinnaker e Google Kubernetes Engine

Neste tutorial, mostramos como criar um pipeline de entrega contínua usando o Google Kubernetes Engine (GKE), o Cloud Source Repositories, o Cloud Build e o Spinnaker para Google Cloud. Depois de criar um aplicativo de exemplo, configure esses serviços para criar, testar e implantar automaticamente. Quando você modifica o código do aplicativo, as alterações acionam o canal de entrega contínua para recriar, retestar e reimplantar a nova versão automaticamente.

Os relatórios State of DevOps identificaram recursos que impulsionam o desempenho da entrega de software. Este tutorial ajudará você com os seguintes recursos:

Arquitetura de pipeline

O diagrama a seguir ilustra a arquitetura do pipeline de entrega contínua.

Arquitetura de pipeline para desenvolvedores e usuários.

Para realizar a entrega contínua das atualizações de apps aos usuários, é necessário ter um processo automatizado para criar, testar e atualizar o software de maneira confiável. As alterações de código precisam passar automaticamente por um pipeline que inclua a criação de artefatos, testes de unidade, testes funcionais e o lançamento na produção. Em alguns casos, é interessante que uma atualização de código se aplique apenas a um subconjunto dos usuários, para que seja exercida de maneira realista antes do envio para toda a base de usuários. Se uma dessas versões canário for insatisfatória, o procedimento automatizado precisará reverter rapidamente as alterações no software.

Com o GKE e o Spinnaker, é possível criar um fluxo eficiente de entrega contínua para ajudar a garantir que o envio do software seja tão rápido quanto o desenvolvimento e a validação. Ainda que a iteração rápida seja o objetivo final, é preciso garantir que cada revisão do app passe por diversas validações automatizadas antes de se tornar um candidato para lançamento na produção. Quando uma determinada alteração é controlada por meio de automação, é possível validar o aplicativo manualmente e realizar outros testes de pré-lançamento também.

Depois que sua equipe decidir que o app está pronto para produção, um dos membros pode aprovar a implantação.

Canal de entrega de aplicativos

Neste tutorial, você criará o canal de entrega contínua mostrado no diagrama a seguir.

Arquitetura do pipeline de entrega de aplicativos.

As etapas gerais do pipeline são as seguintes:

  1. Um desenvolvedor altera o código e o envia para um repositório.

  2. O Cloud Build detecta as alterações, cria a imagem do Docker, testa a imagem e a envia para o Spinnaker.

  3. O Spinnaker detecta a imagem, implanta a imagem em uma implantação canário e testa a implantação. Após uma aprovação manual, o Spinnaker implanta a imagem na produção.

Objetivos

  • Configurar o ambiente iniciando o Cloud Shell e implantando o Spinnaker para Google Cloud.
  • Criar um cluster do GKE para implantar nele o aplicativo de amostra.
  • Fazer o download de um aplicativo de amostra, criar um repositório Git e fazer upload dele para um Cloud Source Repository.
  • Crie a imagem do Docker.
  • Criar acionadores para gerar imagens do Docker quando o aplicativo for alterado.
  • Configurar um canal do Spinnaker para implantar de maneira confiável e contínua seu aplicativo no GKE.
  • Implantar uma mudança de código para acionar o canal e assistir a implantação para produção.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, inclusive estes:

  • GKE
  • Cloud Load Balancing
  • Cloud Build
  • Cloud Source Repositories
  • Container Registry

Use a calculadora de preços para gerar uma estimativa de custo baseada na projeção de uso.

Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. No Console do Cloud, na página do seletor de projetos, selecione ou crie um projeto do Cloud.

    Acessar a página do seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud. Saiba como confirmar se a cobrança está ativada para o seu projeto.

  4. Ative as APIs GKE, Cloud Build, and Cloud Source Repositories.

    Ative as APIs

Configurar o ambiente

Nesta seção, você configura a infraestrutura necessária para concluir o tutorial.

Implantar o Spinnaker para o Google Cloud usando o Cloud Shell

Execute todos os comandos do terminal no Cloud Shell.

Com o Spinnaker para Google Cloud, você define e gerencia o Spinnaker em uma configuração pronta para produção, otimizada para o Google Cloud. Ele configura recursos (GKE, Memorystore, buckets e contas de serviço do Cloud Storage), integra o Spinnaker aos serviços relacionados, como o Cloud Build, e oferece um ambiente de gerenciamento baseado no Cloud Shell para as instalações do Spinnaker, com assistentes e ferramentas comuns, como o spin e o hal.

  1. Abra o Spinnaker para Google Cloud no Cloud Shell. Isso clona o repositório do Spinnaker para Google Cloud no ambiente do Cloud Shell e inicia as instruções detalhadas de instalação.

    ACESSAR O CLOUD SHELL

  2. Configure o Git. Se você configurou o Git anteriormente, pule esta etapa.

    git config --global user.email "EMAIL_ADDRESS"
    git config --global user.name "USERNAME"
    

    Substitua:

    • EMAIL_ADDRESS: seu endereço de e-mail do Git
    • USERNAME: seu nome de usuário do Git
  3. Configure uma variável de ambiente para definir para qual projeto do Cloud instalar o Spinnaker:

    DEVSHELL_PROJECT_ID=YOUR_PROJECT_ID
    

    Substitua YOUR_PROJECT_ID pelo projeto que você selecionou ou criou para este tutorial.

  4. 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
    
  5. Reinicie o Cloud Shell para carregar as novas configurações de ambiente.

    Opção do menu de reinicialização do Cloud Shell.

  6. Conecte-se ao Spinnaker.

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/connect_unsecured.sh
    
  7. No Cloud Shell, clique no ícone Visualização da Web e selecione Visualizar na porta 8080.

    Visualização da Web do Cloud Shell

  8. Você verá a tela de boas-vindas, seguida da IU do Spinnaker:

    Tela de boas-vindas do Spinnaker.

    IU do Spinnaker.

Criar um cluster do GKE para implantações de aplicativos

É comum usar um cluster do GKE para criações ou implantações e outros clusters para executar aplicativos. Nesta seção, você criará outro cluster do GKE, app-cluster, para implantar o aplicativo de amostra.

  1. No Cloud Shell, crie um novo cluster do GKE:

    ZONE=us-east1-c
    gcloud config set compute/zone $ZONE
    gcloud container clusters create app-cluster \
    --machine-type=n1-standard-2
    
  2. Adicione o novo cluster do GKE ao Spinnaker. Os valores padrão devem estar corretos.

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/add_gke_account.sh
    

    Exemplo de saída e valores:

    Please enter the context you wish to use to manage your GKE resources: gke_spinnaker-246920_us-east1-c_app-cluster
    Please enter the id of the project within which the referenced cluster lives: spinnaker-246920
    Please enter a name for the new Spinnaker account: app-cluster-acct
    

  3. Altere o contexto do Kubernetes de volta para o cluster do Spinnaker:

    kubectl config use-context gke_${DEVSHELL_PROJECT_ID}_${ZONE}_spinnaker-1
    
  4. Envie e aplique as alterações de configuração ao Spinnaker:

    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/push_and_apply.sh
    

Crie a imagem do Docker

Nesta seção, você configurará o Container Builder para detectar alterações no código-fonte do aplicativo, criar uma imagem do Docker e enviá-la para o Container Registry.

Criar o repositório de código-fonte

  1. No Cloud Shell, faça o download do código-fonte de amostra:

    cd ~
    wget https://gke-spinnaker.storage.googleapis.com/sample-app-v4.tgz
    
  2. Descompacte o código-fonte:

    tar xzfv sample-app-v4.tgz
    
  3. Altere os diretórios para o código-fonte:

    cd sample-app
    
  4. Faça o commit inicial no repositório de código-fonte:

    git init
    git add .
    git commit -m "Initial commit"
    
  5. Crie um repositório para hospedar o código:

    gcloud source repos create sample-app
    git config credential.helper gcloud.sh
    
  6. Adicione seu repositório recém-criado como remoto:

    export PROJECT=$(gcloud info --format='value(config.project)')
    git remote add origin https://source.developers.google.com/p/$PROJECT/r/sample-app
    
  7. Pressione o código para o branch mestre do novo repositório:

    git push origin master
  8. Verifique se o código-fonte é exibido no console:

    ACESSAR A PÁGINA DO CÓDIGO-FONTE

Configure os acionadores de versão

O diagrama a seguir mostra o acionador que você cria nesta seção.

Fluxo de trabalho do Spinnaker

Você configura o Cloud Build para criar e enviar suas imagens do Docker sempre que enviar tags do Git para o repositório de origem. O Container Builder verifica automaticamente o código-fonte, cria a imagem do Docker no Dockerfile do repositório e envia por push essa imagem para o Container Registry.

  1. No Console do Cloud, na seção Cloud Build, clique em Acionadores e em Criar acionador.

    ACESSAR A PÁGINA "CRIAR ACIONADORES"

  2. Defina as seguintes configurações do acionador:

    • Nome: sample-app-tags
    • Evento: selecione Enviar nova tag por push
    • Repositório: sample-app
    • Tag (regex): v.*
    • Configuração da build: /cloudbuild.yaml
  3. Clique em Criar.

    Configurações do acionador quando ele é criado.

A partir de agora, sempre que você enviar por push uma tag do Git iniciada com a letra "v" para o repositório de código-fonte, o Container Builder criará e efetuará push do aplicativo como uma imagem do Docker automaticamente no Container Registry.

Preparar manifestos do Kubernetes para uso no Spinnaker

O Spinnaker precisa acessar seus manifestos do Kubernetes para implantá-los nos clusters. Nesta seção, criaremos um bucket do Cloud Storage que será preenchido com seus manifestos durante o processo de integração contínua (CI, na sigla em inglês) no Cloud Build. Depois que seus manifestos estiverem no Cloud Storage, o Spinnaker poderá fazer o download e aplicá-los durante a execução do seu canal.

  1. Crie o bucket.

    export PROJECT=$(gcloud info --format='value(config.project)')
    gsutil mb gs://$PROJECT-kubernetes-manifests
    
  2. Ative o controle de versão no bucket para que você tenha um histórico dos seus manifestos.

    gsutil versioning set on gs://$PROJECT-kubernetes-manifests
    
  3. Defina o ID correto do projeto do Google Cloud nos manifestos de implantação do Kubernetes:

    sed -i s/PROJECT/$PROJECT/g k8s/deployments/*
    
  4. Confirme as mudanças no repositório:

    git commit -a -m "Set project ID"
    

Configure os canais de implantação

Agora que as imagens estão sendo criadas automaticamente, é necessário implantá-las no cluster do Kubernetes.

O diagrama a seguir mostra as etapas do pipeline de implantação.

Configurar o pipeline de implantação.

A implantação é feita em um ambiente reduzido para testes de integração. Após a aprovação dos testes de integração, aprove manualmente as alterações para implantar o código nos serviços de produção.

Crie o canal de implantação

  1. Use spin para criar um aplicativo no Spinnaker.

    spin application save --application-name sample \
                          --owner-email example@example.com \
                          --cloud-providers kubernetes \
                          --gate-endpoint http://localhost:8080/gate
    

    Em seguida, crie o canal de entrega contínua. Neste tutorial, o pipeline está configurado para detectar quando uma imagem do Docker com uma tag prefixada com v chegou ao Container Registry.

  2. Em uma nova guia do Cloud Shell, execute o comando a seguir no diretório do código-fonte para fazer upload de um exemplo de canal para a instância do Spinnaker:

    export PROJECT=$(gcloud info --format='value(config.project)')
    sed s/PROJECT/$PROJECT/g spinnaker/pipeline-deploy.json > pipeline.json
    spin pipeline save --gate-endpoint http://localhost:8080/gate -f pipeline.json
    

Crie a imagem

Envie por push a primeira imagem usando as seguintes etapas:

  1. Vá para a pasta de código-fonte no Cloud Shell.
  2. Crie uma tag do Git:

    git tag v1.0.0
  3. Envie a tag por push:

    git push --tags
  4. Em Versão do Cloud, clique em Histórico da versão para verificar se a versão foi acionada. Caso contrário, verifique se o acionador foi configurado corretamente na seção anterior.

    ACESSAR O HISTÓRICO DA BUILD

    histórico de builds

Visualizar a execução do canal

A configuração que você acabou de criar usa notificações de imagens recém-marcadas enviadas para acionar um canal do Spinnaker. Em uma etapa anterior, você enviou uma tag para o Cloud Source Repositories que acionou o Cloud Build para criar e enviar sua imagem para o Container Registry. Agora é possível verificar o canal que foi acionado.

  1. Retorne à página "Canais" clicando em Canais.

  2. Clique em Detalhes para saber mais informações sobre o progresso do canal. Nesta seção, mostraremos o status do canal de implantação e as etapas relacionadas. As etapas em azul estão em execução, as verdes foram concluídas com sucesso e as vermelhas falharam. Clique na etapa para ver mais detalhes.

    Após 3 a 5 minutos, a fase de teste de integração é concluída e o canal requer aprovação manual para continuar a implantação.

  3. Coloque o cursor sobre Enviar para produção e clique em Continuar.

    O lançamento continua para as implantações de front-end e back-end na produção. Ela será concluída após alguns minutos.

  4. Para ver o aplicativo, clique em Infraestrutura > Balanceadores de carga na parte superior da IU do Spinnaker.

    Lista suspensa de infraestrutura com balanceadores de carga selecionados.

  5. Role para baixo na lista de balanceadores de carga e clique em Padrão, que fica em sample-frontend-production.

    Balanceador de carga padrão.

  6. Role para baixo no painel de detalhes à direita e copie o endereço IP do seu aplicativo clicando no botão da área de transferência no IP do Ingress. O link do IP de ingresso da interface do usuário do Spinnaker usa HTTPS por padrão, mas o aplicativo está configurado para usar HTTP.

    Painel de detalhes com o endereço IP do seu aplicativo.

  7. Cole o endereço no navegador para ver a versão de produção do aplicativo.

    Versão de produção do aplicativo.

    O canal foi acionado manualmente para criar, testar e implantar o aplicativo.

Como acionar o canal de alterações de código

Nesta seção, você testará o canal completamente, fazendo uma alteração de código, enviando uma tag do Git e observando o canal gerar uma resposta. Ao enviar uma tag do Git que começa com "v", você aciona o Container Builder para criar uma nova imagem do Docker e enviá-la para o Container Registry. O Spinnaker detecta que a nova tag de imagem contém o prefixo "v" e aciona um canal para implantar a imagem em versões canário, executar testes e implantar a mesma imagem em todos os pods na implantação.

  1. Altere a cor do aplicativo de laranja para azul:

    cd ~/sample-app
    sed -i 's/orange/blue/g' cmd/gke-info/common-service.go
    
  2. Marque a alteração e envie-a por push para o repositório de código-fonte:

    git commit -a -m "Change color to blue"
    git tag v1.0.1
    git push --tags
    
  3. Veja a nova build aparecer no Histórico de builds do Container Builder.

  4. Clique em Canais para ver o canal começar a implantar a imagem.

  5. Observe as implantações canary. Quando a implantação estiver pausada, aguardando o lançamento na produção, volte e atualize a guia do aplicativo. Quatro back-ends estão executando a versão anterior do aplicativo, e apenas um está executando a versão canário. Você verá a nova versão azul do aplicativo aparecer aproximadamente a cada décima vez que atualizar.

  6. Após a conclusão do teste, volte para a guia Spinnaker e aprove a implantação.

  7. Quando o canal for concluído, o aplicativo será parecido com a seguinte captura de tela. O campo Versão agora mostra v1.0.1.

    Versão de produção do aplicativo atualizado.

    Agora você implementou com sucesso o aplicativo em todo o ambiente de produção.

  8. Se quiser, desfaça essa alteração revertendo o commit anterior. A reversão adiciona uma nova tag ((v1.0.2) e a envia de volta pelo mesmo pipeline usado para implantar v1.0.1:

    git revert v1.0.1
    git tag v1.0.2
    git push --tags

Limpar

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud Platform:

  1. Exclua o Spinnaker para Google Cloud:

    cd ~
    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/generate_deletion_script.sh
    ~/cloudshell_open/spinnaker-for-gcp/scripts/manage/delete-all_${DEVSHELL_PROJECT_ID}_spinnaker-1_spinnaker-1.sh
    
  2. Exclua o cluster do GKE:

    gcloud container clusters delete app-cluster --zone=us-east1-c
    
  3. Exclua o repositório:

    gcloud source repos delete sample-app
    
  4. Excluir o bucket:

    export PROJECT=$(gcloud info --format='value(config.project)')
    export BUCKET=$PROJECT-kubernetes-manifests
    gsutil -m rm -r gs://$BUCKET
    
  5. Exclua as imagens do contêiner:

    export PROJECT=$(gcloud info --format='value(config.project)')
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.0
    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.1
    
  6. Se você criou v1.0.2 na etapa de reversão opcional acima, exclua essa imagem do contêiner:

    gcloud container images delete gcr.io/$PROJECT/sample-app:v1.0.2
    

A seguir