Usar un registro de imágenes privado sin secretos

GKE en AWS ofrece una forma de extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un secreto de Kubernetes. Antes, tenías que seguir estos pasos:

  1. Crea una cuenta de servicio de Gestión de Identidades y Accesos (IAM) de Google.
  2. Concede a la cuenta de servicio permisos para acceder al registro privado.
  3. Descarga la clave de la cuenta de servicio y guárdala como un secreto de Kubernetes en tu clúster.
  4. Haz referencia a este secreto en tu manifiesto YAML para pods o implementaciones para que puedan acceder a imágenes del repositorio de contenedores privado.
  5. Rota y gestiona periódicamente las claves asociadas a la cuenta de servicio de Google IAM.

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

Antes de empezar

Para seguir los pasos de esta página, primero debes hacer lo siguiente:

Buscar imágenes en Artifact Registry

Para completar el resto de estos pasos, necesitas una imagen de contenedor. Para obtener el nombre de tus imágenes de contenedor, sigue estos pasos:

  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
    

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

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

    docker images
    

    Docker se conecta a Artifact Registry y devuelve las imágenes disponibles en tu repositorio. Por ejemplo, la siguiente respuesta muestra una imagen de contenedor llamada hello-app en el repositorio PROJECT_NAME de 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 siguiendo los pasos que se indican en Implementar una aplicación contenerizada.

Crear pods con imágenes privadas sin secretos de extracción de imágenes

Para crear un pod que pueda acceder a una imagen de contenedor privada desde un registro, ya no es necesario que proporciones 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
    

    Haz los cambios siguientes:

    • POD_NAME: el nombre del pod.
    • CONTAINER_NAME: el nombre del contenedor dentro del pod.
    • LOCATION: la Google Cloud región 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 de tu clúster. Si el repositorio está en otro proyecto, consulta Usar Artifact Registry cuando no está en el mismo proyecto que el clúster para ver los 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 YAML_FILE_NAME
    

    Sustituye YAML_FILE_NAME por el nombre de tu archivo YAML.

Ejemplo de creación de pods sin secretos de extracción de imágenes

A continuación, se muestra un ejemplo de cómo crear un pod de Kubernetes sin necesidad de secretos de extracción de imágenes. El pod extrae la imagen hello-app de Artifact Registry.

  1. Para extraer la imagen hello-app, copia el siguiente código 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 al clúster con kubectl:

    kubectl apply -f hello-pod.yaml
    
  3. Confirma que el pod se está ejecutando 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
    

Crear implementaciones con imágenes privadas sin secretos de extracción de imágenes

Para crear una implementación que pueda acceder a una imagen de contenedor privada desde un registro, ya no es necesario que proporciones el campo spec.imagePullSecrets en la especificación de la implementación. Para configurar tu implementación, 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
    

    Haz los cambios siguientes:

    • DEPLOYMENT_NAME: el nombre de tu implementación.
    • NUMBER_OF_REPLICAS: número de instancias del pod definido en el Deployment que deben ejecutarse en un momento dado.
    • CONTAINER_NAME: el nombre del contenedor dentro del pod.
    • LOCATION: la región que contiene tu registro. Google Cloud 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 de tu clúster. Si el repositorio está en otro proyecto, consulta Usar Artifact Registry cuando no está en el mismo proyecto que el clúster para ver los 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 name-of-your-yaml-file.yaml
    

Ejemplo de creación de un Deployment sin secretos de extracción de imágenes

A continuación, se muestra un ejemplo de cómo crear un Deployment sin secretos de extracción de imágenes. La implementación 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"
    

    Haz los cambios siguientes:

    • LOCATION: la Google Cloud región 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 otro proyecto, consulte Usar Artifact Registry cuando no esté en el mismo proyecto que el clúster para ver los pasos adicionales.
  2. Aplica la configuración a tu clúster con kubectl.

    kubectl apply -f hello-deployment.yaml
    
  3. Confirma que tu implementación se está ejecutando con kubectl pods.

    kubectl get pods --selector=app=products
    

    El resultado muestra tres pods 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
    

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

Para usar un repositorio de Artifact Registry que esté en un proyecto de Google distinto del que contiene tu clúster, sigue estos pasos:

Concede a la cuenta de servicio de las instancias de máquina virtual del grupo de nodos de tu clúster, conocida como agente de servicio de la 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

Con este paso, te aseguras de que tu clúster pueda recuperar artefactos del registro en ese proyecto independiente.

Haz los cambios siguientes:

  • 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 de tu 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 conceda permisos suficientes para acceder a las imágenes del repositorio de Artifact Registry.

Usar Google Container Registry privado

Para integrar un registro de contenedores de Google privado con tu clúster de GKE en AWS, independientemente de la ubicación de su 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 habilita el acceso de la cuenta de servicio del clúster a las imágenes de contenedor privadas.

Haz los cambios siguientes:

  • GCR_PROJECT_ID: ID del proyecto que aloja el registro de contenedores.
  • NODE_POOL_MACHINE_SERVICE_AGENT: la cuenta de servicio del pool de nodos, con el formato service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com.
  • ROLE: elige storage.objectViewer o un rol personalizado para tener suficiente acceso a Container Registry. Ten cuidado con el acceso generalizado con storage.objectViewer.

Limpieza

Para eliminar los recursos que has creado en esta página, ejecuta estos comandos:

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Haz los cambios siguientes:

  • POD_YAML_FILE: el nombre del archivo YAML en el que has definido el pod.
  • DEPLOYMENT_YAML_FILE: el nombre del archivo YAML en el que has definido el despliegue.

Siguientes pasos