Como criar imagens de contêiner de várias arquiteturas para dispositivos IoT


Este tutorial é a segunda parte de uma série que discute a criação de um pipeline de integração contínua (CI, na sigla em inglês) automatizado para criar imagens de contêiner de várias arquiteturas no Google Cloud.

Neste tutorial, você implementa um pipeline para criar imagens de contêineres de várias arquiteturas usando o Cloud Build e o Container Registry. Veja neste tutorial a estratégia de criação de várias arquiteturas descrita na seção Como implementar um pipeline de criação de imagens de contêiner de várias arquiteturas na parte 1 desta série.

Por exemplo, suponha que você mantenha uma frota de dispositivos de Internet das Coisas (IoT, na sigla em inglês). À medida que surgem novos requisitos para sua solução de IoT, você precisa de novos dispositivos de hardware. Se os novos dispositivos tiverem uma arquitetura de hardware diferente da existente, será necessário modificar o pipeline de criação para oferecer suporte à nova arquitetura.

Este tutorial destina-se a profissionais de TI que querem simplificar e otimizar os pipelines complexos para criar imagens de contêiner ou para estender esses pipelines para criar imagens de multiarquitetura.

Neste tutorial, presume-se que você tenha um conhecimento básico dos seguintes produtos:

  • Terraform, para criar infraestrutura no Google Cloud.
  • Google Cloud CLI, para executar tarefas da plataforma no Google Cloud.
  • Cloud Shell, para executar comandos neste tutorial. Todas as ferramentas usadas neste tutorial estão pré-instaladas no Cloud Shell.
  • Cloud Build, para configurar um pipeline de CI.
  • Docker, como uma plataforma de gerenciamento de contêineres.
  • Container Registry, para armazenar as imagens de contêiner que o processo de compilação produz.

Neste tutorial, você usará o Terraform para configurar os recursos necessários para provisionar e configurar o pipeline para criar imagens de contêiner.

Arquitetura

O diagrama a seguir ilustra o fluxo de trabalho do pipeline criado neste tutorial para criar imagens de contêiner.

Pipeline que consiste no repositório de código, Cloud Build e Container Registry.

As alterações feitas no código-fonte do gatilho de imagem de contêiner acionam o Cloud Build para criar uma imagem de contêiner de várias arquiteturas. Quando a criação é concluída, a imagem do contêiner de várias arquiteturas é armazenada no Container Registry.

Objetivos

  • Use o Terraform para provisionar o pipeline e criar imagens de contêiner no Google Cloud.
  • Modifique o código-fonte da imagem do contêiner para acionar um novo build.
  • Inspecione a imagem do contêiner armazenada no Container Registry.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  2. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

Prepare o ambiente

Neste tutorial, todos os comandos serão executados no Cloud Shell.

  1. No Console do Google Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte inferior do Console do Google Cloud, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  2. Clone o repositório do código de amostra:

    cd "$HOME"
    git clone \
    https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
    
  3. Gere as credenciais padrão do aplicativo:

    gcloud auth application-default login --quiet
    

    A saída será assim:

    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?code_challenge=...
    Enter verification code:
    
  4. Em uma janela do navegador, abra o URL exibido na saída da geração das credenciais padrão do aplicativo (a etapa anterior).

  5. Selecione Permitir para continuar.

  6. Copie o código na tela e insira-o no Cloud Shell.

    A saída será assim:

    /tmp/tmp.xxxxxxxxxx/application_default_credentials.json
    

    Anote o caminho para o arquivo application_default_credentials.json. Use esse caminho para definir uma variável de ambiente na próxima seção.

Definir variáveis de ambiente

Antes de provisionar a infraestrutura necessária para este tutorial, é necessário inicializar e exportar as variáveis de ambiente a seguir:

  1. No Cloud Shell, crie uma variável de ambiente que armazene o nome da conta de serviço do Google Cloud que o Terraform usa para provisionar recursos:

    export TF_SERVICE_ACCOUNT_NAME=tf-service-account
    
  2. Crie uma variável de ambiente que armazene o ID do projeto do Google Cloud que o Terraform usa para armazenar o estado:

    export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
    
  3. Crie uma variável de ambiente que armazene o bucket do Cloud Storage que o Terraform usa para salvar os arquivos de estado:

    export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
    
  4. Crie uma variável de ambiente que armazene o ID do projeto do Cloud que contém os recursos do pipeline de criação da imagem do contêiner:

    export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
    
  5. Crie uma variável de ambiente para armazenar o caminho para as credenciais padrão do aplicativo do Google Cloud padrão, que é o valor que você anotou na seção anterior:

    export GOOGLE_APPLICATION_CREDENTIALS=PATH
    

    Substitua:

    • PATH: caminho para o arquivo application_default_credentials.json

