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:
- Configura i prerequisiti.
- 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.
- Copia le immagini identificate in Artifact Registry.
- 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.
- Aggiorna i manifest per i tuoi deployment.
- 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
- 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.
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
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'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Crea un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon 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_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
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
-
Installa Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
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'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Crea un progetto Google Cloud :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon 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_IDcon il nome del progetto Google Cloud .
-
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud .
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
- 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.
- Verifica le autorizzazioni. Devi disporre del ruolo IAM Proprietario o Editor per i progetti in cui esegui la migrazione delle immagini ad Artifact Registry.
- Esporta le seguenti variabili di ambiente:
export PROJECT=$(gcloud config get-value project)
- Verifica che sia installata la versione 1.13 o successiva di Go.
Se devi installare o aggiornare Go, consulta la documentazione di installazione di Go.go version
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.- Nella directory con i manifest GKE o Cloud Run, esegui questo comando:
L'output è simile al seguente:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
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./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc ./code/deploy/k8s/master.yaml:26: image: kubernetes/redis:v1 - Per elencare le immagini in esecuzione su un cluster, esegui questo comando:
Questo comando restituisce tutti gli oggetti in esecuzione nel cluster Kubernetes selezionato e recupera i relativi nomi delle immagini. L'output è simile al seguente:kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
- 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:
-
Nella console Google Cloud , vai alla pagina Esplora log:
Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Logging.
Scegli un progetto Google Cloud .
Nella scheda Query Builder, inserisci la seguente query:
resource.type="k8s_pod" jsonPayload.reason="Pulling"Cambia il filtro della cronologia delle modifiche da Ultima ora a Ultimi 7 giorni.

Fai clic su Esegui query.
Dopo aver verificato che i risultati vengano visualizzati correttamente, fai clic su Azioni > Crea sink.
Nella finestra di dialogo Dettagli sink, completa quanto segue:
- Nel campo Nome sink, inserisci
image_pull_logs. - In Descrizione sink, inserisci una descrizione del sink.
- Nel campo Nome sink, inserisci
Fai clic su Avanti.
Nella finestra di dialogo Destinazione sink, seleziona i seguenti valori:
- Nel campo Seleziona il servizio sink, seleziona Set di dati BigQuery.
- 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.
- Fai clic su Crea set di dati.
Fai clic su Avanti.
Nella sezione Scegli i log da includere nel sink, la query corrisponde alla query eseguita nella scheda Query Builder.
Fai clic su Avanti.
(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.
Fai clic su Crea sink.
Il sink di log è stato creato.
Per creare un sink per più progetti:
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"' donedove
- 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.
- PROJECT-LISTè un elenco di ID progetto Google Cloud ,
separati da spazi. Ad esempio
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.
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 DESCdove
- DATASET-PROJECT è il progetto che contiene il set di dati.
- DATASET-NAME è il nome del set di dati.
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.
Crea un file di testo
images.txtcon i nomi delle immagini che hai identificato. Ad esempio:ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebookScarica gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcraneCrea uno script denominato
copy_images.shper 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} doneSostituisci
LOCATIONcon la località regionale o multiregionale del repository.Rendi eseguibile lo script:
chmod +x copy_images.shEsegui 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.