Migrazione di container da un registry di terze parti

Se estrai alcune immagini container direttamente dai registri di terze parti il deployment in ambienti Google Cloud come Google Kubernetes Engine o Cloud Run, i limiti di frequenza per i pull delle immagini o le interruzioni di terze parti possono interrompere le build deployment di machine learning. In questa pagina viene descritto come identificare e copiare queste immagini in un registry in Google Cloud per un'immagine container consolidata e coerente gestione dei dispositivi.

Inoltre, puoi sfruttare altre funzionalità, tra cui la protezione della catena di fornitura del software con l'analisi delle vulnerabilità e l'applicazione dei criteri di deployment con Autorizzazione binaria.

Scelta di un registro

Artifact Registry è il servizio consigliato per l'archiviazione e la gestione immagini container e altri artefatti di build in Google Cloud.

Panoramica della migrazione

La migrazione delle immagini container 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 a registry di terze parti
    • Determinare la frequenza di pull delle immagini da registri di terze parti utilizzando Cloud Logging e BigQuery.
  3. Copia le immagini identificate in Container Registry.
  4. Verifica che le autorizzazioni per il Registro di sistema siano corrette configurate, in particolare se Container Registry e Google Cloud di deployment si trovano in progetti diversi.
  5. Aggiorna i file manifests per i deployment.
  6. Esegui di nuovo il deployment dei carichi di lavoro.
  7. (Facoltativo) Blocca i deployment di immagini provenienti da fonti di terze parti.

Container Registry non monitora i registri di terze parti per verificare la presenza di aggiornamenti a che copi in Container Registry. Se vuoi incorporare una nuova di un'immagine nella pipeline, devi eseguirne il push e Container Registry.

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 Container Registry.
  2. Vai alla pagina del selettore progetti

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

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

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

    gcloud services enable \
    containerregistry.googleapis.com \
    stackdriver.googleapis.com \
    logging.googleapis.com \
    monitoring.googleapis.com
    
  5. Verifica che sia installata la versione 1.13 di Go o versioni successive.

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

      go version
      
    • Se devi installare o aggiornare Go, consulta la sezione documentazione di installazione.

Costi

Questa guida utilizza i seguenti componenti fatturabili di Google Cloud:

Identifica le immagini di cui eseguire la migrazione

Cerca i file che utilizzi per la creazione e il deployment delle immagini container riferimenti a registry di terze parti, 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. Questo potrebbe dove il codice viene archiviato localmente o in Cloud Shell, se i file sono disponibili in una VM.

Nella directory con i tuoi 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 in tutti i Dockerfile nella directory e identifica Riga "FROM". Modifica il comando in base alle tue esigenze in modo che corrisponda al modo in cui archivi i tuoi Dockerfile.

Identificare i riferimenti nei manifest

Esegui questo passaggio in una posizione in cui vengono archiviati i manifest di Cloud Run. Potrebbe essere qui il tuo codice in locale o in Cloud Shell, se i file disponibili in una VM.

  1. Nella directory con il tuo GKE o Cloud Run dei manifest eseguono 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 tua directory e identifica La riga image:, apporta le modifiche necessarie per gestire il modo in cui vengono archiviati i 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 nell'oggetto Kubernetes e ottiene i nomi delle immagini.

    Esempio di output:

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

Esegui questo comando per tutti i cluster GKE su tutti progetti Google Cloud per una copertura totale.

Identificare la frequenza di pull da un registro di terze parti

Nei progetti che eseguono il pull da registri di terze parti, usa informazioni sulla configurazione frequenza di pull per determinare se l'utilizzo è vicino o superiore a eventuali limiti di frequenza 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 puoi utilizzare uno script per raccogliere dati tra progetti.

Per creare un sink per un singolo progetto:

Queste istruzioni si riferiscono all'interfaccia di anteprima di Logging.

  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. Filtro cronologia delle modifiche da Ultima 1 ora a Ultimi 7 giorni.

    immagine

  5. Fai clic su Esegui query.

  6. Dopo aver verificato la corretta visualizzazione dei risultati, fai clic su Azioni > Crea sink.

  7. Nell'elenco dei sink, seleziona Set di dati BigQuery, quindi fai clic su Avanti.

  8. Nel riquadro di modifica del sink, esegui questi passaggi:

    • Nel campo Nome sink, inserisci image_pull_logs.
    • Nel campo Destinazione sink, crea un nuovo set di dati o scegli set di dati 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 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, separate da spazi. Ad esempio project1 project2 project3.
    • DATASET-PROJECT è il progetto in cui vuoi archiviare i tuoi del 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 fluire tabelle BigQuery, a seconda della frequenza di estrazione delle immagini.

