Container-Images aus einer Drittanbieter-Registry migrieren

Wenn Sie einige Container-Images direkt aus Registrys von Drittanbietern herunterladen, um sie in Google Cloud Umgebungen wie Google Kubernetes Engine oder Cloud Run bereitzustellen, können Ratenbegrenzungen für das Abrufen von Images oder Ausfälle von Drittanbietern Ihre Builds und Bereitstellungen beeinträchtigen. Auf dieser Seite wird gezeigt, wie Sie diese Images ermitteln und zur konsolidierten, konsistenten Container-Image-Verwaltung nach Artifact Registry kopieren.

Artifact Registry überwacht keine Drittanbieter-Registrys auf Updates für Images, die Sie nach Artifact Registry kopieren. Wenn Sie eine neuere Version eines Images in Ihre Pipeline einbinden möchten, müssen Sie sie in Artifact Registry hochladen.

Übersicht über die Migration

Die Migration Ihrer Container-Images umfasst die folgenden Schritte:

  1. Richten Sie Voraussetzungen ein.
  2. Identifizieren Sie zu migrierende Images.
    • Suchen Sie in Dockerfile-Dateien und Bereitstellungsmanifesten nach Verweisen auf Registrys von Drittanbietern.
    • Ermitteln Sie mithilfe von Cloud Logging und BigQuery die Abrufhäufigkeit von Images aus Drittanbieter-Registrys.
  3. Kopieren Sie ermittelte Images nach Artifact Registry.
  4. Prüfen Sie, ob die Berechtigungen für die Registry korrekt konfiguriert sind, insbesondere wenn sich Artifact Registry und Ihre Google Cloud-Bereitstellungsumgebung in unterschiedlichen Projekten befinden.
  5. Aktualisieren Sie Manifeste für Ihre Bereitstellungen.
  6. Stellen Sie Ihre Arbeitslasten neu bereit.

Hinweis

  1. 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.
  2. Install the Google Cloud CLI.
  3. 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.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. 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.

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  8. Install the Google Cloud CLI.
  9. 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.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. 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.

  12. Make sure that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  14. Wenn Sie kein Artifact Registry-Repository haben, erstellen Sie ein Repository und konfigurieren Sie die Authentifizierung für Drittanbieter-Clients, die Zugriff auf das Repository benötigen.
  15. Prüfen Sie Ihre Berechtigungen. Sie benötigen die IAM-Rolle Inhaber oder Bearbeiter in den Projekten, in denen Sie Images zu Artifact Registry migrieren.
  16. Exportieren Sie die folgenden Umgebungsvariablen:
    export PROJECT=$(gcloud config get-value project)
  17. Prüfen Sie, ob Go Version 1.13 oder höher installiert ist.
    go version
    Wenn Sie Go installieren oder aktualisieren müssen, finden Sie Informationen dazu in der Dokumentation zur Go-Installation.

Kosten

In diesem Leitfaden werden die folgenden abrechenbaren Komponenten von Google Cloudverwendet:

Zu migrierende Images identifizieren

Suchen Sie in den Dateien, die Sie zum Erstellen und Bereitstellen Ihrer Container-Images verwenden, nach Verweise auf Registrys von Drittanbietern. Prüfen Sie dann, wie oft Sie die Images abrufen.

Verweise in Dockerfiles identifizieren

Führen Sie diesen Schritt an einem Speicherort aus, an dem Ihre Dockerfiles gespeichert sind. Dies kann dort sein, wo Ihr Code lokal geprüft wird, oder in Cloud Shell, wenn die Dateien in einer VM verfügbar sind.

Führen Sie im Verzeichnis mit Ihren Dockerfiles den folgenden Befehl aus:

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

Die Ausgabe sieht so aus:

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

Mit diesem Befehl werden alle Dockerfiles in Ihrem Verzeichnis durchsucht, um die Zeile FROM zu ermitteln. Passen Sie den Befehl entsprechend der Speicherung Ihrer Dockerfiles an.

Verweise in Manifesten ermitteln

