Usa un registro de imágenes privado

La instalación de GKE on AWS puede acceder a las imágenes de contenedores públicos de forma predeterminada. En este tema, se explica cómo usar GKE on AWS con un repositorio de imágenes de contenedor privado, como Artifact Registry.

A partir de la versión 1.28, GKE on AWS proporciona una forma de extraer imágenes privadas de Artifact Registry o Container Registry sin tener que usar un secreto de Kubernetes. Para obtener más información, consulta Usa un registro de imágenes privado sin secretos.

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
    

    La herramienta de línea de comandos de gcloud 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 mediante los pasos que se describen en Implementa una aplicación alojada en contenedores.

Crear una cuenta de servicio.

Tus clústeres de usuarios se autentican con una cuenta de servicio de Identity and Access Management (IAM).

Para crear una cuenta de servicio nueva, sigue estos pasos:

  1. Crea una cuenta de servicio de IAM con Google Cloud CLI.

    gcloud iam service-accounts create ACCOUNT_NAME
    

    Reemplaza ACCOUNT_NAME por el nombre de la nueva cuenta de servicio de Google Cloud.

  2. Otorga los permisos de Artifact Registry a la cuenta de servicio.

    gcloud projects add-iam-policy-binding PROJECT_NAME \
      --member serviceAccount:ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --role roles/artifactregistry.reader
    

    Reemplaza lo siguiente:

    • PROJECT_NAME con tu proyecto de Google Cloud
    • ACCOUNT_NAME por el nombre de la cuenta de servicio de Google Cloud
  3. Descarga la clave de la cuenta de servicio.

    gcloud iam service-accounts keys create registry-access-key.json \
      --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
    

    Reemplaza lo siguiente:

    • PROJECT_NAME
    • ACCOUNT_NAME

Ahora estás listo para configurar el clúster de usuario a fin de conectarte a Artifact Registry.

Guarda la clave para tu clúster

A fin de proporcionar la clave para la autenticación en Artifact Registry, guarda la clave de la cuenta de servicio como un Secret de Kubernetes mediante estos pasos:

  1. Usa kubectl para crear el Secret.

      kubectl create secret docker-registry registry-secret \
      --docker-server=LOCATION-docker.pkg.dev \
      --docker-username=_json_key \
      --docker-email=ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com \
      --docker-password="$(cat registry-access-key.json)"
    

    Reemplaza lo siguiente:

    • LOCATION: es la ubicación regional o multirregional del repositorio.
    • PROJECT_NAME
    • ACCOUNT_NAME
  2. Borra la copia local de la clave de la cuenta de servicio.

    rm registry-access-key.json
    

Ahora puedes hacer referencia a este Secret en las cargas de trabajo.

Crea una carga de trabajo con una imagen privada

Para usar una imagen de un repositorio de contenedores privado con una carga de trabajo, establece el campo spec.imagePullSecrets en tu nombre de Secret. Este campo está en diferentes ubicaciones para los Pods y las implementaciones.

Crea un Pod

Para crear un Pod que pueda acceder al registro de contenedores, configura el campo spec.imagePullSecrets con el nombre del Secret.

  1. Crea un Pod que especifique spec.imagePullSecrets.

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
      imagePullSecrets:
      - name: registry-secret
    

    Reemplaza lo siguiente:

    • POD_NAME: Es el nombre de tu Pod.
    • CONTAINER_NAME: Es el nombre del contenedor dentro del Pod.
    • LOCATION
    • PROJECT_NAME

    Por ejemplo, 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
      imagePullSecrets:
      - name: registry-secret
    
  2. Aplica la configuración al clúster mediante kubectl:

    kubectl apply -f hello-pod.yaml
    
  3. Confirma que el Pod esté en ejecución mediante 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 un Deployment

  1. Para usar un repositorio privado en un Deployment, especifica el imagePullSecret dentro de la plantilla.

    Por ejemplo, para configurar un objeto Deployment que use la imagen hello-app, 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"
          imagePullSecrets:
          - name: registry-secret
    

    Reemplaza lo siguiente:

    • LOCATION
    • PROJECT_NAME
  2. Aplica la configuración al clúster mediante kubectl:

    kubectl apply -f hello-deployment.yaml
    
  3. Confirma que el Deployment esté en ejecución mediante 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
    

Limpia

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

kubectl apply -f hello-pod.yaml
kubectl delete -f hello-deployment.yaml

¿Qué sigue?