Questo tutorial è la seconda parte di una serie che illustra la creazione di una pipeline di integrazione continua (CI) automatizzata per creare immagini container multi-architettura su Google Cloud.
In questo tutorial, implementerai una pipeline per la creazione di immagini container con più architettura utilizzando Cloud Build e Container Registry. Questo tutorial è un esempio della strategia di creazione con più architetture descritta nella sezione Implementazione di una pipeline per la creazione di immagini container con più architettura nella parte 1 di questa serie.
Ad esempio, supponiamo che tu gestisca un parco dispositivi IoT (Internet of Things). Man mano che emergono nuovi requisiti per la tua soluzione IoT, hai bisogno di nuovi dispositivi hardware. Se i nuovi dispositivi hanno un'architettura hardware diversa da quella di quelli esistenti, devi modificare la pipeline di build per supportare la nuova architettura.
Questo tutorial è rivolto ai professionisti IT che vogliono semplificare e semplificare le pipeline complesse per la creazione di immagini container oppure per estendere le pipeline per creare immagini multi-architettura.
Questo tutorial presuppone che tu abbia una conoscenza di base di quanto segue:
- Terraform, per la creazione di infrastrutture su Google Cloud.
- Google Cloud CLI, per l'esecuzione di attività relative alla piattaforma su Google Cloud.
- Cloud Shell, per l'esecuzione dei comandi in questo tutorial. Tutti gli strumenti usati in questo tutorial sono preinstallati in Cloud Shell.
- Cloud Build, per la configurazione di una pipeline CI.
- Docker, come piattaforma di gestione dei container.
- Container Registry, per l'archiviazione delle immagini container prodotte dal processo di compilazione.
In questo tutorial utilizzerai Terraform per impostare le risorse necessarie per eseguire il provisioning e configurare la pipeline per la creazione di immagini container.
Architettura
Il seguente diagramma illustra il flusso di lavoro per la pipeline che crei in questo tutorial per la creazione di immagini container.
Le modifiche apportate al codice sorgente dell'immagine container attivano Cloud Build per creare un'immagine container con più architetture. Al termine della build, l'immagine container con più architetture viene archiviata in Container Registry.
Obiettivi
- Usa Terraform per eseguire il provisioning della pipeline per la creazione di immagini container su Google Cloud.
- Modifica il codice sorgente dell'immagine container per attivare una nuova build.
- Esamina l'immagine container archiviata in Container Registry.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Preparazione dell'ambiente
In questo tutorial eseguirai tutti i comandi in Cloud Shell.
-
Nella console Google Cloud, attiva Cloud Shell.
Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.
Clona il repository del codice campione:
cd "$HOME" git clone \ https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
Genera le credenziali predefinite dell'applicazione:
gcloud auth application-default login --quiet
L'output è simile al seguente:
Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?code_challenge=... Enter verification code:
In una finestra del browser, apri l'URL visualizzato nell'output della generazione delle credenziali predefinite dell'applicazione (passaggio precedente).
Seleziona Consenti per continuare.
Copia il codice sullo schermo e inseriscilo in Cloud Shell.
L'output è simile al seguente:
/tmp/tmp.xxxxxxxxxx/application_default_credentials.json
Prendi nota del percorso del file
application_default_credentials.json
. Utilizza questo percorso per impostare una variabile di ambiente nella sezione successiva.
Imposta le variabili di ambiente
Prima di poter eseguire il provisioning dell'infrastruttura necessaria per questo tutorial, devi inizializzare ed esportare le seguenti variabili di ambiente:
In Cloud Shell, crea una variabile di ambiente per archiviare il nome dell'account di servizio Google Cloud che Terraform utilizza per eseguire il provisioning delle risorse:
export TF_SERVICE_ACCOUNT_NAME=tf-service-account
Crea una variabile di ambiente in cui archiviare l'ID progetto Google Cloud utilizzato da Terraform per archiviare lo state:
export TF_STATE_PROJECT=${DEVSHELL_PROJECT_ID}
Crea una variabile di ambiente in cui archiviare il bucket Cloud Storage utilizzato da Terraform per salvare i file di stato:
export TF_STATE_BUCKET=tf-state-bucket-${TF_STATE_PROJECT}
Crea una variabile di ambiente in cui è archiviato l'ID progetto Google Cloud contenente le risorse per la pipeline di creazione delle immagini container:
export GOOGLE_CLOUD_PROJECT=${DEVSHELL_PROJECT_ID}
Crea una variabile di ambiente in cui venga archiviato il percorso delle credenziali predefinite dell'applicazione Google Cloud, ovvero il valore indicato nella sezione precedente:
export GOOGLE_APPLICATION_CREDENTIALS=PATH
Sostituisci quanto segue:
PATH
: percorso del fileapplication_default_credentials.json
Provisioning dell'ambiente
Devi eseguire lo script shell generate-tf-backend.sh
che genera la configurazione del backend Terraform, gli account di servizio Google Cloud necessari e il bucket Cloud Storage per archiviare le informazioni sullo stato remoto Terraform.
In Cloud Shell, esegui il provisioning dell'ambiente di build:
cd $HOME/solutions-build-multi-architecture-images-tutorial/ ./generate-tf-backend.sh
Lo script è idempotente e sicuro da eseguire più volte.
Dopo aver eseguito correttamente lo script per la prima volta, l'output è simile al seguente:
Generating the descriptor to hold backend data in terraform/backend.tf terraform { backend "gcs" { bucket = "tf-state-bucket-project-id" prefix = "terraform/state" } }
Creazione della pipeline di build
Il file del modello Terraform terraform/main.tf
definisce le risorse create per questo tutorial. Eseguendo Terraform con il descrittore, crei le seguenti risorse Google Cloud:
- Un repository di codice Cloud Source Repositories per archiviare il descrittore dell'immagine del container e il file di configurazione della build di Cloud Build.
- Un argomento Pub/Sub in cui Cloud Build pubblica messaggi a ogni modifica del codice sorgente.
- Una build di Cloud Build che crea l'immagine container con più architetture.
- Un repository Container Registry per archiviare le immagini container.
In Cloud Shell, segui questi passaggi:
Per inizializzare la directory di lavoro Terraform, esegui il comando terraform init:
cd terraform terraform init
(Facoltativo) Per esaminare le modifiche che Terraform applicherà, esegui il comando terraform plan:
terraform plan
L'output è un elenco di tutte le azioni che Terraform dovrebbe eseguire per eseguire il provisioning delle risorse nell'ambiente Google Cloud. Il riepilogo di tutte le azioni è simile al seguente:
Plan: 8 to add, 0 to change, 0 to destroy.
Il numero totale di azioni di aggiunta è 8, senza modifiche o eliminazioni.
Esegui il comando terraform apply per creare le risorse nel tuo progetto Google Cloud:
terraform apply
Per continuare a eseguire il comando, inserisci
yes
.
Push dei file di origine in Cloud Source Repositories
Affinché la pipeline di build esegua la build, il Dockerfile e i file di configurazione di Cloud Build devono essere archiviati in un repository di codice sorgente di Cloud Source Repositories.
In Cloud Shell, clona il repository di origine:
cd $HOME gcloud source repos clone cross-build
Copia il Dockerfile e il file di configurazione di Cloud Build nel repository del codice sorgente:
cp -r "$HOME"/solutions-build-multi-architecture-images-tutorial/terraform/cloud-build/. "$HOME"/cross-build
Esegui il commit e il push dei file nel repository del codice sorgente:
cd "$HOME"/cross-build git add . git commit -m "Initial commit" git push
Controllo dei risultati
Mentre il job Cloud Build è in esecuzione e dopo il suo completamento, puoi controllare l'esecuzione di ogni passaggio di build nella pagina Cronologia build di Cloud Build.
Build di Cloud Build
Nella pagina Cronologia build viene visualizzata una panoramica dei passaggi della build, insieme al tempo necessario per eseguire ogni passaggio, come mostrato nell'illustrazione seguente.
Se apri un passaggio di build, vedrai l'output di quel passaggio. Ad esempio, i dettagli di compilazione del passaggio di ispezione buildx nel diagramma precedente mostrano la diversa architettura della piattaforma di destinazione supportata dalla piattaforma:
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
I dettagli della build per il quarto passaggio mostrano l'output della build per ogni architettura di destinazione:
#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
Manifest immagine in Container Registry
Una volta completata la build, puoi esaminare il manifest dell'immagine nella pagina Immagini di Container Registry nella console Google Cloud, come illustrato nell'illustrazione seguente.
Se apri il repository test nell'elenco dei repository, vedrai tutte le versioni delle immagini dei container che appartengono al repository test, come mostra la seguente illustrazione.
Puoi aprire l'immagine contrassegnata come latest per aprire la pagina Dettagli sintesi e visualizzare informazioni dettagliate sull'immagine, come mostra la seguente illustrazione.
Nella pagina Dettagli del digest, puoi espandere la sezione Manifest e verificare che tutta l'architettura di destinazione creata dalla build sia indicata nel file, come illustrato nell'esempio seguente:
{ "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" } } ] }
Puoi anche visualizzare il manifest dell'immagine direttamente da Cloud Shell.
In Cloud Shell, visualizza il manifest dell'immagine:
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/"${DEVSHELL_PROJECT_ID}"/test:latest
L'output è uguale al file manifest che puoi espandere nella pagina Dettagli del digest.
Configurazione del deployment continuo dalla pipeline di build
Per creare l'immagine container per la nuova architettura hardware, devi modificare il file di configurazione della build aggiungendo la nuova architettura di destinazione. Dopo aver eseguito il commit e il push della modifica nel repository di codice sorgente in Cloud Source Repositories, Cloud Build avvia una nuova build. La build produce una nuova versione dell'immagine container multi-architettura, compreso il supporto per l'architettura hardware appena aggiunta.
In Cloud Shell, aggiungi la nuova piattaforma di destinazione al file di configurazione della build:
cd "$HOME"/cross-build sed -i -e 's/linux\/arm\/v7/linux\/arm\/v7,linux\/386/g' build-docker-image-trigger.yaml
Esegui il commit della modifica ed eseguine il push nel repository del codice sorgente:
git add . git commit -m "add a new target platform" git push
Visualizza il manifest più recente per verificare che la nuova piattaforma di destinazione faccia parte dell'immagine container più recente:
DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect gcr.io/${DEVSHELL_PROJECT_ID}/test:latest
Verifica che la piattaforma di destinazione appena aggiunta sia presente nel file manifest, simile al seguente output:
{ "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" } } ] }
Esegui la pulizia
Il modo più semplice per eliminare la fatturazione è eliminare il progetto Google Cloud che hai creato per il tutorial. In alternativa, puoi eliminare le singole risorse.
Elimina il progetto
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina le singole risorse
Se vuoi conservare il progetto che hai utilizzato in questo tutorial, segui questi passaggi per eliminare le risorse create in questo tutorial.
In Cloud Shell, elimina le immagini container:
gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
Elimina le risorse di cui hai eseguito il provisioning con Terraform:
cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform terraform destroy
Inserisci
yes
per confermare l'eliminazione.
Passaggi successivi
- Leggi l'articolo Immagini container multi-architettura per dispositivi IoT.
- Scopri di più sulla gestione dell'infrastruttura come codice con Terraform, Cloud Build e GitOps.
- Ulteriori informazioni su DevOps sono disponibili nella pagina DevOps.
- Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Cloud Architecture Center.