Usar un registro de imágenes privado

Tu instalación de GKE en Azure puede acceder a imágenes de contenedor públicas de forma predeterminada. En este tema se explica cómo usar GKE en Azure con un repositorio de imágenes de contenedor privado, como Artifact Registry.

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 los 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 herramienta de línea de comandos gcloud 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 respuesta que se muestra a continuación contiene 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 Desplegar una aplicación contenerizada.

Crear una cuenta de servicio

Tus clústeres 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 los permisos de Artifact Registry.

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

    Haz los cambios siguientes:

    • PROJECT_NAME 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 registry-access-key.json \
      --iam-account ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com
    

    Haz los cambios siguientes:

    • PROJECT_NAME
    • ACCOUNT_NAME

Ahora ya puedes configurar tu clúster de usuarios para conectarte a Artifact Registry.

Guarda la clave en tu clúster

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

  1. Usa kubectl para crear el secreto.

      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)"
    

    Haz los cambios siguientes:

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

    rm registry-access-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 valor spec.imagePullSecrets al nombre de tu secreto.

  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
    

    Haz los cambios siguientes:

    • POD_NAME: el nombre de tu Pod
    • CONTAINER_NAME: 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 a tu 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
    

Creando un despliegue

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

    Por ejemplo, para configurar una implementación que utilice 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
    

    Haz los cambios siguientes:

    • LOCATION
    • PROJECT_NAME
  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
    

Limpieza

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

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

Siguientes pasos