Führen Sie diese Schritte an einem Speicherort aus, an dem Ihre GKE- oder Cloud Run-Manifeste gespeichert sind. Dies kann dort sein, wo Ihr Code lokal geprüft wird, oder in Cloud Shell, wenn die Dateien in einer VM verfügbar sind.
  1. Führen Sie den folgenden Befehl im Verzeichnis mit Ihren GKE- oder Cloud Run-Manifesten aus:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Die Ausgabe sollte in etwa so aussehen:
        ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc
        ./code/deploy/k8s/master.yaml:26:      image: kubernetes/redis:v1
        
    Mit diesem Befehl werden alle YAML-Dateien in Ihrem Verzeichnis durchsucht, um die Zeile image: zu ermitteln. Passen Sie den Befehl entsprechend der Speicherung Ihrer Manifeste an.
  2. Um die auf einem Cluster ausgeführten Images aufzulisten, führen Sie folgenden Befehl aus:
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Dieser Befehl gibt alle Objekte zurück, die im ausgewählten Kubernetes-Cluster ausgeführt werden, und ruft deren Image-Namen ab. Die Ausgabe sollte so aussehen:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

Führen Sie die vorherigen Befehle für alle GKE-Cluster in allenGoogle Cloud -Projekten aus, um eine vollständige Abdeckung zu erzielen.

Abrufhäufigkeit von Drittanbieter-Registry ermitteln

Verwenden Sie in Projekten, die aus Registrys von Drittanbietern abrufen, Informationen zur Image-Abrufhäufigkeit, um festzustellen, ob Ihre Nutzung irgendwelche Ratenbegrenzungen durch die Drittanbieter-Registry fast erreicht oder überschreitet.

Logdaten erfassen

Erstellen Sie eine Logsenke, um Daten nach BigQuery zu exportieren. Eine Senke enthält ein Ziel und eine Abfrage, mit der die Logeinträge ausgewählt werden, die exportiert werden sollen. Sie können eine Senke durch Abfrage einzelner Projekte erstellen oder durch Verwendung eines Skripts, mit dem Daten projektübergreifend erfasst werden.

So erstellen Sie eine Senke für ein einzelnes Projekt:

  1. Rufen Sie in der Google Cloud Console die Seite Log-Explorer auf.

    Zum Log-Explorer

    Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis aus, dessen Zwischenüberschrift Logging ist.

  2. Wählen Sie ein Google Cloud Projekt aus.

  3. Geben Sie auf dem Tab Query Builder die folgende Abfrage ein:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Ändern Sie den Verlaufsfilter von Letzte Stunde in Letzte 7 Tage. Image

  5. Klicken Sie auf Abfrage ausführen.

  6. Nachdem Sie geprüft haben, ob die Ergebnisse korrekt angezeigt werden, klicken Sie auf Aktionen > Senke erstellen.

  7. Führen Sie im Dialogfeld Senkendetails die folgenden Schritte aus:

    1. Geben Sie im Feld Name der Senke () image_pull_logs ein.
    2. Geben Sie im Feld Senkenbeschreibung eine Beschreibung der Senke ein.
  8. Klicken Sie auf Weiter.

  9. Wählen Sie im Dialogfeld Senkenziel die folgenden Werte aus:

    1. Wählen Sie im Feld Select Sink service (Senkendienst auswählen) die Option BigQuery dataset aus.
    2. Wählen Sie im Feld BigQuery-Dataset auswählen die Option Neues BigQuery-Dataset erstellen aus und füllen Sie die erforderlichen Informationen im angezeigten Dialogfeld aus. Weitere Informationen zum Erstellen eines BigQuery-Datasets finden Sie unter Datasets erstellen.
    3. Klicken Sie auf Dataset erstellen.
  10. Klicken Sie auf Weiter.

    Im Bereich Logs auswählen, die in der Senke enthalten sein sollen entspricht die Abfrage der Abfrage, die Sie auf dem Tab Query Builder ausgeführt haben.

  11. Klicken Sie auf Weiter.

  12. Optional: Wählen Sie Logs aus, die aus der Senke herausgefiltert werden sollen. Weitere Informationen zum Abfragen und Filtern von Cloud Logging-Daten finden Sie unter Logging-Abfragesprache.

  13. Klicken Sie auf Senke erstellen.

    Die Logsenke wird erstellt.

