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.
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.
Antes de comenzar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
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.
-
En la consola de Google Cloud, activa 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.
Clona el repositorio de código de muestra:
cd "$HOME" git clone \ https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
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:
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).
Elige Permitir para continuar.
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:
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
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}
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}
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}
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 archivoapplication_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:
- Un repositorio de código de Cloud Source Repositories para almacenar el descriptor de imagen de contenedor y el archivo de configuración de compilación de Cloud Build
- Un tema de Pub/Sub en el que Cloud Build publica mensajes en cada cambio de código fuente
- Una compilación de Cloud Build que compila la imagen de contenedor de varias arquitecturas
- Un repositorio de Container Registry para almacenar imágenes de contenedor
En Cloud Shell, haz lo siguiente:
Para inicializar el directorio de trabajo de Terraform, ejecuta el comando terraform init:
cd terraform terraform init
(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.
Ejecuta el comando terraform apply para crear los recursos en tu proyecto de Google Cloud:
terraform apply
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.
En Cloud Shell, clona el repositorio de código fuente:
cd $HOME gcloud source repos clone cross-build
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
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.
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.
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.
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.
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.
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.
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
Confirma y envía el cambio al repositorio de código fuente:
git add . git commit -m "add a new target platform" git push
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
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
- En la consola de Google Cloud, ve a la página Administrar recursos.
- En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
- 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.
En Cloud Shell, borra las imágenes del contenedor:
gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
Borra los recursos que aprovisionaste con Terraform:
cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform terraform destroy
Ingrese
yes
para confirmar la eliminación.
Próximos pasos
- Lee Imágenes de contenedor de varias arquitecturas para dispositivos de IoT.
- Obtén más información sobre cómo administrar la infraestructura como código con Terraform, Cloud Build y GitOps.
- Obtén más información sobre DevOps en la página de DevOps.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.