Como provisionar o ambiente

Você precisa executar o script de shell generate-tf-backend.sh que gera a configuração de back-end do Terraform, as contas de serviço necessárias do Google Cloud e o bucket do Cloud Storage para armazenar informações sobre o estado remoto do Terraform.

  • No Cloud Shell, provisione seu ambiente de criação:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/
    
    ./generate-tf-backend.sh
    

    O script é idempotente e seguro para ser executado várias vezes.

    Depois de executar o script pela primeira vez, a saída será semelhante a esta:

    Generating the descriptor to hold backend data in terraform/backend.tf
    terraform {
       backend "gcs" {
           bucket  = "tf-state-bucket-project-id"
           prefix  = "terraform/state"
       }
    }
    

Como criar o pipeline de criação

O arquivo de modelo do Terraform terraform/main.tf define os recursos criados para este tutorial. Ao executar o Terraform com esse descritor, crie os recursos do Google Cloud a seguir:

No Cloud Shell, faça o seguinte:

  1. Para inicializar o diretório de trabalho do Terraform, execute o comando terraform init:

    cd terraform
    terraform init
    
  2. (Opcional) Para revisar as alterações que o Terraform aplicará, execute o comando terraform plan:

    terraform plan
    

    A saída é uma lista de todas as ações que o Terraform deve executar para provisionar recursos no ambiente do Google Cloud. O resumo de todas as ações é semelhante ao seguinte:

    Plan: 8 to add, 0 to change, 0 to destroy.
    

    O número total de ações de adição é 8, sem alterações e exclusões.

  3. Execute o comando terraform apply para criar os recursos no projeto do Cloud:

    terraform apply
    
  4. Para continuar executando o comando, digite yes.

Como enviar os arquivos de origem para o Cloud Source Repositories

Para que o pipeline de compilação execute o build, o Dockerfile e os arquivos de configuração do Cloud Build precisam ser armazenados em um repositório de código-fonte do Cloud Source Repositories.

  1. No Cloud Shell, clone o repositório de origem:

    cd $HOME
    gcloud source repos clone cross-build
    
  2. Copie o Dockerfile e o arquivo de configuração do Cloud Build no repositório de código-fonte:

    cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
    
  3. Confirme e envie os arquivos ao repositório de código-fonte:

    cd "$HOME"/cross-build
    git add .
    git commit -m "Initial commit"
    git push
    

Como inspecionar os resultados

Enquanto o job do Cloud Build estiver em execução e após a conclusão, você poderá inspecionar a execução de cada etapa da criação na página Histórico de versões do Cloud Build.

Lista de versões na página "Histórico de versões" do Cloud Build.

Versão do Cloud Build

Na página Histórico de versões, você tem uma visão geral das etapas de criação com o tempo necessário para executar cada etapa, conforme mostrado na ilustração a seguir.

Etapas de criação no histórico do Cloud Build.

Se você abrir uma etapa de criação, verá a saída dessa etapa. Por exemplo, os detalhes de criação da etapa buildx inspect no diagrama anterior mostram a arquitetura da plataforma de destino diferente compatível com a plataforma:

12 Name:      mybuilder0
13 Endpoint:  unix:///var/run/docker.sock
14 Status:    running
15 Platforms: linux/amd64, linux/arm64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6

Os detalhes de criação da quarta etapa mostram a saída do build para cada arquitetura de destino:

#8 0.268 I am running on linux/amd64, building for linux/amd64
#12 0.628 I am running on linux/amd64, building for linux/arm/v7
#10 0.279 I am running on linux/amd64, building for linux/arm/v6
#14 0.252 I am running on linux/amd64, building for linux/arm64

Manifesto de imagem no Container Registry

Após a conclusão da compilação, será possível inspecionar o manifesto da imagem na página Imagens do Container Registry no console do Google Cloud, conforme mostrado na ilustração a seguir.

