Artifact Registry no supervisa los registros de terceros para las actualizaciones de las imágenes que copias en Artifact Registry. Si deseas incorporar una versión más reciente de una imagen en tu canalización, debes enviarla a Artifact Registry.
Descripción general de la migración
La migración de tus imágenes de contenedor incluye los siguientes pasos:
- Configura los requisitos.
- Identifica las imágenes que se migrarán.
- Busca tus archivos de Dockerfile y manifiestos de implementación para obtener referencias de registros de terceros
- Determina la frecuencia de extracción de las imágenes de los registros de terceros mediante Cloud Logging y BigQuery.
- Copia imágenes identificadas en Artifact Registry
- Verifica que los permisos del registro estén configurados correctamente, en especial si Artifact Registry y tu Google Cloud entorno de implementación están en proyectos diferentes.
- Actualiza los manifiestos de tus implementaciones.
- Vuelve a implementar tus cargas de trabajo.
Antes de comenzar
- Accede a tu Google Cloud cuenta de. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crea un proyecto: Para crear un proyecto, necesitas el rol de creador de proyectos
(
roles/resourcemanager.projectCreator), que contiene elresourcemanager.projects.createpermiso. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto de la siguiente manera:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el Google Cloud proyecto de que estás creando. -
Selecciona el Google Cloud proyecto de que creaste de la siguiente manera:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu Google Cloud proyecto de.
-
Verifica que la facturación esté habilitada para tu Google Cloud proyecto.
Habilita la API de Artifact Registry:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable artifactregistry.googleapis.com
-
Instala Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Crea o selecciona un Google Cloud proyecto.
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crea un proyecto: Para crear un proyecto, necesitas el rol de creador de proyectos
(
roles/resourcemanager.projectCreator), que contiene elresourcemanager.projects.createpermiso. Obtén más información para otorgar roles.
-
Crea un Google Cloud proyecto de la siguiente manera:
gcloud projects create PROJECT_ID
Reemplaza
PROJECT_IDpor un nombre para el Google Cloud proyecto de que estás creando. -
Selecciona el Google Cloud proyecto de que creaste de la siguiente manera:
gcloud config set project PROJECT_ID
Reemplaza
PROJECT_IDpor el nombre de tu Google Cloud proyecto de.
-
Verifica que la facturación esté habilitada para tu Google Cloud proyecto.
Habilita la API de Artifact Registry:
Roles necesarios para habilitar las APIs
Para habilitar las APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.gcloud services enable artifactregistry.googleapis.com
- Si no tienes un repositorio de Artifact Registry, entonces crea un repositorio y configura la autenticación para clientes de terceros que requieran acceso al repositorio.
- Verifica tus permisos. Debes tener el rol de IAM de propietario o editor en los proyectos en los que migras imágenes a Artifact Registry.
- Exporta las siguientes variables de entorno:
export PROJECT=$(gcloud config get-value project)
- Verifica que esté instalada la versión 1.13 de Go o una más reciente.
Si necesitas instalar o actualizar Go, consulta la documentación de instalación de Go.go version
Costos
En este instructivo, se usan los siguientes componentes facturables de Google Cloud:
Identifica las imágenes que se migrarán.
Busca los archivos que usas para compilar e implementa imágenes de contenedor a fin de hacer referencia a registros de terceros y, luego, verifica la frecuencia con la que extraes las imágenes.
Identifica referencias en Dockerfiles
Realiza este paso en una ubicación en la que se almacenen tus Dockerfiles. Esta ubicación puede ser donde tu código se verifica de forma local o en Cloud Shell si los archivos están disponibles en una VM.En el directorio con tus Dockerfiles, ejecuta el siguiente comando:
grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
El resultado se ve como en el siguiente ejemplo:
./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
Este comando busca en todos los Dockerfiles de tu directorio y, luego, identifica la línea "FROM". Ajusta el comando según sea necesario para que coincida con tu forma de almacenar los Dockerfiles.
Identifica referencias en manifiestos
Realiza estos pasos en una ubicación en la que se almacenen tus manifiestos de GKE o Cloud Run. Esta ubicación puede ser donde tu código se verifica de forma local o en Cloud Shell si los archivos están disponibles en una VM.- En el directorio con tus manifiestos de GKE o Cloud Run
ejecuta el siguiente comando:
El resultado se parece al que se indica a continuación:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
Este comando analiza todos los archivos YAML en tu directorio y, luego, identifica la línea image:. Ajusta el comando según sea necesario para trabajar con la manera en que se almacenan los manifiestos../code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc ./code/deploy/k8s/master.yaml:26: image: kubernetes/redis:v1 - Para enumerar las imágenes que se ejecutan en un clúster, ejecuta el siguiente comando:
Este comando muestra todos los objetos que se ejecutan en el clúster de Kubernetes seleccionado y obtiene los nombres de las imágenes. El resultado se parece al que se indica a continuación: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
Ejecuta los comandos anteriores para todos los clústeres de GKE en todos los Google Cloud proyectos para obtener una cobertura total.
Identifica la frecuencia de extracción de un registro de terceros
En los proyectos que extraen registros de terceros, usa información sobre la frecuencia de extracción de imágenes para determinar si el uso se encuentra cerca o por encima de los límites de frecuencia que aplica el registro de terceros.
Recopila datos de registro
Crea un receptor de registros para exportar datos a BigQuery. Un receptor de registros posee un destino y una consulta que selecciona las entradas de registro que se exportarán. Puedes crear un receptor mediante la consulta de proyectos individuales o puedes usar una secuencia de comandos para recopilar datos entre proyectos.
A fin de crear un receptor para un solo proyecto, sigue estos pasos:
-
En la Google Cloud consola de, ve a la Explorador de registros:
Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Logging.
Elige un Google Cloud proyecto de.
En la pestaña Compilador de consultas, ingresa la siguiente consulta:
resource.type="k8s_pod" jsonPayload.reason="Pulling"Filtro de historial de cambios de Last 1 hour hasta Últimos 7 días

