Utilice un registro de imágenes privado sin secretos

GKE en AWS permite extraer imágenes privadas de Artifact Registry o Container Registry sin necesidad de usar un secreto de Kubernetes. Anteriormente, se debían realizar los siguientes pasos:

  1. Cree una cuenta de servicio de Administración de identidad y acceso de Google (IAM).
  2. Otorgar a la cuenta de servicio permisos para acceder al registro privado.
  3. Descargue la clave de la cuenta de servicio y guárdela como un secreto de Kubernetes en su clúster.
  4. Haga referencia a este secreto en su manifiesto YAML para pods o implementaciones para que puedan acceder a imágenes desde el repositorio de contenedores privado.
  5. Rote y administre periódicamente las claves asociadas a la cuenta de servicio Google IAM.

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

Antes de empezar

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

Busque imágenes en Artifact Registry

Para completar el resto de estos pasos, necesita una imagen de contenedor. Obtenga el nombre de sus imágenes de contenedor siguiendo estos pasos:

  1. Configure la herramienta de línea de comandos de Docker para autenticarse en Artifact Registry con Google Cloud SDK:

    gcloud auth configure-docker
    

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

  2. Confirme que su Registro de artefactos incluye una imagen con el comando docker images :

    docker images
    

    Docker se conecta al Registro de Artefactos y devuelve las imágenes disponibles en su repositorio. Por ejemplo, la siguiente respuesta 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 tiene una imagen de contenedor lista, cree una siguiendo los pasos que se indican en Implementar una aplicación en contenedores .

Crea 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 proporcionar el campo spec.imagePullSecrets en la especificación del pod. Para configurar el pod, siga estos pasos:

  1. Cree 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
    

    Reemplace lo siguiente:

    • POD_NAME : el nombre del Pod.
    • CONTAINER_NAME : el nombre del contenedor dentro del Pod.
    • LOCATION : el Google Cloud Región que contiene su registro. Por ejemplo, us-west1 .
    • PROJECT_NAME : el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser el mismo que el del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información.
    • REPOSITORY_NAME : el nombre de su repositorio.
    • IMAGE_NAME : el nombre de la imagen.
    • IMAGE_VERSION : la versión de la imagen.
  2. Aplique la configuración a su clúster con kubectl :

    kubectl apply -f YAML_FILE_NAME
    

    Reemplace YAML_FILE_NAME con el nombre de su archivo YAML.

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

Este es un ejemplo de creación de un pod de Kubernetes sin necesidad de secretos de extracción de imágenes. El pod extrae la imagen hello-app del Registro de Artefactos.

  1. Para extraer la imagen hello-app , copie 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. Aplique la configuración a su clúster con kubectl :

    kubectl apply -f hello-pod.yaml
    
  3. Confirme que el Pod se esté ejecutando con kubectl get :

    kubectl get pod/hello-pod
    

    La respuesta incluye un Pod con estado En 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 proporcionar el campo spec.imagePullSecrets en la especificación de la implementación. Para configurar la implementación, siga estos pasos:

  1. Cree una definición de implementación 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
    

    Reemplace lo siguiente:

    • DEPLOYMENT_NAME : el nombre de su implementación.
    • NUMBER_OF_REPLICAS : cuántas instancias del Pod definido en la Implementación deben estar ejecutándose en un momento dado.
    • CONTAINER_NAME : el nombre del contenedor dentro del Pod.
    • LOCATION : el Google Cloud Región que contiene su registro. Por ejemplo, us-west1 .
    • PROJECT_NAME : el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser diferente al del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información.
    • REPOSITORY_NAME : el nombre de su repositorio.
    • IMAGE_NAME : el nombre de la imagen.
    • IMAGE_VERSION : la versión de la imagen.
  2. Aplique la configuración a su clúster con kubectl .

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

Ejemplo de creación de una implementación sin secretos de extracción de imágenes

A continuación, se muestra un ejemplo de creación de una implementación sin secretos de extracción de imágenes. La implementación extrae una imagen de hello-app del Registro de Artefactos.

  1. Cree 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"
    

    Reemplace lo siguiente:

    • LOCATION : el Google Cloud Región que contiene su registro. Por ejemplo, us-west1 .
    • PROJECT_NAME : el nombre del proyecto de Google que aloja el repositorio de Artifact Registry, que podría ser diferente al del proyecto de tu clúster. Si el repositorio pertenece a otro proyecto, consulta "Usar Artifact Registry cuando no pertenece al mismo proyecto que tu clúster" para obtener más información.
  2. Aplique la configuración a su clúster con kubectl .

    kubectl apply -f hello-deployment.yaml
    
  3. Confirme que su implementación se esté ejecutando con kubectl pods .

    kubectl get pods --selector=app=products
    

    La salida muestra tres Running Pods.

    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
    

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

Para utilizar un repositorio de Artifact Registry que se encuentre en un Proyecto de Google diferente del que contiene su clúster, realice los siguientes pasos:

Otorgue a la cuenta de servicio de las instancias de máquinas virtuales del grupo de nodos de su clúster, conocida 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 su clúster pueda recuperar artefactos del registro en ese proyecto separado.

Reemplace lo siguiente:

  • AR_PROJECT_ID : el ID del proyecto de Google que aloja el Registro de artefactos.
  • NODE_POOL_MACHINE_SERVICE_AGENT : la cuenta de servicio para el grupo de nodos de su 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 en el repositorio de Artifact Registry.

Utilice el Registro de contenedores privado de Google

Para integrar un Google Container Registry privado con su clúster de GKE en AWS, independientemente de la ubicación de su proyecto de Google, siga estos pasos:

Permita que el Agente de servicio de máquina de grupo de nodos, la cuenta de servicio para las instancias de máquina virtual de grupo de nodos de su clúster, acceda al Registro de contenedores:

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

Este paso habilita el acceso de la cuenta de servicio del clúster a las imágenes del contenedor privado.

Reemplace lo siguiente:

  • GCR_PROJECT_ID : el ID del proyecto que aloja el Registro de contenedores.
  • 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 : seleccione storage.objectViewer o un rol personalizado para obtener suficiente acceso al Registro de Contenedores. Tenga cuidado con el acceso generalizado con storage.objectViewer .

Limpiar

Para eliminar los recursos que creó en esta página, ejecute estos comandos:

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Reemplace lo siguiente:

  • POD_YAML_FILE : el nombre del archivo YAML en el que definió el Pod.
  • DEPLOYMENT_YAML_FILE : el nombre del archivo YAML en el que definió la implementación.

¿Qué sigue?