Usar un registro de imágenes privado

En este tema se describe cómo usar GKE en AWS con un repositorio de imágenes de contenedor privado, como Container Registry (GCR).

Antes de empezar

Antes de empezar a usar GKE en AWS, asegúrate de haber completado las siguientes tareas:

  • Instala un servicio de gestión.
  • Crea un clúster de usuarios.
  • En tu directorio de anthos-aws, usa anthos-gke para cambiar el contexto a tu clúster de usuarios.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    Sustituye CLUSTER_NAME por el nombre de tu clúster de usuario.
  • Tener una imagen de Docker creada y enviada a Container Registry. En los ejemplos de este tema se usa el contenedor hello-app, creado siguiendo los pasos de la sección Desplegar una aplicación en contenedores de la documentación de GKE en Google Cloud .

Registros privados de contenedores

Un registro de contenedores almacena y distribuye imágenes de contenedores. Tu instalación de GKE en AWS puede acceder a imágenes públicas de forma predeterminada.

Buscar imágenes en Container 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 Container Registry con la CLI 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 Container Registry incluye una imagen con docker images.

    docker images
    

    Docker se conecta a Container Registry y devuelve las imágenes disponibles en tu repositorio de Container Registry. Por ejemplo, la respuesta que se muestra a continuación contiene una imagen de contenedor llamada hello-app en el repositorio project-id.

    REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
    gcr.io/project-id/hello-app   v1                  732f02cea7cb        12 minutes ago      11.5MB
    

Si no tienes una imagen de contenedor lista, crea una siguiendo los pasos que se indican en Desplegar una aplicación contenerizada.

Crear una cuenta de servicio

Tus clústeres de usuario se autentican mediante una cuenta de servicio de Gestión de Identidades y Accesos (IAM).

Para crear una cuenta de servicio, sigue estos pasos:

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

    gcloud iam service-accounts create account-name
    

    Sustituye account-name por el nombre de la nueva cuenta de servicio. Google Cloud

  2. Concede a la cuenta de servicio acceso a Container Registry.

    gcloud projects add-iam-policy-binding project-id \
      --member serviceAccount:account-name@project-id.iam.gserviceaccount.com \
      --role roles/storage.objectViewer
    

    Haz los cambios siguientes:

    • project-id con tu Google Cloud proyecto
    • account-name con el nombre de tu cuenta de servicio Google Cloud
  3. Descarga la clave de la cuenta de servicio.

    gcloud iam service-accounts keys create key.json \
      --iam-account account-name@project-id.iam.gserviceaccount.com
    

    Haz los cambios siguientes:

    • project-id con tu Google Cloud proyecto
    • account-name con el nombre de tu cuenta de servicio Google Cloud

Ahora ya puedes configurar tu clúster de usuario para conectarlo a Container Registry.

Definir un secreto de Kubernetes

Para proporcionar la clave para autenticarte en Container Registry, guarda la clave de la cuenta de servicio como un secreto de Kubernetes siguiendo estos pasos:

  1. Usa kubectl para crear el secreto.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl create secret docker-registry gcr-secret \
      --docker-server=gcr.io \
      --docker-username=_json_key \
      --docker-email=account-name@project-id.iam.gserviceaccount.com \
      --docker-password="$(cat key.json)"
    

    Haz los cambios siguientes:

    • project-id con tu Google Cloud proyecto
    • account-name con el nombre de tu cuenta de servicio Google Cloud
  2. Elimina la copia local de la clave de tu cuenta de servicio.

    rm key.json
    

Ahora puedes hacer referencia a este secreto en tus cargas de trabajo.

Crear una carga de trabajo con una imagen privada

Para usar una imagen de un repositorio de contenedores privado con una carga de trabajo, asigna el nombre de tu secreto al campo spec.imagePullSecrets. Este campo se encuentra en ubicaciones diferentes para Pods y Deployments.

Crear un pod

Para crear un pod que pueda acceder al registro de contenedores, asigna el nombre de tu secreto al campo spec.imagePullSecrets.

  1. Crea un pod que especifique spec.imagePullSecrets.

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      - name: container-name
        image: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: secret-name
    

    Haz los cambios siguientes:

    • pod-name con el nombre de tu Pod
    • container-name con el nombre del contenedor dentro del pod
    • project-id con tu Google Cloud proyecto
    • secret-name con el nombre de tu secreto de registro

    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: gcr.io/project-id/hello-app:v1
      imagePullSecrets:
      - name: gcr-secret
    
  2. Aplica la configuración a tu clúster con kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-pod.yaml
    
  3. Confirma que el pod se está ejecutando con kubectl get.

    env HTTPS_PROXY=http://localhost:8118 \
      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
    

    Creando un despliegue

  4. Para usar un repositorio privado en una implementación, especifica el imagePullSecret en la plantilla.

    Por ejemplo, para crear un Deployment de 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: "gcr.io/project-id/hello-app:v1"
            env:
            - name: "PORT"
              value: "50001"
          imagePullSecrets:
          - name: gcr-secret
    
  5. Aplica la configuración a tu clúster con kubectl.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f hello-deployment.yaml
    
  6. Confirma que tu implementación se está ejecutando con kubectl pods.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    

    El resultado contiene 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
    

Siguientes pasos