Creazione di immagini container con multi-architettura per i dispositivi IoT


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.

Pipeline composta da repository di codice, Cloud Build e Container Registry.

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. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

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

    Go to project selector

  2. 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.

  1. Nella console Google Cloud, attiva Cloud Shell.

    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.

  2. Clona il repository del codice campione:

    cd "$HOME"
    git clone \
    https://github.com/GoogleCloudPlatform/solutions-build-multi-architecture-images-tutorial.git
    
  3. 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:
    
  4. In una finestra del browser, apri l'URL visualizzato nell'output della generazione delle credenziali predefinite dell'applicazione (passaggio precedente).

  5. Seleziona Consenti per continuare.

  6. 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:

  1. 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
    
  2. 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}
    
  3. 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}
    
  4. 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}
    
  5. 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 file application_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:

In Cloud Shell, segui questi passaggi:

  1. Per inizializzare la directory di lavoro Terraform, esegui il comando terraform init:

    cd terraform
    terraform init
    
  2. (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.

  3. Esegui il comando terraform apply per creare le risorse nel tuo progetto Google Cloud:

    terraform apply
    
  4. 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.

  1. In Cloud Shell, clona il repository di origine:

    cd $HOME
    gcloud source repos clone cross-build
    
  2. 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
    
  3. 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.

Elenco di build nella pagina della cronologia 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.

Creare passi nella cronologia di Cloud Build.

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.

Manifest dell'immagine nella pagina delle immagini di Container Registry.

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.

Elenco delle versioni dell'immagine.

Puoi aprire l'immagine contrassegnata come latest per aprire la pagina Dettagli sintesi e visualizzare informazioni dettagliate sull'immagine, come mostra la seguente illustrazione.

Dettagli della sintesi di un'immagine.

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.

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. 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.

  1. In Cloud Shell, elimina le immagini container:

    gcloud container images delete gcr.io/${DEVSHELL_PROJECT_ID}/test --quiet
    
  2. Elimina le risorse di cui hai eseguito il provisioning con Terraform:

    cd $HOME/solutions-build-multi-architecture-images-tutorial/terraform
    terraform destroy
    
  3. Inserisci yes per confermare l'eliminazione.

Passaggi successivi