Cambios para compilar e implementar en Google Cloud

En este documento, se explican las diferencias entre Container Registry y Artifact Registry cuando se compilan imágenes de contenedores con Cloud Build y se implementan en entornos de ejecución de Google Cloud, como Cloud Run o Google Kubernetes Engine.

En esta guía, las comparaciones se enfocan en Artifact Registry estándar repositorios, repositorios normales de Artifact Registry que son independientes de Container Registry y son compatibles con todas las funciones de Artifact Registry. Si tu administrador configuró repositorios con compatibilidad con dominios gcr.io, las solicitudes a nombres de host gcr.io se redireccionan automáticamente a un repositorio de Artifact Registry correspondiente, y las cuentas de servicio predeterminadas que tienen acceso a Container Registry tienen permisos predeterminados equivalentes para Artifact Registry.

Para conocer las diferencias entre Container Registry y Artifact Registry con un cliente de Docker, consulta Cambios en el envío y la extracción con Docker.

Usa esta información para adaptar tus comandos, configuraciones o sobre Container Registry con Cloud Build.

Antes de comenzar

En este documento, se supone que ya hiciste lo siguiente:

  1. Habilitaste Artifact Registry en tu proyecto.
  2. Habilitaste la API de Cloud Build y la API de cualquier otro servicio de Google Cloud que uses con Artifact Registry.

Cambios en el flujo de trabajo

Cuando usas Cloud Build con Container Registry dentro del mismo proyecto, el flujo de trabajo se ve así:

  1. Crear, etiquetar y enviar una imagen al repositorio con Cloud Build con Dockerfile o un archivo de configuración de compilación

    En el siguiente ejemplo, se compila la imagen my-image, la etiqueta con tag1 y lo envía al host gcr.io en el proyecto my-project:

    gcloud builds submit --tag gcr.io/my-project/my-image:tag1
    
  2. entornos de ejecución de Google Cloud, como Cloud Run Google Kubernetes Engine extrae imágenes del registro.

    Por ejemplo, este comando implementa la imagen del paso anterior para Cloud Run como my-service.

    gcloud run deploy my-service --image gcr.io/my-project/my-image:tag1
    

El flujo de trabajo de Container Registry combina las responsabilidades del administrador con en la creación y la implementación.

  • Cuando habilitas algunas APIs de Google Cloud, la API de Container Registry se habilita automáticamente. Esto significa que los usuarios de estos servicios tienen acceso implícito a Container Registry en el mismo proyecto. Por ejemplo, los usuarios que pueden ejecutar compilaciones en Cloud Build pueden enviar imágenes a registros y agregar hosts de registro de forma predeterminada.
  • La cuenta de servicio de Cloud Build tiene permisos para crear buckets de almacenamiento de Cloud Storage. Esto significa que el puede agregar automáticamente hosts de Container Registry a un proyecto la primera cada vez que envía una imagen al host. También significa que la cuenta puede crear, leer y escribir en buckets de almacenamiento en todo el proyecto, incluidos los buckets que no usa Container Registry.

En Artifact Registry, hay una clara separación de los roles de administrador y de compilación que cambia los pasos del flujo de trabajo de compilación e implementación. Para adaptar el flujo de trabajo de Container Registry para Artifact Registry, realiza los siguientes cambios. Cada paso se vincula a información adicional sobre cómo modificar el flujo de trabajo.

  1. Nuevo: Habilita la API de Artifact Registry.

    Debes habilitar la API de Artifact Registry. Cloud Build y los entornos de ejecución, como Cloud Run y GKE, no habilitan automáticamente la API por ti.

  2. Nuevo: Crea el repositorio de Docker de destino si no lo tiene. ya existen. Debes crear un repositorio para poder enviarle imágenes. El envío de una imagen no activa la creación de un repositorio y la cuenta de servicio de Cloud Build no tiene permisos para crear repositorios.

  3. Modificado: Compila, etiqueta y envía una imagen al repositorio. con Cloud Build mediante Dockerfile o un archivo de configuración de compilación.

    El siguiente comando de ejemplo es el mismo que el de Container Registry, pero usa una ruta de acceso del repositorio de Artifact Registry para la imagen.

    gcloud builds submit --tag us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
    
  4. Cambió: Implementa la imagen en un entorno de tiempo de ejecución de Google Cloud, como Cloud Run o GKE.

    El siguiente comando de ejemplo es el mismo que el ejemplo de Container Registry, pero usa la ruta de acceso del repositorio de Artifact Registry para la imagen.

    gcloud run deploy my-service --image us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1
    

