Artifact Registry non monitora i registry di terze parti per gli aggiornamenti delle immagini che copi in Artifact Registry. Se vuoi incorporare una versione più recente di un'immagine nella tua pipeline, devi eseguirne il push in Artifact Registry.
Panoramica della migrazione
La migrazione delle immagini del contenitore include 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 estrazione 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 Cloudsono in progetti diversi.
- Aggiorna i manifest per i tuoi deployment.
- Esegui nuovamente il deployment dei carichi di lavoro.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To use a federated identity with the gcloud CLI, you must first configure the tool to use a federated identity.
For more information, see Browser-based sign-in with the gcloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
- Install the Google Cloud CLI.
-
To use a federated identity with the gcloud CLI, you must first configure the tool to use a federated identity.
For more information, see Browser-based sign-in with the gcloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
- Se non disponi di un repository Artifact Registry, creane uno e configura l'autenticazione per i client di terze parti che richiedono l'accesso al repository.
- Verifica le tue autorizzazioni. Devi disporre del ruolo IAM Proprietario o Editor per i progetti in cui esegui la migrazione delle immagini in 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 riferimenti a registri di terze parti nei file che utilizzi per creare ed eseguire il deployment delle immagini container, quindi controlla la frequenza con cui esegui il pull delle immagini.
Identificare i riferimenti nei Dockerfile
Esegui questo passaggio in una posizione in cui sono archiviati i tuoi Dockerfile. Potrebbe essere dove il codice è stato estratto localmente o in Cloud Shell se i file sono disponibili in una VM.Nella directory con i Dockerfile, esegui il comando:
grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
L'output è simile all'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 in modo che corrisponda al modo in cui memorizzi i Dockerfile.
Identificare i riferimenti nei manifest
Esegui questi passaggi in una posizione in cui sono archiviati i manifest di GKE o Cloud Run. Potrebbe essere il luogo in cui il codice viene controllato localmente o in Cloud Shell se i file sono disponibili in una VM.- Nella directory con i manifest GKE o Cloud Run, esegui il seguente 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 esigenze per adattarlo alla modalità di archiviazione dei 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 il seguente comando:
Questo comando restituisce tutti gli oggetti in esecuzione nel cluster Kubernetes selezionato e ne recupera i 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 di tutti Google Cloud i progetti per una copertura totale.
Identificare la frequenza di pull da un registry di terze parti
Nei progetti che estraggono dati da registry di terze parti, utilizza le informazioni sulla frequenza di estrazione delle immagini per determinare se il tuo utilizzo è vicino o supera i limiti di frequenza applicati dal registry di terze parti.
Raccogliere i dati dei log
Crea un sink dei 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 oppure utilizzare uno script per raccogliere i 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 Google Cloud progetto.
Nella scheda Query Builder, inserisci la seguente query:
resource.type="k8s_pod" jsonPayload.reason="Pulling"
Modifica il filtro della cronologia 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 destinazione, inserisci
image_pull_logs
. - In Descrizione della destinazione, inserisci una descrizione della destinazione.
- Nel campo Nome destinazione, inserisci
Fai clic su Avanti.
Nella finestra di dialogo Destinazione del sink, seleziona i seguenti valori:
- Nel campo Seleziona servizio sink, seleziona Set di dati BigQuery.
- Nel campo Seleziona set di dati BigQuery, seleziona Crea un nuovo set di dati BigQuery e compila le informazioni richieste nella finestra di dialogo visualizzata. Per ulteriori informazioni su come creare un set di dati BigQuery, consulta Creare 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 a quella eseguita nella scheda Query Builder.
Fai clic su Avanti.
(Facoltativo) Scegli i log da escludere dal sink. Per ulteriori informazioni su come eseguire query e filtrare i dati di Cloud Logging, consulta Linguaggio delle query di Logging.
Fai clic su Crea sink.
Il sink di log è stato creato.
Per creare un sink per più progetti:
Esegui i seguenti 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
.
- PROJECT-LIST è un elenco di ID progetto Google Cloud ,
separati da spazi. Ad esempio
Dopo aver creato un sink, i dati impiegano del tempo per confluire nelle tabelle BigQuery, a seconda della frequenza con cui vengono estratte le immagini.
Query per la frequenza di pull
Una volta ottenuto un campione rappresentativo dei recuperi di immagini effettuati dalle tue build, esegui una query per la frequenza di recupero.
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 tuo set di dati.
- DATASET-NAME è il nome del set di dati.
Copiare le immagini in Artifact Registry
Dopo aver identificato le immagini dei registri di terze parti, puoi copiarle in Artifact Registry. Lo strumento gcrane ti aiuta con la procedura di copia.
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
Scarica gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
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
Esegui lo script per copiare i file:
AR_PROJECT=${PROJECT} ./copy_images.sh
Verificare le autorizzazioni
Assicurati che le autorizzazioni siano configurate correttamente prima di aggiornare e eseguire nuovamente il deployment dei carichi di lavoro.
Per ulteriori informazioni, consulta la documentazione sul controllo dell'accesso.
Aggiorna i manifest in modo che facciano riferimento ad Artifact Registry
Aggiorna i file Dockerfile e i manifest in modo che facciano riferimento ad Artifact Registry instead of al registry di terze parti.
L'esempio seguente mostra il 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 di nuovo il deployment dei carichi di lavoro
Esegui nuovamente il deployment dei carichi di lavoro con i manifest aggiornati.
Tieni traccia dei nuovi download 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
Tutti i nuovi estrazioni di immagini devono provenire da Artifact Registry e contenere la stringa
docker.pkg.dev
.