Haz clic en Ejecutar consulta.
Después de verificar que los resultados se muestren correctamente, haz clic en Acciones > Crear receptor.
En el diálogo Detalles del receptor, completa lo siguiente:
- En el campo Nombre del receptor, ingresa
image_pull_logs. - En la Descripción del receptor, ingresa una descripción del receptor.
- En el campo Nombre del receptor, ingresa
Haz clic en Siguiente.
En el diálogo Destino del receptor, selecciona los siguientes valores:
- En el campo Selecciona el servicio del receptor, selecciona Conjunto de datos de BigQuery.
- En el campo Selecciona un conjunto de datos de BigQuery, selecciona Crea un conjunto de datos de BigQuery nuevo y completa la información requerida en el diálogo que se abre. Para obtener más información sobre cómo crear un conjunto de datos de BigQuery, consulta Crea conjuntos de datos.
- Haz clic en Crear conjunto de datos.
Haz clic en Siguiente.
En la sección Elige los registros que se incluirán en el receptor, la consulta coincide con la que ejecutaste en la pestaña Compilador de consultas.
Haz clic en Siguiente.
Opcional: Elige los registros para filtrar fuera del receptor. Para obtener más información sobre cómo consultar y filtrar datos de Cloud Logging, consulta Lenguaje de consultas de Logging.
Haz clic en Crear receptor.
Se crea tu receptor de registros.
A fin de crear un receptor para varios proyectos, haz lo siguiente:
Ejecute los siguientes comandos en 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"' donedonde
- PROJECT-LIST es una lista de Google Cloud IDs de proyectos,
separados por espacios. Por ejemplo,
project1 project2 project3. - DATASET-PROJECT es el proyecto en el que deseas almacenar tu conjunto de datos.
- DATASET-NAME es el nombre del conjunto de datos, por ejemplo
image_pull_logs.
- PROJECT-LIST es una lista de Google Cloud IDs de proyectos,
separados por espacios. Por ejemplo,
Después de crear un receptor, los datos tardan en fluir hacia las tablas de BigQuery, según la frecuencia con la que se extraen las imágenes.
Consulta la frecuencia de extracción
Una vez que tengas una muestra representativa de las extracciones de imágenes que realizan tus compilaciones, ejecuta una consulta para conocer la frecuencia de extracción.
Ejecute la siguiente consulta:
SELECT REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName, COUNT(*) AS numberOfPulls FROM `DATASET-PROJECT.DATASET-NAME.events_*` GROUP BY imageName ORDER BY numberOfPulls DESCdonde
- DATASET-PROJECT es el proyecto que contiene tu conjunto de datos.
- DATASET-NAME es el nombre del conjunto de datos.
Copia imágenes en Artifact Registry
Una vez que identificaste imágenes de registros de terceros, estás listo para copiarlas en Artifact Registry. La herramienta gcrane te ayuda con el proceso de copiado.
Crea un archivo de texto
images.txtcon los nombres de las imágenes que identificaste. Por ejemplo:ubuntu:18.04 debian:buster hello-world:latest redis:buster jupyter/tensorflow-notebookDescarga gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcraneCrea una secuencia de comandos llamada
copy_images.shpara copiar tu lista de archivos.#!/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} doneReemplaza
LOCATIONpor la ubicación regional o multirregional del repositorio.Haz que la secuencia de comandos sea ejecutable:
chmod +x copy_images.shEjecuta la secuencia de comandos para copiar los archivos:
AR_PROJECT=${PROJECT} ./copy_images.sh
Verifica los permisos
Asegúrate de que los permisos estén configurados correctamente antes de actualizar y volver a implementar tus cargas de trabajo.
Para obtener más información, consulta la documentación sobre el control de acceso.
Actualiza los manifiestos para que hagan referencia a Artifact Registry
Actualiza tus Dockerfiles y tus manifiestos para que hagan referencia a Artifact Registry, en lugar de al registro de terceros.
En el siguiente ejemplo, se muestra un manifiesto que hace referencia a un registro de terceros:
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
Esta versión actualizada del manifiesto apunta a una imagen en
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
Para una gran cantidad de manifiestos, usa sed o cualquier otra herramienta que pueda controlar las actualizaciones en muchos archivos de texto.
Vuelve a implementar las cargas de trabajo
Vuelve a implementar las cargas de trabajo con tus manifiestos actualizados.
Haz un seguimiento de las nuevas extracciones de imágenes ejecutando la siguiente consulta en la consola de 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
Todas las extracciones de imágenes nuevas deben ser de Artifact Registry y contener la string docker.pkg.dev.