Compila imágenes de contenedor de varias arquitecturas para dispositivos de IoT


Este instructivo es la segunda parte de una serie que analiza la compilación de una canalización automatizada de integración continua (CI) para compilar imágenes de contenedor de varias arquitecturas en Google Cloud.

En este instructivo, implementarás una canalización para compilar imágenes de contenedores de varias arquitecturas con Cloud Build y Container Registry. En este instructivo, se ilustra la estrategia de compilación de varias arquitecturas descrita en la sección Implementa una canalización de compilación de imágenes de contenedores de varias arquitecturas en la parte 1 de esta serie.

Por ejemplo, supongamos que mantiene una flota de dispositivos de la Internet de las cosas (IoT). Dado que surgen nuevos requisitos para su solución de IoT, necesitará nuevos dispositivos de hardware. Si los dispositivos nuevos tienen una arquitectura de hardware diferente a las existentes, debes modificar tu canalización de compilación para admitir la arquitectura nueva.

Este instructivo está dirigido a profesionales de TI que quieran simplificar y optimizar canalizaciones complejas a fin de compilar imágenes de contenedores o extenderlas para compilar imágenes de varias arquitecturas.

En este instructivo, se supone que tienes los siguientes conocimientos básicos:

  • Terraform, para crear una infraestructura en Google Cloud
  • Google Cloud CLI, para realizar tareas de plataforma en Google Cloud
  • Cloud Shell, para ejecutar comandos en este instructivo Todas las herramientas utilizadas en este instructivo están preinstaladas en Cloud Shell.
  • Cloud Build, para configurar una canalización de CI
  • Docker, como una plataforma de administración de contenedores
  • Container Registry, para almacenar las imágenes de contenedor que produce el proceso de compilación

En este instructivo, usarás Terraform a fin de configurar los recursos que necesitas a fin de aprovisionar y configurar la canalización para compilar imágenes de contenedores.

Arquitectura

En el siguiente diagrama, se ilustra el flujo de trabajo de la canalización que creas en este instructivo para compilar imágenes de contenedor.

Canalización que consiste en un repositorio de código, Cloud Build y Container Registry.

Los cambios realizados en el código fuente de la imagen de contenedor activan Cloud Build para compilar una imagen de contenedor de varias arquitecturas. Cuando se completa la compilación, la imagen de contenedor de varias arquitecturas se almacena en Container Registry.

Objetivos

  • Usa Terraform para aprovisionar la canalización a fin de compilar imágenes de contenedor en Google Cloud.
  • Modifica el código fuente de la imagen del contenedor para activar una compilación nueva.
  • Inspecciona la imagen del contenedor que se almacena en Container Registry.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Prepara tu entorno

En este instructivo, ejecutarás todos los comandos en Cloud Shell.

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de la consola de Google Cloud, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

  2. Clona el repositorio de código de muestra:

    cd "$HOME"
    git clone \
    https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
    
  3. Genera credenciales predeterminadas de la aplicación:

    gcloud auth application-default login --quiet
    

    La salida es similar a esta:

    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?code_challenge=...
    Enter verification code:
    
  4. En una ventana del navegador, abre la URL que se muestra en el resultado de la generación de las credenciales predeterminadas de la aplicación (el paso anterior).

  5. Elige Permitir para continuar.

  6. Copie el código que aparece en la pantalla y, luego, ingréselo en Cloud Shell.

    La salida es similar a esta:

    /tmp/tmp.xxxxxxxxxx/application_default_credentials.json
    

    Toma nota de la ruta de acceso al archivo application_default_credentials.json. Usa esta ruta de acceso para configurar una variable de entorno en la siguiente sección.

Cómo configurar variables de entorno

Antes de que puedas aprovisionar la infraestructura necesaria para este instructivo, debes inicializar y exportar las siguientes variables de entorno:

  1. En Cloud Shell, crea una variable de entorno que almacene el nombre de la cuenta de servicio de Google Cloud que Terraform usa para aprovisionar recursos:

    export TF_SERVICE_ACCOUNT_NAME=tf-service-account
    
  2. Crea una variable de entorno que almacene el ID del proyecto de Google Cloud que Terraform usa para almacenar el estado:

    export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
    
  3. Crea una variable de entorno que almacene el bucket de Cloud Storage que Terraform usa para guardar los archivos de estado:

    export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
    
  4. Crea una variable de entorno que almacene el ID del proyecto de Google Cloud que contiene los recursos para la canalización de compilación de la imagen del contenedor:

    export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
    
  5. Crea una variable de entorno que almacene la ruta de acceso a las credenciales predeterminadas de la aplicación de Google Cloud predeterminadas, que es el valor que anotaste en la sección anterior:

    export GOOGLE_APPLICATION_CREDENTIALS=PATH
    

    Reemplaza lo siguiente:

    • PATH: ruta al archivo application_default_credentials.json

Aprovisiona el entorno

Debes ejecutar la secuencia de comandos de shell generate-tf-backend.sh que genera la configuración de backend de Terraform, las cuentas de servicio de Google Cloud necesarias y el bucket de Cloud Storage para almacenar información sobre el estado remoto de Terraform.

  • En Cloud Shell, aprovisiona tu entorno de compilación:

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

    La secuencia de comandos es idempotente y es seguro ejecutarla varias veces.

    Después de ejecutar la secuencia de comandos de forma correcta por primera vez, el resultado es similar al siguiente:

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