Manifesto de imagem na página "Imagens" do Container Registry.

Se você abrir o repositório test na lista de repositórios, verá todas as versões da imagem do contêiner que pertencem ao repositório test, conforme mostrado na ilustração a seguir.

Lista de versões de imagem.

É possível abrir a imagem que tem a tag latest para abrir a página Detalhes do resumo para ver informações detalhadas sobre a imagem, conforme mostrado na ilustração a seguir.

Detalhes do resumo de uma imagem.

Na página Detalhes do resumo, você pode expandir a seção Manifesto e verificar se toda a arquitetura de destino criada pelo build está indicada no arquivo, conforme mostrado no exemplo a seguir:

{
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "schemaVersion": 2,
  "manifests": [
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:839024acb1038509e3bc66f3744857840951d0d512be54fd6670ea1e8babdcb6",
        "size": 735,
        "platform": {
           "architecture": "amd64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:33489767c29efb805e446a61d91cc55e042d3cfadcd186d9a1c8698f2f12309d",
        "size": 735,
        "platform": {
           "architecture": "arm64",
           "os": "linux"
        }
     },
     {
        "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
        "digest": "sha256:f1958815778ca8c83d324bad3fc68a9e3e9d5ea48b5bb27a8aca7d8da20cf8d4",
        "size": 735,
        "platform": {
           "architecture": "arm",
           "os": "linux",
           "variant": "v7"
        }
     }
  ]
}

Também é possível ver o manifesto da imagem diretamente do Cloud Shell.

  • No Cloud Shell, exiba o manifesto da imagem:

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/"${DEVSHELL_PROJECT_ID}"/test:latest
    

    A saída é a mesma do arquivo de manifesto que você pode expandir na página Detalhes do resumo.

Como configurar a implantação contínua do pipeline de compilação

Para criar a imagem do contêiner para a nova arquitetura de hardware, modifique o arquivo de configuração da compilação adicionando a nova arquitetura de destino. Depois de confirmar e enviar a alteração para o repositório de origem no Cloud Source Repositories, o Cloud Build iniciará um novo build. O build produz uma nova versão da imagem de contêiner de várias arquiteturas, incluindo a compatibilidade com a arquitetura de hardware recém-adicionada.

  1. No Cloud Shell, adicione a nova plataforma de destino ao arquivo de configuração da compilação:

    cd "$HOME"/cross-build
    sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
    
  2. Confirme e envie a alteração para o repositório de código-fonte:

    git add .
    git commit -m "add a new target platform"
    git push
    
  3. Veja o manifesto mais recente para verificar se a nova plataforma de destino faz parte da imagem de contêiner mais recente:

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
    
  4. Verifique se a plataforma de destino recém-adicionada está no arquivo de manifesto, semelhante à seguinte saída:

    {
      "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
      "schemaVersion": 2,
      "manifests": [
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:bc80d063fccb4c370df9b505cbf4f8a814a366d99644de09ebee98af2ef0ff63",
            "size": 735,
            "platform": {
               "architecture": "amd64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:be10e4f01f529149815ebad7eb09edaa84ebef5b7d70d51f7d1acb5ceb1f61cd",
            "size": 735,
            "platform": {
               "architecture": "arm64",
               "os": "linux"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:f6ba5d5d3bc1ea0177e669517ea15a0d4fb97c06c7eca338afa43734d87af779",
            "size": 735,
            "platform": {
               "architecture": "arm",
               "os": "linux",
               "variant": "v7"
            }
         },
         {
            "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
            "digest": "sha256:a3c34621cca10974026f8ad0782af78539cd7bb0ebfa0082a27b2c3ed4418ca0",
            "size": 735,
            "platform": {
               "architecture": "386",
               "os": "linux"
            }
         }
      ]
    }
    

Limpar

A maneira mais fácil de eliminar o faturamento é excluir o projeto do Google Cloud criado para o tutorial. A outra opção é excluir os recursos individuais.

Excluir o projeto

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos individuais

Se você quiser manter o projeto usado neste tutorial, execute as etapas a seguir para excluir os recursos criados neste tutorial.

  1. No Cloud Shell, exclua as imagens do contêiner:

    gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
    
  2. Exclua os recursos provisionados usando o Terraform:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform
    terraform destroy
    
  3. Digite yes para confirmar a exclusão.

A seguir