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:
- Richten Sie Voraussetzungen ein.
- 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.
- Kopieren Sie ermittelte Images nach Artifact Registry.
- Prüfen Sie, ob die Berechtigungen für die Registry korrekt konfiguriert sind, insbesondere wenn sich Artifact Registry und Ihre Cloud de Confiance by S3NS Bereitstellungsumgebung in unterschiedlichen Projekten befinden.
- Aktualisieren Sie Manifeste für Ihre Bereitstellungen.
- Stellen Sie Ihre Arbeitslasten neu bereit.
Hinweis
-
Installieren Sie die Google Cloud CLI.
-
Konfigurieren Sie die gcloud CLI für die Verwendung Ihrer föderierten Identität.
Weitere Informationen finden Sie unter Mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init -
Erstellen oder wählen Sie ein Cloud de Confiance Projekt aus.
Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts
- Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können ein beliebiges Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
-
Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“
(
roles/resourcemanager.projectCreator), die dieresourcemanager.projects.createBerechtigung enthält. Rollen zuweisen.
-
Projekt erstellen: Cloud de Confiance
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch einen Namen für das Cloud de Confiance Projekt, das Sie erstellen. -
Wählen Sie das erstellte Cloud de Confiance Projekt aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_IDdurch den Namen Ihres Cloud de Confiance Projekts.
-
Prüfen Sie, ob die Abrechnung für Ihr Cloud de Confiance Projekt aktiviert ist.
Aktivieren Sie die Artifact Registry API:
Erforderliche Rollen zum Aktivieren von APIs
Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (
roles/serviceusage.serviceUsageAdmin), die die Berechtigungserviceusage.services.enableenthält. Rollen zuweisen.gcloud services enable artifactregistry.googleapis.com
- Wenn Sie kein Artifact Registry-Repository haben, dann erstellen Sie ein Repository und konfigurieren Sie die Authentifizierung für externe Clients, die Zugriff auf das Repository benötigen.
- Prüfen Sie Ihre Berechtigungen. Sie benötigen die IAM-Rolle „Inhaber“ oder „Bearbeiter“ für die Projekte, in denen Sie Images zu Artifact Registry migrieren.
- Exportieren Sie die folgenden Umgebungsvariablen:
export PROJECT=$(gcloud config get-value project)
- Prüfen Sie, ob Go Version 1.13 oder höher installiert ist.
Wenn Sie Go installieren oder aktualisieren müssen, lesen Sie die Go Installationsdokumentation.go version
Kosten
In diesem Leitfaden werden die folgenden kostenpflichtigen Komponenten von Cloud de Confianceverwendet:
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.Führen Sie im Verzeichnis mit Ihren Dockerfiles den folgenden Befehl aus:
grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.s3nsregistry.fr'
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-Manifeste gespeichert sind. Dies kann dort sein, wo Ihr Code lokal geprüft wird.- Führen Sie den folgenden Befehl im Verzeichnis mit Ihren GKE-Manifesten aus:
Die Ausgabe sollte so aussehen:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.s3nsregistry.fr'
Dieser Befehl prüft alle YAML-Dateien in Ihrem Verzeichnis und identifiziert die Zeile image:. Passen Sie den Befehl so an, dass er mit der Art des Speicherns der Manifeste funktioniert../code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31 - Führen Sie den folgenden Befehl aus, um die auf einem Cluster ausgeführten Images aufzulisten:
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:kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.s3nsregistry.fr'
- image: nginx image: nginx:latest - image: nginx - image: nginx
Führen Sie die vorherigen Befehle für alle GKE-Cluster in allen Cloud de Confiance Projekten aus, um eine vollständige Abdeckung zu erhalten.
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:
-
Rufen Sie in der Cloud de Confiance Console das Segment und die Seite Log-Explorer auf:
Wenn Sie diese Seite über die Suchleiste suchen, wählen Sie das Ergebnis mit der Zwischenüberschrift Logging aus.
Wählen Sie ein Cloud de Confiance Projekt aus.
Geben Sie auf dem Tab Query Builder die folgende Abfrage ein:
resource.type="k8s_pod" jsonPayload.reason="Pulling"Ändern Sie den Verlaufsfilter von Letzte Stunde in Letzte 7 Tage.
Klicken Sie auf Abfrage ausführen.
Nachdem Sie geprüft haben, ob die Ergebnisse korrekt angezeigt werden, klicken Sie auf Aktionen > Senke erstellen.
Geben Sie im Dialogfeld Senkendetails Folgendes ein:
- Geben Sie im Feld Name der Senke
image_pull_logsein. - Geben Sie unter Senkenbeschreibung eine Beschreibung der Senke ein.
- Geben Sie im Feld Name der Senke
Klicken Sie auf Weiter.
Wählen Sie im Dialogfeld Senkenziel die folgenden Werte aus:
- Wählen Sie im Feld Senkendienst auswählen die Option BigQuery-Dataset aus.
- Wählen Sie im Feld BigQuery-Dataset auswählen die Option Neues BigQuery-Dataset erstellen aus und geben Sie die erforderlichen Informationen im daraufhin geöffneten Dialogfeld ein. Weitere Informationen zum Erstellen eines BigQuery-Datasets finden Sie unter Datasets erstellen.
- Klicken Sie auf Dataset erstellen.
Klicken Sie auf Weiter.
Im Abschnitt Logs auswählen, die in die Senke aufgenommen werden sollen entspricht die Abfrage der Abfrage, die Sie auf dem Tab Query Builder ausgeführt haben.
Klicken Sie auf Weiter.
Optional: Wählen Sie Logs aus, die aus der Senke gefiltert werden sollen. Weitere Informationen zum Abfragen und Filtern von Cloud Logging-Daten finden Sie unter Logging-Abfragesprache.
Klicken Sie auf Senke erstellen.
Die Logsenke wird erstellt.
So erstellen Sie eine Senke für mehrere Projekte:
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"' doneDabei gilt:
- PROJECT-LIST ist eine Liste von Cloud de Confiance 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.
- PROJECT-LIST ist eine Liste von Cloud de Confiance Projekt-IDs,
die durch Leerzeichen getrennt sind. Beispiel:
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.
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 DESCDabei gilt:
- DATASET-PROJECT ist das Projekt, das Ihr Dataset enthält.
- DATASET-NAME ist der Name des Datasets.
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.
Erstellen Sie eine Textdatei
images.txtmit den Namen der ermittelten Images. Beispiel:ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebookLaden Sie gcrane herunter.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcraneErstellen 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.s3nsregistry.fr/${AR_PROJECT}/${img} doneErsetzen Sie
LOCATIONdurch den regionalen Standort des Repositorys.Machen Sie das Skript ausführbar:
chmod +x copy_images.shFühren Sie das Skript aus, um die Dateien zu kopieren:
AR_PROJECT=${PROJECT} ./copy_images.sh
Berechtigungen prüfen
Prüfen Sie, ob die Berechtigungen korrekt konfiguriert sind, bevor Sie Ihre Arbeitslasten aktualisieren und neu bereitstellen.
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.s3nsregistry.fr.
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.s3nsregistry.fr/<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.s3nsregistry.fr enthalten.