Además, Artifact Registry usa roles diferentes de los de Container Registry para controlar el acceso a las imágenes. Debes configurar los permisos en las siguientes situaciones:

  • Los entornos de ejecución de Cloud Build o Google Cloud están en proyecto diferente al de Artifact Registry.
  • Usas cuentas de servicio personalizadas para servicios de Google Cloud, como Cloud Build o GKE en lugar del servicio predeterminado cuentas de servicio.
  • Otorgaste permisos a otros usuarios o cuentas de servicio.

Habilitar la API

Puntos clave:

En la siguiente comparación, se describe cómo habilitar la API para cada servicio:

Container Registry

Cuando habilitas las siguientes APIs de Google Cloud, la API de Container Registry también se habilita automáticamente:

  • Entorno flexible de App Engine
  • Cloud Build
  • Funciones de Cloud Run
  • Cloud Run
  • Análisis de contenedores o a pedido en Artifact Analysis
  • Google Kubernetes Engine

Con los permisos predeterminados, los usuarios que pueden ejecutar compilaciones en Cloud Build, scanear contenedores con Artifact Analysis o implementar contenedores en entornos de ejecución de Google Cloud tienen acceso implícito a las imágenes en Container Registry cuando el registro está en el mismo proyecto.

Artifact Registry

Debes habilitar la API de Artifact Registry. Servicios como Cloud Build, Cloud Run y GKE no habilitan automáticamente la API de Artifact Registry.

Puedes habilitar varias APIs en el mismo proyecto con gcloud. Por ejemplo, para habilitar la API de Cloud Build y la En la API de Artifact Registry, ejecuta el siguiente comando:

gcloud services enable
    artifactregistry.googleapis.com \
    cloudbuild.googleapis.com

Cómo agregar registros y repositorios

Puntos clave:

  • Debes crear un repositorio de Docker de Artifact Registry antes de enviarle una imagen.
  • Container Registry almacena todas las imágenes en una única multirregión en la misma bucket de almacenamiento. En Artifact Registry, puedes crear varios repositorios en la misma región o en varias regiones con políticas de acceso independientes.

En la siguiente comparación, se describe la configuración del repositorio en cada servicio:

Container Registry

En Container Registry, puedes agregar hasta cuatro hosts de registro a tu proyecto. Para agregar un host de registro, envía la primera imagen.

  1. Para agregar un registro como gcr.io a tu proyecto, debes tener una cuenta con el El rol Administrador de almacenamiento a nivel del proyecto envía una imagen inicial.

    Por ejemplo, si el host gcr.io no existe en el proyecto my-project, cuando se envía la imagen gcr.io/my-project/my-image:1.0, se activa sigue estos pasos:

    1. Agrega el host gcr.io al proyecto
    2. Crea un bucket de almacenamiento para gcr.io en el proyecto.
    3. Almacena la imagen como gcr.io/my-project/my-image:1.0
  2. Después de esta publicación inicial, puedes otorgar permisos al bucket de almacenamiento para otros usuarios.

De forma predeterminada, Cloud Build tiene los permisos permisos para crear un bucket de almacenamiento, de modo que el envío inicial de la imagen no se pueden distinguir.

Dentro de un proyecto, un host de registro almacena todas las imágenes en el mismo almacenamiento bucket. En el siguiente ejemplo, el proyecto my-project tiene dos imágenes llamadas web-app en el registro gcr.io. Uno está directamente debajo del ID del proyecto. my-project La otra imagen está en el repositorio team1.

gcr.io/my-project/web-app
gcr.io/my-project/team1/web-app

Artifact Registry

Cloud Build no tiene permisos para crear un repositorio estándar en el dominio pkg.dev de Artifact Registry.

