Esegui la migrazione delle immagini container da un registry di terze parti

La migrazione delle immagini container da registri di terze parti ad Artifact Registry consente di consolidare la gestione delle immagini ed evitare interruzioni della build o del deployment dovute a limiti di frequenza e interruzioni esterni. Puoi identificare le immagini di cui viene eseguito spesso il pull e copiarle in Artifact Registry per i deployment in ambienti Google Cloud come Google Kubernetes Engine o Cloud Run.

Panoramica della migrazione

La migrazione delle immagini container prevede i seguenti passaggi:

  1. Configura i prerequisiti.
  2. Identifica le immagini di cui eseguire la migrazione.
    • Cerca nei file Dockerfile e nei manifest di deployment i riferimenti ai registry di terze parti
    • Determina la frequenza di pull delle immagini dai registry di terze parti utilizzando Cloud Logging e BigQuery.
  3. Copia le immagini identificate in Artifact Registry.
  4. Verifica che le autorizzazioni per il registry siano configurate correttamente, in particolare se Artifact Registry e l'ambiente di deployment Google Cloudsi trovano in progetti diversi.
  5. Aggiorna i manifest per i tuoi deployment.
  6. Riesegui il deployment dei workload.

Artifact Registry non monitora i registry upstream per verificare la presenza di aggiornamenti alle immagini copiate. Se vuoi incorporare una versione più recente di un'immagine nella tua pipeline, devi eseguirne il push ad Artifact Registry.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. Installa Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Crea o seleziona un progetto Google Cloud .

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per cui ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Crea un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  6. Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .

  7. Abilita l'API Artifact Registry, se non è già abilitata:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    gcloud services enable artifactregistry.googleapis.com
  8. Installa Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Crea o seleziona un progetto Google Cloud .

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per cui ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Crea un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  12. Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .

  13. Abilita l'API Artifact Registry, se non è già abilitata:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente hai già questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore Service Usage (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    gcloud services enable artifactregistry.googleapis.com
  14. Se non hai un repository Artifact Registry, creane uno e configura l'autenticazione per i client di terze parti che richiedono l'accesso al repository.
  15. Verifica le autorizzazioni. Devi disporre del ruolo IAM Proprietario o Editor per i progetti in cui esegui la migrazione delle immagini ad Artifact Registry.
  16. Esporta le seguenti variabili di ambiente:
    export PROJECT=$(gcloud config get-value project)
  17. Verifica che sia installata la versione 1.13 o successiva di Go.
    go version
    Se devi installare o aggiornare Go, consulta la documentazione di installazione di Go.

Costi

Questa guida utilizza i seguenti componenti fatturabili di Google Cloud:

Identifica le immagini di cui eseguire la migrazione

Cerca nei file che utilizzi per creare ed eseguire il deployment delle immagini container i riferimenti ai registry di terze parti, quindi controlla la frequenza con cui esegui il pull delle immagini.

Identifica i riferimenti nei Dockerfile

Esegui questo passaggio in una posizione in cui sono archiviati i tuoi Dockerfile. Potrebbe trattarsi della posizione in cui il codice è stato sottoposto a checkout localmente o in Cloud Shell se i file sono disponibili in una VM.

Nella directory con i Dockerfile, esegui questo comando:

grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'

L'output si presenta come nell'esempio seguente:

./code/build/baseimage/Dockerfile:1:FROM debian:stretch
./code/build/ubuntubase/Dockerfile:1:FROM ubuntu:latest
./code/build/pythonbase/Dockerfile:1:FROM python:3.5-buster

Questo comando cerca tutti i Dockerfile nella directory e identifica la riga "FROM". Modifica il comando in base alle tue esigenze per adattarlo al modo in cui archivi i tuoi Dockerfile.

Identifica i riferimenti nei manifest

Esegui questi passaggi in una posizione in cui sono archiviati i manifest GKE o Cloud Run. Potrebbe trattarsi della posizione in cui il codice è stato sottoposto a checkout localmente o in Cloud Shell se i file sono disponibili in una VM.
  1. Nella directory con i manifest GKE o Cloud Run, esegui questo comando:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    L'output è simile al seguente:
        ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc
        ./code/deploy/k8s/master.yaml:26:      image: kubernetes/redis:v1
        
    Questo comando esamina tutti i file YAML nella directory e identifica la riga image:. Modifica il comando in base alle tue esigenze per utilizzarlo con il modo in cui sono archiviati i manifest
  2. Per elencare le immagini in esecuzione su un cluster, esegui questo comando:
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Questo comando restituisce tutti gli oggetti in esecuzione nel cluster Kubernetes selezionato e recupera i relativi nomi delle immagini. L'output è simile al seguente:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

Esegui i comandi precedenti per tutti i cluster GKE in tutti i progettiGoogle Cloud per una copertura totale.

Identifica la frequenza di pull da un registry di terze parti

Nei progetti che eseguono il pull da registry di terze parti, utilizza le informazioni sulla frequenza di pull delle immagini per determinare se l'utilizzo è vicino o superiore ai limiti di frequenza applicati dal registry di terze parti.

Raccogli i dati di log

Crea un sink di log per esportare i dati in BigQuery. Un sink di log include una destinazione e una query che seleziona le voci di log da esportare. Puoi creare un sink eseguendo query su singoli progetti o utilizzare uno script per raccogliere dati tra i progetti.