So erstellen Sie eine Senke für mehrere Projekte:

  1. Öffnen Sie Cloud Shell.

  2. Führen Sie die folgenden Befehle in Cloud Shell aus:

    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
    

    Dabei gilt:

    • PROJECT-LIST ist eine Liste von Google Cloud Projekt-IDs, die durch Leerzeichen getrennt sind. Beispiel: project1 project2 project3.
    • DATASET-PROJECT ist das Projekt, in dem Sie das Dataset speichern möchten.
    • DATASET-NAME ist der Name des Datasets, z. B. image_pull_logs.

Nachdem Sie eine Senke erstellt haben, dauert es eine gewisse Zeit, bis Daten an BigQuery-Tabellen übertragen werden. Dies hängt auch davon ab, wie häufig Images abgerufen werden.

Abfrage von Abrufhäufigkeit

Sobald Ihnen ein repräsentatives Stichprobe für das Abrufen von Images durch Ihre Builds zur Verfügung steht, führen Sie eine Abfrage für die Abrufhäufigkeit aus.

  1. Wechseln Sie zur BigQuery-Konsole.

  2. Führen Sie die folgende Abfrage aus:

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

    Dabei gilt:

    • DATASET-PROJECT ist das Projekt, das Ihr Dataset enthält.
    • DATASET-NAME ist der Name des Datasets.
Das folgende Beispiel zeigt die Ausgabe der Abfrage. In der Spalte imageName können Sie prüfen, wie häufig Images abgerufen werden, die nicht in Artifact Registry oder Container Registry gespeichert sind.

Image

Images nach Artifact Registry kopieren

Nachdem Sie Images von Drittanbieter-Registrys ermittelt haben, können Sie diese nach Artifact Registry kopieren. Das gcrane-Tool bietet eine Unterstützung für den Kopiervorgang.

  1. Erstellen Sie eine Textdatei images.txt mit den Namen der ermittelten Images. Beispiel:

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

      GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
    
  3. Erstellen Sie ein Skript mit dem Namen copy_images.sh, um die Liste Ihrer Dateien zu kopieren.

    #!/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
    

    Ersetzen Sie LOCATION durch den regionalen oder multiregionalen Speicherort des Repositorys.

    Machen Sie das Skript ausführbar:

      chmod +x copy_images.sh
    
  4. Führen Sie das Skript aus, um die Dateien zu kopieren:

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Berechtigungen prüfen

Prüfen Sie vor dem Aktualisieren und nochmaligen Bereitstellen Ihrer Arbeitslasten, ob die Berechtigungen korrekt konfiguriert sind.

Weitere Informationen finden Sie in der Dokumentation zur Zugriffssteuerung.

Manifeste zum Verweis auf Artifact Registry aktualisieren

Aktualisieren Sie die Dockerfiles und Manifeste, damit sie nicht auf die Registry von Drittanbietern, sondern auf Artifact Registry verweisen.

Das folgende Beispiel zeigt ein Manifest, das auf die Registry eines Drittanbieters verweist:

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

Die aktualisierte Version dieses Manifests verweist auf ein Image in 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

Für eine große Anzahl an Manifesten verwenden Sie sed oder ein anderes Tool, mit dem sich die Aktualisierung vieler Textdateien verarbeiten lässt.

Arbeitslasten noch einmal bereitstellen

Stellen Sie Arbeitslasten mit aktualisierten Manifesten noch einmal bereit.

Führen Sie die folgende Abfrage in der BigQuery-Konsole aus, um den Überblick über neue Imageabrufe zu behalten:

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

Das Abrufen neuer Images sollte immer aus Artifact Registry erfolgen und den String docker.pkg.dev enthalten.