Crea la canalización de compilación

El archivo de plantilla de Terraform terraform/main.tf define los recursos que se crean para este instructivo. Cuando ejecutas Terraform con ese descriptor, creas los siguientes recursos de Google Cloud:

En Cloud Shell, haz lo siguiente:

  1. Para inicializar el directorio de trabajo de Terraform, ejecuta el comando terraform init:

    cd terraform
    terraform init
    
  2. (Opcional) Para revisar los cambios que Terraform aplicará, ejecuta el comando terraform plan:

    terraform plan
    

    El resultado es una lista de todas las acciones que se espera que Terraform realice para aprovisionar recursos en el entorno de Google Cloud. El resumen de todas las acciones es similar al siguiente:

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

    La cantidad total de acciones de adición es 8, sin cambios y sin eliminaciones.

  3. Ejecuta el comando terraform apply para crear los recursos en tu proyecto de Google Cloud:

    terraform apply
    
  4. Para continuar con la ejecución del comando, ingresa yes.

Envía los archivos fuente a Cloud Source Repositories

Para que la canalización de compilación ejecute la compilación, el Dockerfile y los archivos de configuración de Cloud Build deben almacenarse en un repositorio de código fuente de Cloud Source Repositories.

  1. En Cloud Shell, clona el repositorio de código fuente:

    cd $HOME
    gcloud source repos clone cross-build
    
  2. Copia el Dockerfile y el archivo de configuración de Cloud Build en el repositorio de código fuente:

    cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
    
  3. Confirma y envía los archivos en el repositorio de código fuente:

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

Inspecciona los resultados

Mientras el trabajo de Cloud Build está en ejecución y después de su finalización, puedes inspeccionar la ejecución de cada paso de compilación en la página del historial de compilaciones de Cloud Build.

Lista de compilación en la página del historial de compilación de Cloud Build.

Compilación de Cloud Build

En la página Historial de compilación, obtienes una descripción general de los pasos de compilación, junto con el tiempo que llevó ejecutar cada paso, como se muestra en la siguiente ilustración.

Pasos de compilación en el historial de Cloud Build.

Si abres un paso de compilación, verás el resultado de ese paso. Por ejemplo, los detalles de compilación del paso buildx inspect en el diagrama anterior muestran la arquitectura de plataforma de destino diferente que admite la 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

Los detalles de la compilación para el cuarto paso muestran el resultado de la compilación para cada arquitectura 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

Manifiesto de imágenes en Container Registry

Una vez completada la compilación, puedes inspeccionar el manifiesto de imágenes en la página Imágenes de Container Registry en la consola de Google Cloud, como se muestra en la siguiente ilustración.

Manifiesto de imágenes en la página Imágenes de Container Registry.

Si abres el repositorio test en la lista de repositorios, verás todas las versiones de imagen de contenedor que pertenecen al repositorio test, como se muestra en la siguiente ilustración.

Lista de versiones de imágenes.

Puedes abrir la imagen que tiene la etiqueta latest para abrirla en la página Detalles del resumen a fin de ver información detallada sobre la imagen, como se muestra en la siguiente ilustración.

Detalles de resumen para una imagen.

En la página Detalles del resumen, puedes expandir la sección Manifiesto y verificar que la arquitectura de destino que creó la compilación esté establecida en el archivo, como en el siguiente ejemplo:

{
  "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"
        }
     }
  ]
}

También puedes ver el manifiesto de la imagen directamente desde Cloud Shell.

  • En Cloud Shell, se muestra el manifiesto de la imagen:

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

    El resultado es el mismo que el archivo de manifiesto que puedes expandir en la página Detalles del resumen.

Configura la implementación continua desde la canalización de compilación

Para compilar la imagen del contenedor de la nueva arquitectura de hardware, modifica el archivo de configuración de compilación mediante la adición de la nueva arquitectura de destino. Después de confirmar y enviar el cambio al repositorio de código fuente en Cloud Source Repositories, Cloud Build inicia una compilación nueva. La compilación produce una versión nueva de la imagen de contenedor de varias arquitecturas, incluida la compatibilidad con la arquitectura de hardware agregada recientemente.

  1. En Cloud Shell, agrega la nueva plataforma de destino al archivo de configuración de compilación:

    cd "$HOME"/cross-build
    sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
    
  2. Confirma y envía el cambio al repositorio de código fuente:

    git add .
    git commit -m "add a new target platform"
    git push
    
  3. Consulta el manifiesto más reciente para verificar que la plataforma de destino nueva sea parte de la última imagen del contenedor:

    DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
    
  4. Verifica que la plataforma de destino recién agregada esté en el archivo de manifiesto, similar al siguiente resultado:

    {
      "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"
            }
         }
      ]
    }
    

Realiza una limpieza

La manera más fácil de eliminar la facturación es borrar el proyecto de Google Cloud que creaste para el instructivo. Como alternativa, puedes borrar los recursos individuales.

Borra el proyecto

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

Si deseas conservar el proyecto que utilizaste en este instructivo, realiza los siguientes pasos para borrar los recursos que creaste en este instructivo.

  1. En Cloud Shell, borra las imágenes del contenedor:

    gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
    
  2. Borra los recursos que aprovisionaste con Terraform:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform
    terraform destroy
    
  3. Ingrese yes para confirmar la eliminación.

Próximos pasos