Per creare un sink per un singolo progetto:

  1. Nella console Google Cloud , vai alla pagina Esplora log:

    Vai a Esplora log

    Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.

  2. Scegli un progetto Google Cloud .

  3. Nella scheda Query Builder, inserisci la seguente query:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Cambia il filtro della cronologia delle modifiche da Ultima ora a Ultimi 7 giorni. immagine

  5. Fai clic su Esegui query.

  6. Dopo aver verificato che i risultati vengano visualizzati correttamente, fai clic su Azioni > Crea sink.

  7. Nella finestra di dialogo Dettagli sink, completa quanto segue:

    1. Nel campo Nome sink, inserisci image_pull_logs.
    2. In Descrizione sink, inserisci una descrizione del sink.
  8. Fai clic su Avanti.

  9. Nella finestra di dialogo Destinazione sink, seleziona i seguenti valori:

    1. Nel campo Seleziona il servizio sink, seleziona Set di dati BigQuery.
    2. Nel campo Seleziona set di dati BigQuery, seleziona Crea un nuovo set di dati BigQuery e completa le informazioni richieste nella finestra di dialogo che si apre. Per saperne di più su come creare un set di dati BigQuery, consulta Crea set di dati.
    3. Fai clic su Crea set di dati.
  10. Fai clic su Avanti.

    Nella sezione Scegli i log da includere nel sink, la query corrisponde alla query eseguita nella scheda Query Builder.

  11. Fai clic su Avanti.

  12. (Facoltativo) Scegli i log da escludere dal sink. Per saperne di più su come eseguire query e filtrare i dati di Cloud Logging, consulta Linguaggio di query di Logging.

  13. Fai clic su Crea sink.

    Il sink di log è stato creato.

Per creare un sink per più progetti:

  1. Apri Cloud Shell.

  2. Esegui questi comandi in Cloud Shell:

    PROJECTS="PROJECT-LIST"
    DESTINATION_PROJECT="DATASET-PROJECT"
    DATASET="DATASET-NAME"
    
    for source_project in $PROJECTS
    do
      gcloud logging --project="${source_project}" sinks create image_pull_logs bigquery.googleapis.com/projects/${DESTINATION_PROJECT}/datasets/${DATASET} --log-filter='resource.type="k8s_pod" jsonPayload.reason="Pulling"'
    done
    

    dove

    • PROJECT-LISTè un elenco di ID progetto Google Cloud , separati da spazi. Ad esempio project1 project2 project3.
    • DATASET-PROJECT è il progetto in cui vuoi archiviare il set di dati.
    • DATASET-NAME è il nome del set di dati, ad esempio image_pull_logs.

Dopo aver creato un sink, è necessario del tempo prima che i dati vengano trasferiti alle tabelle BigQuery, a seconda della frequenza con cui viene eseguito il pull delle immagini.

Query per la frequenza di pull

Una volta ottenuto un campione rappresentativo di pull di immagini effettuati dalle build, esegui una query per la frequenza di pull.

  1. Vai alla console BigQuery.

  2. Esegui questa query:

    SELECT
      REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
      COUNT(*) AS numberOfPulls
    FROM
          `DATASET-PROJECT.DATASET-NAME.events_*`
    GROUP BY
          imageName
    ORDER BY
          numberOfPulls DESC
    

    dove

    • DATASET-PROJECT è il progetto che contiene il set di dati.
    • DATASET-NAME è il nome del set di dati.
L'esempio seguente mostra l'output della query. Nella colonna imageName, puoi esaminare la frequenza di pull per le immagini non archiviate in Artifact Registry.

immagine

Copia le immagini in Artifact Registry

Dopo aver identificato le immagini dai registry di terze parti, puoi copiarle in Artifact Registry. Lo strumento gcrane ti aiuta con il processo di copia.

  1. Crea un file di testo images.txt con i nomi delle immagini che hai identificato. Ad esempio:

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. Scarica gcrane.

      GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
    
  3. Crea uno script denominato copy_images.sh per copiare l'elenco di file.

    #!/bin/bash
    
    images=$(cat images.txt)
    
    if [ -z "${AR_PROJECT}" ]
    then
        echo ERROR: AR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} LOCATION-docker.pkg.dev/${AR_PROJECT}/${img}
    done
    

    Sostituisci LOCATION con la località regionale o multiregionale del repository.

    Rendi eseguibile lo script:

      chmod +x copy_images.sh
    
  4. Esegui lo script per copiare i file:

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Verifica le autorizzazioni

Assicurati che le autorizzazioni siano configurate correttamente prima di aggiornare ed eseguire nuovamente il deployment dei workload.

Per saperne di più, consulta la documentazione sul controllo degli accessi.

Aggiorna i manifest di aggiornamento per fare riferimento ad Artifact Registry

Aggiorna i Dockerfile e i manifest in modo che facciano riferimento ad Artifact Registry anziché al registry di terze parti.

L'esempio seguente mostra un manifest che fa riferimento a un registry di terze parti:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

Questa versione aggiornata del manifest rimanda a un'immagine su us-docker.pkg.dev.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: us-docker.pkg.dev/<AR_PROJECT>/nginx:1.14.2
        ports:
        - containerPort: 80

Per un numero elevato di manifest, utilizza sed o un altro strumento in grado di gestire gli aggiornamenti in molti file di testo.

Esegui nuovamente il deployment dei workload

Esegui nuovamente il deployment dei workload con i manifest di aggiornamento.

Tieni traccia dei nuovi pull di immagini eseguendo la seguente query nella console BigQuery:

SELECT`

FORMAT_TIMESTAMP("%D %R", timestamp) as timeOfImagePull,
REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
COUNT(*) AS numberOfPulls
FROM
  `image_pull_logs.events_*`
GROUP BY
  timeOfImagePull,
  imageName
ORDER BY
  timeOfImagePull DESC,
  numberOfPulls DESC

Tutte le nuove estrazioni di immagini devono provenire da Artifact Registry e contenere la stringa docker.pkg.dev.