Usa un registro de imágenes privado sin Secrets

GKE en AWS proporciona una forma de extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un Secret de Kubernetes. Antes, tenías que realizar los siguientes pasos:

  1. Crear una cuenta de servicio de Identity and Access Management (IAM) de Google.
  2. Otorgar permisos a la cuenta de servicio para acceder al registro privado.
  3. Descargar la clave de la cuenta de servicio y guardarla como un Secret de Kubernetes en tu clúster.
  4. Hacer referencia a este Secret en tu manifiesto YAML para los Pods o Deployments con el objetivo de que puedan acceder a las imágenes del repositorio de contenedores privado.
  5. Rotar y administrar con regularidad las claves asociadas con la cuenta de servicio de Google IAM.

GKE en AWS elimina todos estos pasos manuales y controla automáticamente la autenticación y la autorización necesarias para extraer imágenes privadas.

Antes de comenzar

Para realizar los pasos de esta página, primero completa lo siguiente:

Verifica las imágenes en Artifact Registry

Para completar el resto de estos pasos, necesitas una imagen de contenedor. Sigue estos pasos para obtener el nombre de las imágenes de contenedor:

  1. Configura la herramienta de línea de comandos de Docker para autenticarte en Artifact Registry con el SDK de Google Cloud:

    gcloud auth configure-docker
    

    Google Cloud CLI registra un auxiliar de credenciales para todos los registros de Docker compatibles con Google.

  2. Confirma que Artifact Registry incluye una imagen con el comando docker images:

    docker images
    

    Docker se conecta a Artifact Registry y muestra las imágenes disponibles en el repositorio. Por ejemplo, en la siguiente respuesta, se muestra una imagen de contenedor llamada hello-app en el repositorio PROJECT_NAME en us-west1-docker.pkg.dev.

    REPOSITORY                                                            TAG          IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app   v1           f7cfe0d58569   21 minutes ago   11.5MB
    

Si no tienes una imagen de contenedor lista, crea una con los pasos que se describen en Implementa una aplicación alojada en contenedores.

Crea Pods con imágenes privadas sin Secretos de extracción de imagen

Para crear un Pod que pueda acceder a una imagen de contenedor privado desde un registro, ya no necesitas proporcionar el campo spec.imagePullSecrets en la especificación del Pod. Para configurar tu Pod, sigue estos pasos:

  1. Crea una definición de Pod sin el campo spec.imagePullSecrets:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Reemplaza lo siguiente:

    • POD_NAME: el nombre del Pod.
    • CONTAINER_NAME: el nombre del contenedor dentro del Pod.
    • LOCATION: la región de Google Cloud que contiene tu registro. Por ejemplo, us-west1.
    • PROJECT_NAME: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no está en el mismo proyecto que tu clúster para obtener pasos adicionales.
    • REPOSITORY_NAME: el nombre de tu repositorio.
    • IMAGE_NAME: el nombre de la imagen.
    • IMAGE_VERSION: la versión de la imagen.
  2. Aplica la configuración a tu clúster con kubectl:

    kubectl apply -f YAML_FILE_NAME
    

    Reemplaza YAML_FILE_NAME por el nombre de tu archivo YAML.

Ejemplo de creación de Pods sin Secrets de extracción de imagen

A continuación, se muestra un ejemplo de cómo crear un Pod de Kubernetes sin la necesidad de usar Secrets de extracción de imagen. El Pod extrae la imagen hello-app de Artifact Registry.

  1. Para extraer la imagen hello-app, copia el siguiente YAML en un archivo llamado hello-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1
    
  2. Aplica la configuración a tu clúster con kubectl:

    kubectl apply -f hello-pod.yaml
    
  3. Confirma que el Pod esté en ejecución con kubectl get:

    kubectl get pod/hello-pod
    

    La respuesta incluye un Pod con el estado Running

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

Crea Deployments con imágenes privadas sin Secretos de extracción de imagen