Una cuenta con el repositorio de Artifact Registry El rol de administrador debe crear la en un repositorio específico antes de enviarle imágenes. Luego, puedes otorgar permisos al repositorio para otros usuarios

En Artifact Registry, cada repositorio es un recurso independiente. Por lo tanto, Todas las rutas de acceso a imágenes deben incluir un repositorio.

Rutas de acceso de imágenes válidas:

us-central1-docker.pkg.dev/my-project/team1/web-app:1.0
us-central1-docker.pkg.dev/my-project/team2/web-app:1.0

Ruta de imagen no válida (no incluye un repositorio):

us-central1-docker.pkg.dev/my-project/web-app:1.0

En los siguientes ejemplos, se muestran situaciones en las que falla el envío de una imagen a un repositorio que no está disponible.

  • Envía una imagen a us-central1-docker.pkg.dev/my-project/team1 si us-central1-docker.pkg.dev/my-project/team1 no existe.
  • Envía una imagen a us-central1-docker.pkg.dev/my-project/team2 cuando existe us-central1-docker.pkg.dev/my-project/team1, pero no existe us-central1-docker.pkg.dev/my-project/team2.

Otorgando permisos

Puntos clave:

  • Los servicios de Google Cloud tienen acceso de lectura o escritura equivalente a ambos Container Registry y Artifact Registry. Sin embargo, la configuración predeterminada La cuenta de servicio de Cloud Build no puede crear repositorios estándar en el dominio pkg.dev.
  • Otorga los roles adecuados de Artifact Registry a otras cuentas que accedan a Artifact Registry.
  • Container Registry admite el control de acceso a nivel del bucket de almacenamiento. Artifact Registry admite el control de acceso a nivel del repositorio.

En la siguiente comparación, se describen los permisos de cada servicio:

Container Registry

Container Registry usa los roles de Cloud Storage para controlar el acceso. Cloud Build tiene los permisos necesarios para agregar hosts de Container Registry a un proyecto.

Visualizador de objetos de Storage a nivel del bucket de almacenamiento
Extrae (lee) imágenes de los hosts de registro existentes en el proyecto.
Escritor de buckets heredados de almacenamiento a nivel del bucket de almacenamiento
Envía (escribe) y extrae (lee) imágenes para los hosts de registro existentes en el proyecto.
Administrador de almacenamiento a nivel de proyecto
Envía una imagen inicial al host para agregar un host de registro a un proyecto.

Luego del envío de la imagen inicial a un registro, otorgas roles de Cloud Storage a otras cuentas que requieran acceso al bucket de almacenamiento. Ten en cuenta que cualquier con todos los permisos del rol de administrador de almacenamiento puede leer, escribir borrar buckets de almacenamiento y objetos de almacenamiento de todo el proyecto.

Los permisos de un bucket de almacenamiento se aplican a todos los repositorios del registro. Por ejemplo, cualquier usuario con permisos de Visualizador de objetos de almacenamiento en el bucket de gcr.io/my-project puede leer imágenes en todos estos repositorios:

gcr.io/my-project/team1
gcr.io/my-project/team2
gcr.io/my-project/test
gcr.io/my-project/production

Artifact Registry

Artifact Registry tiene sus propios roles para controlar el acceso. Estos roles proporcionan una separación clara entre los roles de los usuarios del repositorio y los de administrador.

Cloud Build tiene permisos en el rol de escritor de Artifact Registry, ya que solo necesita y extraer imágenes con repositorios estándar en el dominio pkg.dev.

Solo las cuentas que administran repositorios deben tener el rol de Administrador del repositorio de Artifact Registry o de Administrador de Artifact Registry.

Lector de Artifact Registry
Enumera artefactos y repositorios. Descarga los artefactos.
Escritor de Artifact Registry
Enumera los artefactos y los repositorios. Descarga artefactos, sube versiones de artefactos nuevas y agrega o actualiza etiquetas.
Administrador del repositorio de Artifact Registry
Permisos de escritor de Artifact Registry y permisos para borrar artefactos y etiquetas.
Administrador de Artifact Registry
Permisos del administrador del repositorio de Artifact Registry y permisos para crear, actualizar, borrar y otorgar permisos a los repositorios.