Query per la frequenza di pull

Una volta ottenuto un campione rappresentativo di estrazioni di immagini create dalle tue build, eseguire 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 tuo set di dati.
    • DATASET-NAME è il nome del set di dati.

L'esempio seguente mostra l'output della query. Nel campo imageName colonna, puoi rivedere la frequenza di pull per le immagini che non sono memorizzate di Container Registry o Artifact Registry.

immagine

Copia immagini in Container Registry

Dopo aver identificato le immagini nei registri di terze parti, puoi e copiarli in Container Registry. Lo strumento gcrane ti aiuta il processo di copia.

  1. Crea un file di testo images.txt in Cloud Shell con i nomi dei le immagini identificate. 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 "${GCR_PROJECT}" ]
    then
        echo ERROR: GCR_PROJECT must be set before running this
        exit 1
    fi
    
    for img in ${images}
    do
        gcrane cp ${img} gcr.io/${GCR_PROJECT}/${img}
    done
    

    Rendi eseguibile lo script:

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

    GCR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Verifica autorizzazioni

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

  • Cloud Build può eseguire il push e il pull delle immagini
  • Ambienti di runtime come GKE, Cloud Run, nell'ambiente flessibile di App Engine e Compute Engine può eseguire il pull delle immagini.

Se hai bisogno di eseguire il push o il pull delle immagini tra progetti o se usi di terze parti nella pipeline che devono accedere a Container Registry, assicurati che le autorizzazioni siano configurate correttamente prima di eseguire l'aggiornamento rieseguire il deployment dei carichi di lavoro.

Per ulteriori informazioni, consulta la documentazione relativa al controllo dell'accesso.

Aggiorna i manifest per fare riferimento a Container Registry

Aggiorna i Dockerfile e i manifest per fare riferimento a Container Registry anziché in quello 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 punta all'immagine in Container Registry:

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: gcr.io/<GCR_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 di molti file di testo.

Esegui di nuovo il deployment dei carichi di lavoro

Esegui di nuovo il deployment dei carichi di lavoro con i manifest aggiornati.

Tieni traccia dei nuovi pull di immagini eseguendo la seguente query nel 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 pull di immagini devono provenire da Container Registry e contenere la stringa gcr.io.

(Facoltativo) Blocca i pull delle immagini da registri di terze parti

Per i cluster GKE che utilizzano Autorizzazione binaria, il criterio che definisci blocca automaticamente i pull da fonti non attendibili. Assicurati che gli elementi le immagini non vengono bloccate in base al criterio aggiungendole all'elenco di esenzioni. Queste istruzioni descrivono come specificare un'esenzione per tutte le immagini archiviate in Container Registry all'interno del tuo progetto.

Quando aggiorni il criterio per la prima volta, valuta la possibilità di abilitare la modalità dry run. Invece di blocco delle immagini, Autorizzazione binaria crea voci di audit log per identificare le immagini in sospeso dei registri di terze parti, in Container Registry.

Per ulteriori informazioni sulla configurazione dei criteri di deployment, consulta Documentazione di Autorizzazione binaria.

  1. Vai alla pagina Autorizzazione binaria
  2. Fai clic su Modifica criterio.
  3. In Regola predefinita del progetto, abilita Modalità dry run.
  4. In Immagini esenti da regole di deployment, lascia Attendi tutte Immagini di sistema fornite da Google selezionate.
  5. Espandi Percorsi immagine.
  6. Aggiungi il percorso delle immagini come esenzione dalla regola di progetto predefinita:
    1. Fai clic su Aggiungi immagini in fondo all'elenco delle immagini.
    2. Inserisci il percorso dell'immagine per il tuo progetto Google Cloud. Ad esempio, gcr.io/my-project/* esclude tutte le immagini nel progetto my-project.
  7. Ripeti il passaggio precedente per altri progetti contenenti immagini. di cui vuoi eseguire il deployment.

Esamina gli eventi di prova in Logging per i tuoi deployment. Esegui la migrazione delle eventuali immagini rimanenti che estrai regolarmente da registri di terze parti. Quando tutte le immagini vengono migrati, puoi modificare il criterio per disattivare la modalità dry run e bloccare da fonti non attendibili.