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

Se importi alcune immagini dei container direttamente da registry di terze parti per eseguire il deployment in ambienti Google Cloud come Google Kubernetes Engine o Cloud Run, i limiti di frequenza per i tiri delle immagini o le interruzioni di terze parti possono interrompere le build e i deployment. Questa pagina descrive come identificare e copiare queste immagini in Artifact Registry per una gestione consolidata e coerente delle immagini dei contenitori.

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:

  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 estrazione 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 il tuo ambiente di deployment Google Cloudsi trovano in progetti diversi.
  5. Aggiorna i manifests per i tuoi deployment.
  6. Esegui nuovamente il deployment dei carichi di lavoro.

Prima di iniziare

  1. Verifica le tue autorizzazioni. Devi disporre del ruolo IAM Proprietario o Editor nei progetti in cui esegui la migrazione delle immagini in Artifact Registry.
  2. Vai alla pagina del selettore dei progetti

    1. Seleziona il progetto Google Cloud in cui vuoi utilizzare Artifact Registry
    2. Nella console Google Cloud , vai a Cloud Shell
    3. Individua il tuo ID progetto e impostalo in Cloud Shell. Sostituisci YOUR_PROJECT_ID con l'ID del tuo progetto.

      gcloud config set project YOUR_PROJECT_ID
      
  3. Esporta le seguenti variabili di ambiente:

      export PROJECT=$(gcloud config get-value project)
    
  4. Abilita le API BigQuery, Artifact Registry e Cloud Monitoring con il seguente comando:

    gcloud services enable \
    artifactregistry.googleapis.com \
    stackdriver.googleapis.com \
    logging.googleapis.com \
    monitoring.googleapis.com
    
  5. Se al momento non utilizzi Artifact Registry, configura un repository per le tue immagini:

  6. Verifica che sia installata la versione 1.13 o successiva di Go.

    • Controlla la versione di un'installazione Go esistente con il comando:

      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 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 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 questo passaggio 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.

  1. Nella directory con i manifest GKE o Cloud Run, esegui il comando:

    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    

    Esempio di output:

    ./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:. Modificala in base alle esigenze per adattarla alla modalità di archiviazione dei manifest.

  2. Per elencare le immagini attualmente in esecuzione su un cluster, esegui il 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 attualmente selezionato e ne recupera i nomi delle immagini.

    Esempio di output:

    - image: nginx
      image: nginx:latest
        - image: nginx
        - image: nginx
    

Esegui questo comando per tutti i cluster GKE in tutti i progettiGoogle Cloud 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 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 oppure utilizzare uno script per raccogliere i dati tra i progetti.

Per creare un sink per un singolo progetto:

  1. Vai a Esplora log

  2. Scegli un progetto Google Cloud .

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

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Modifica il filtro della cronologia 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. Nell'elenco dei sink, seleziona Set di dati BigQuery e poi fai clic su Avanti.

  8. Nel riquadro Modifica sink, svolgi i seguenti passaggi:

    • Nel campo Nome sink, inserisci image_pull_logs.
    • Nel campo Destinazione della destinazione, crea un nuovo set di dati o scegline uno di destinazione in un altro progetto.
  9. Fai clic su Crea sink.

Per creare un sink per più progetti:

  1. Apri Cloud Shell.

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

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.

  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 contenente 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 estrazione delle immagini che non sono archiviate in Artifact Registry o Container Registry.

immagine

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

  1. Crea un file di testo images.txt in Cloud Shell 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 regione o con la multi-regione 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
    

Verificare le autorizzazioni

Per impostazione predefinita, i servizi di CI/CD di Google Cloud hanno accesso a Artifact Registry nello stesso progetto Google Cloud .

  • Cloud Build può eseguire il push e il pull delle immagini
  • Gli ambienti di runtime come GKE, Cloud Run, l'ambiente flessibile App Engine e Compute Engine possono estrarre le immagini.

Se devi eseguire push o pull di immagini tra progetti o se utilizzi strumenti di terze parti nella pipeline che devono accedere ad Artifact Registry, 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.