Puedes aplicar estos permisos a nivel del repositorio. Por ejemplo:

  • Otorga acceso al equipo 1 para us-central1-docker.pkg.dev/my-project/team1
  • Otorgar acceso a us-central1-docker.pkg.dev/my-project/team2 al equipo 2

Para obtener detalles sobre cómo otorgar permisos de Artifact Registry, consulta la documentación sobre control de acceso.

Compila y envía imágenes

Puntos clave:

  • Debes crear un repositorio de Docker de Artifact Registry antes de enviarle una imagen.
  • Los nombres de host de Artifact Registry son diferentes de los nombres de host de Container Registry y los nombres de host.

Cloud Build puede compilar, etiquetar y enviar una imagen en un solo paso.

Con Container Registry, Cloud Build puede enviar correctamente una imagen a un host de registro que aún no existe en el proyecto de Google Cloud. Para este envío de imagen inicial, Cloud Build tiene permisos para agregar el host de registro al proyecto.

Para adaptar un flujo de trabajo de Container Registry, haz lo siguiente:

  1. Configura tus repositorios antes de enviarles imágenes.
  2. Actualiza las rutas de acceso a las imágenes en tu archivo de configuración de compilación, o en gcloud builds submit con comandos de SQL sencillos.

Compila con un archivo de configuración de compilación

Reemplaza las rutas de acceso de Container Registry para las imágenes que compilas con la ruta de acceso a un repositorio de Artifact Registry existente.

En el siguiente ejemplo de archivo cloudbuild.yaml, se compila la imagen us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1:

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [ 'build', '-t', 'us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1', '.' ]
images:
- 'us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1'

Luego, puedes compilar la imagen con el siguiente comando:

gcloud builds submit --config cloudbuild.yaml

Compila con un Dockerfile

Reemplaza las rutas de acceso de Container Registry para las imágenes que compilas con la ruta de acceso a un repositorio de Artifact Registry existente.

En el siguiente comando de ejemplo, se compila la imagen us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1 con un Dockerfile en el directorio actual:

gcloud builds submit --tag us-central1-docker.pkg.dev/my-project/my-repo/my-image:tag1

Implementa imágenes

Punto clave:

  • Los nombres de host de Artifact Registry son diferentes de los de Container Registry.

Para adaptar un flujo de trabajo de Container Registry, actualiza las rutas de acceso a imágenes en tu implementación configuración y comandos de implementación. En las siguientes secciones, se muestran ejemplos de Cloud Build, Cloud Run y GKE, pero el mismo enfoque se aplica a cualquier otro servicio de Google Cloud que implemente imágenes.

Cloud Build

Reemplaza las rutas de Container Registry para las imágenes que implementes con el a un repositorio existente de Artifact Registry.

En el siguiente ejemplo de archivo cloudbuild.yaml, se implementa la imagen de ejemplo us-docker.pkg.dev/cloudrun/container/hello.

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'run'
  - 'deploy'
  - 'cloudrunservice'
  - '--image'
  - 'us-docker.pkg.dev/cloudrun/container/hello'
  - '--region'
  - 'us-central1'
  - '--platform'
  - 'managed'
  - '--allow-unauthenticated'

Cloud Run

Reemplaza las rutas de acceso de Container Registry para las imágenes que implementes con la ruta de acceso a un repositorio de Artifact Registry existente.

Por ejemplo, este comando implementa la imagen de muestra us-docker.pkg.dev/cloudrun/container/hello

gcloud run deploy my-service --image us-docker.pkg.dev/cloudrun/container/hello

GKE

Reemplaza las rutas de Container Registry para las imágenes que compiles con el a un repositorio existente de Artifact Registry.

En los siguientes ejemplos de Artifact Registry, se usa la imagen de muestra us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0.

Crea un clúster desde la línea de comandos:

kubectl create deployment hello-server --image=us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0

Especifica una imagen en un manifiesto de implementación:

In a deployment manifest:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-app
  template:
    metadata:
      labels:
        run: my-app
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/artifact-registry-samples/containers/gke/hello-app:1.0