Para crear un Deployment que pueda acceder a una imagen de contenedor privado desde un registro, ya no necesitas proporcionar el campo spec.imagePullSecrets en la especificación de Deployment. Para configurar el Deployment, sigue estos pasos:

  1. Crea una definición de Deployment sin el campo spec.imagePullSecrets:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: DEPLOYMENT_NAME
    spec:
      replicas: NUMBER_OF_REPLICAS
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Reemplaza lo siguiente:

    • DEPLOYMENT_NAME: el nombre de tu Deployment.
    • NUMBER_OF_REPLICAS: la cantidad de instancias del Pod definidas en el Deployment que se deben ejecutar en un momento determinado.
    • CONTAINER_NAME: el nombre del contenedor dentro del Pod.
    • LOCATION: la región de Google Cloud que contiene tu registro. Por ejemplo, us-west1.
    • PROJECT_NAME: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede no ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no está en el mismo proyecto que tu clúster para obtener pasos adicionales.
    • REPOSITORY_NAME: el nombre de tu repositorio.
    • IMAGE_NAME: el nombre de la imagen.
    • IMAGE_VERSION: la versión de la imagen.
  2. Aplica la configuración al clúster con kubectl:

    kubectl apply -f name-of-your-yaml-file.yaml
    

Ejemplo de creación de un Deployment sin Secrets de extracción de imagen

A continuación, se muestra un ejemplo de creación de un Deployment sin Secrets de extracción de imagen. El Deployment extrae una imagen hello-app de Artifact Registry.

  1. Crea un archivo llamado hello-deployment.yaml con el siguiente contenido:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app-deployment
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
            env:
            - name: "PORT"
              value: "50001"
    

    Reemplaza lo siguiente:

    • LOCATION: la región de Google Cloud que contiene tu registro. Por ejemplo, us-west1.
    • PROJECT_NAME: el nombre del proyecto de Google que aloja tu repositorio de Artifact Registry, que puede no ser el mismo que el proyecto de tu clúster. Si el repositorio está en un proyecto diferente, consulta Usa Artifact Registry cuando no esté en el mismo proyecto que tu clúster para obtener pasos adicionales.
  2. Aplica la configuración al clúster con kubectl:

    kubectl apply -f hello-deployment.yaml
    
  3. Confirma que el Deployment está en ejecución con kubectl pods.

    kubectl get pods --selector=app=products
    

    El resultado muestra tres Pods de Running.

    NAME                                    READY   STATUS    RESTARTS   AGE
    hello-app-deployment-67d9c6d98c-b69f2   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-d6k5c   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-p2md5   1/1     Running   0          14m
    

Usa Artifact Registry cuando no esté en el mismo proyecto que tu clúster

Para usar un repositorio de Artifact Registry que está en un proyecto de Google diferente del que contiene el clúster, sigue estos pasos:

Proporciona la cuenta de servicio para las instancias de máquina virtual del grupo de nodos del clúster, conocidas como Agente de servicio de máquina del grupo de nodos, los permisos necesarios para acceder a este registro.

gcloud projects add-iam-policy-binding AR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

Este paso garantiza que tu clúster pueda recuperar artefactos del registro en ese proyecto separado.

Reemplaza lo siguiente:

  • AR_PROJECT_ID: el ID del proyecto de Google que aloja Artifact Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: la cuenta de servicio del grupo de nodos del clúster, que tiene el siguiente formato: service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE: el rol roles/artifactregistry.reader o un rol personalizado que otorga permisos suficientes para acceder a las imágenes del repositorio de Artifact Registry.

Usa Google Container Registry privado

Para integrar un Google Container Registry privado a tu clúster de GKE en AWS, sin importar la ubicación del proyecto de Google, sigue estos pasos:

Permite que el agente de servicio de la máquina del grupo de nodos, la cuenta de servicio de las instancias de máquina virtual del grupo de nodos de tu clúster, acceda a Container Registry:

gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

En este paso, se permite que la cuenta de servicio del clúster acceda a las imágenes de contenedor privado.

Reemplaza lo siguiente:

  • GCR_PROJECT_ID: el ID del proyecto en el que se aloja Container Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: la cuenta de servicio del grupo de nodos, en el formato service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com.
  • ROLE: elige storage.objectViewer o un rol personalizado para obtener acceso suficiente a Container Registry. Ten cuidado cuando el acceso es amplio con storage.objectViewer.

Limpia

Para quitar los recursos que creaste en esta página, ejecuta estos comandos:

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Reemplaza lo siguiente:

  • POD_YAML_FILE: el nombre del archivo YAML en el que definiste el Pod.
  • DEPLOYMENT_YAML_FILE: el nombre del archivo YAML en el que definiste el Deployment.

¿Qué sigue?