Usa la transmisión de imágenes para extraer imágenes de contenedor


En esta página, se muestra cómo usar la transmisión de imágenes en Google Kubernetes Engine (GKE) para extraer imágenes de contenedor mediante la transmisión de datos de imágenes según tus necesidades.

Descripción general

La transmisión de imágenes es un método para extraer imágenes de contenedores en el que GKE transmite datos de imágenes aptas según lo que soliciten tus aplicaciones. Puedes usar la transmisión de imágenes para permitir que tus cargas de trabajo se inicialicen sin esperar a que se descargue toda la imagen, lo que genera mejoras significativas en los tiempos de inicialización. El tiempo de extracción reducido te brinda beneficios que incluyen lo siguiente:

  • Ajuste de escala automático más rápido
  • Menor latencia cuando se extraen imágenes grandes
  • Inicio más rápido de los pods

Por lo general, GKE descarga la imagen de contenedor completa en cada nodo y la usa como sistema de archivos raíz para tus cargas de trabajo. Con la transmisión de imágenes, GKE usa un sistema de archivos remoto como sistema de archivos raíz para cualquier contenedor que use imágenes de contenedor aptas. GKE transmite datos de imágenes desde el sistema de archivos remoto según lo necesiten tus cargas de trabajo.

Mientras se transmiten los datos de imagen, GKE descarga la imagen de contenedor completa en el disco local, en segundo plano, y la almacena en caché. Luego, GKE entrega solicitudes de lectura de datos futuras desde la imagen en caché.

Cuando implementas cargas de trabajo que necesitan leer archivos específicos en la imagen de contenedor, el backend de transmisión de imágenes solo entrega los archivos solicitados.

Reserva de memoria para la transmisión de imágenes

GKE reserva recursos de memoria para la transmisión de imágenes, además de la memoria reservada para que se ejecuten los componentes del sistema de nodos. GKE no reserva recursos de CPU adicionales para la transmisión de imágenes.

Si deseas obtener detalles sobre las reservas de memoria que GKE realiza para los componentes de nodo, consulta Arquitectura del clúster estándar.

En los nodos que usan la transmisión de imágenes, GKE realiza las siguientes reservas de memoria adicionales:

  • No hay una memoria adicional para las máquinas con menos de 1 GiB de memoria
  • Un 10% de los primeros 4 GiB de memoria
  • Un 8% de los siguientes 4 GiB de memoria (hasta 8 GiB)
  • Un 4% de los siguientes 8 GiB de memoria (hasta 16 GiB)
  • Un 2.4% de los siguientes 112 GiB de memoria (hasta 128 GiB)
  • Un 0.8% de cualquier memoria por encima de 128 GiB

Requisitos

Para usar la transmisión de imágenes, debes cumplir con los siguientes requisitos:

Limitaciones

  • No puedes usar un Secret para extraer imágenes de contenedor.
  • Las imágenes de contenedor que usan el manifiesto de imágenes de V2, versión de esquema 1 no son aptas.
  • Las imágenes de contenedor encriptadas con claves de encriptación administradas por el cliente (CMEK) no son aptas para la transmisión de imágenes. GKE descarga estas imágenes sin transmitir los datos. Aún puedes usar CMEK para proteger discos persistentes y discos de arranque personalizados conectados en clústeres que usan transmisión de imágenes.
  • Tus nodos de GKE deben estar en la misma región que el repositorio de Artifact Registry que contiene la imagen o en una región miembro del repositorio multirregión de Artifact Registry.
  • Si las cargas de trabajo leen muchos archivos en una imagen durante la inicialización, es posible que notes un aumento en los tiempos de inicialización debido a la latencia que agregan las lecturas de archivos remotos.
  • Es posible que no notes los beneficios de la transmisión de imágenes durante la primera extracción de una imagen apta. Sin embargo, después de que la transmisión de imágenes almacena en caché la imagen, las futuras imágenes extraen cualquier beneficio del clúster de la transmisión de imágenes.
  • GKE usa la configuración a nivel de clúster para determinar si deseas habilitar la transmisión de imágenes en grupos de nodos nuevos creados con el aprovisionamiento automático de nodos. Sin embargo, no puedes usar la separación de cargas de trabajo para crear grupos de nodos con la transmisión de imágenes habilitada cuando está inhabilitada a nivel de clúster.
  • Las imágenes de contenedor protegidas por los Controles del servicio de VPC no son aptas para la transmisión de imágenes. GKE descarga estas imágenes sin transmitir los datos.
  • Las capacidades de archivo de Linux no son compatibles con la transmisión de imágenes. Si a alguno de tus archivos de contenedor se le asignan capacidades como CAP_NET_RAW, estas no estarán disponibles cuando el archivo de imagen se transmita o cuando la imagen se guarde en el disco local. A fin de evitar posibles interrupciones, no uses la transmisión de imágenes para contenedores con estas capacidades asignadas.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste el SDK de Cloud.
  • Establece la configuración predeterminada de la herramienta de línea de comandos de gcloud para tu proyecto mediante uno de los siguientes métodos:
    • Usa gcloud init si deseas ver una explicación sobre cómo configurar los valores predeterminados del proyecto.
    • Usa gcloud config para configurar el ID, la zona y la región del proyecto de manera individual.

    gcloud init

    1. Ejecuta gcloud init y sigue las instrucciones:

      gcloud init

      Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

      gcloud init --console-only
    2. Sigue las instrucciones para autorizar a la herramienta de gcloud a usar tu cuenta de Google Cloud.
    3. Crea una configuración nueva o selecciona una existente.
    4. Elige un proyecto de Google Cloud.
    5. Elige una zona de Compute Engine predeterminada.
    6. Elige una región de Compute Engine predeterminada.

    gcloud config

    1. Establece tu ID del proyecto predeterminado:
      gcloud config set project PROJECT_ID
    2. Configura la región de Compute Engine predeterminada (por ejemplo, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Configura la zona de Compute Engine predeterminada (por ejemplo, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Actualiza gcloud a la versión más reciente:
      gcloud components update

    Cuando configuras las ubicaciones predeterminadas, puedes evitar errores en la herramienta gcloud como el siguiente: One of [--zone, --region] must be supplied: Please specify location.

Habilita la transmisión de imágenes en clústeres

Puedes habilitar la transmisión de imágenes en clústeres nuevos o existentes mediante la marca --enable-image-streaming de la herramienta de gcloud o con Google Cloud Console. De forma predeterminada, los grupos de nodos del clúster heredan la configuración de transmisión de imágenes a nivel de clúster. Puedes cambiar este comportamiento si habilitas o inhabilitas la transmisión de imágenes en los grupos de nodos del clúster.

En un clúster nuevo

Puedes habilitar la transmisión de imágenes en clústeres nuevos mediante la herramienta de gcloud o Cloud Console.

gcloud

Para crear un clúster nuevo con la transmisión de imágenes habilitada, ejecuta el siguiente comando:

gcloud container clusters create CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster nuevo.
  • COMPUTE_ZONE: Es la zona de Compute Engine para el clúster nuevo. Para los clústeres regionales, usa la marca --region=COMPUTE_REGION en su lugar. Asegúrate de que la zona o región sea la misma región o que esté dentro de la multirregión del repositorio de Artifact Registry que contiene la imagen.

Console

  1. Ve a la página Google Kubernetes Engine en Cloud Console.

    Ir a Google Kubernetes Engine

  2. Haz clic en Crear.

  3. En la sección GKE Standard, haz clic en Configurar.

  4. En el panel de navegación, en Clúster, haz clic en Funciones.

  5. En la sección Otro, selecciona la casilla de verificación Habilitar la transmisión de imágenes.

  6. Configura el clúster según sea necesario y, luego, haz clic en Crear.

En un clúster existente

Puedes habilitar la transmisión de imágenes en clústeres existentes que cumplan con los requisitos mediante la herramienta de gcloud o Cloud Console.

gcloud

A fin de actualizar un clúster existente para usar la transmisión de imágenes, ejecuta el siguiente comando mediante la herramienta de gcloud:

gcloud container clusters update CLUSTER_NAME \
    --enable-image-streaming

Console

  1. Ve a la página de Google Kubernetes Engine en Cloud Console:

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En la página Clústeres, en la sección Funciones, haz clic en junto a Transmisión de imágenes.

  4. En el cuadro de diálogo Edita la transmisión de imágenes, selecciona la casilla de verificación Habilitar la transmisión de imágenes.

  5. Haz clic en Guardar cambios.

Después de modificar el clúster, GKE habilita la transmisión de imágenes en tus grupos de nodos existentes de forma automática y predeterminada. Si habilitaste o inhabilitaste la transmisión de imágenes de forma explícita en grupos de nodos individuales, esos grupos no heredan los cambios en la configuración a nivel de clúster.

Habilita la transmisión de imágenes en grupos de nodos

De forma predeterminada, los grupos de nodos heredan la configuración de transmisión de imágenes a nivel de clúster. Puedes habilitar o inhabilitar la transmisión de imágenes en grupos de nodos específicos mediante la herramienta de gcloud.

En un grupo de nodos nuevo

Para crear un grupo de nodos nuevo con la transmisión de imágenes habilitada, ejecuta el siguiente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming \

Reemplaza lo siguiente:

  • NODE_POOL_NAME: es el nombre de tu grupo de nodos nuevo.
  • CLUSTER_NAME: el nombre del clúster para el grupo de nodos.
  • COMPUTE_ZONE: Es la zona de Compute Engine de tu clúster. Para los clústeres regionales, usa la marca --region=COMPUTE_REGION en su lugar.

En un grupo de nodos existente

Puedes habilitar la transmisión de imágenes en grupos de nodos existentes que cumplan con los requisitos.

A fin de actualizar un grupo de nodos existente para usar la transmisión de imágenes, ejecuta el siguiente comando:

gcloud container node-pools update POOL_NAME \
    --cluster=CLUSTER_NAME \
    --enable-image-streaming

Programa una carga de trabajo mediante la transmisión de imágenes

Después de habilitar la transmisión de imágenes en tu clúster, GKE usa la transmisión de imágenes de forma automática cuando extrae imágenes de contenedor aptas de Artifact Registry sin necesidad de realizar una configuración adicional.

GKE agrega la etiqueta cloud.google.com/gke-image-streaming: "true" a los nodos en grupos de nodos con la transmisión de imágenes habilitada. Si habilitas o inhabilitas la transmisión de imágenes en grupos de nodos específicos para que tu clúster tenga una combinación de nodos que usen la transmisión de imágenes y otros que no lo hacen, puedes usar selectores de nodos en las implementaciones para controlar si GKE programa las cargas de trabajo en los nodos que usan la transmisión de imágenes.

En el siguiente ejemplo, programarás una implementación que usa una imagen de contenedor grande en un clúster con la transmisión de imágenes habilitada. Luego, de manera opcional, puedes comparar el rendimiento con una extracción de imagen sin la transmisión de imágenes habilitada.

  1. Crea un clúster nuevo con la transmisión de imágenes habilitada:

    gcloud container clusters create CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Obtén credenciales para el clúster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=COMPUTE_ZONE
    
  3. Guarda el siguiente manifiesto como frontend-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: guestbook
          tier: frontend
      template:
        metadata:
          labels:
            app: guestbook
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
            env:
            - name: GET_HOSTS_FROM
              value: "dns"
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
    

    La imagen de contenedor gb-frontend tiene un tamaño de 327 MB.

  4. Aplica el manifiesto al clúster:

    kubectl apply -f frontend-deployment.yaml
    
  5. Verifica que GKE haya creado el Deployment:

    kubectl get pods -l app=guestbook
    

    El resultado es similar a este:

    NAMESPACE    NAME                          READY    STATUS       RESTARTS    AGE
    default      frontend-64bcc69c4b-pgzgm     1/1      Completed    0           3s
    
  6. Obtén el registro de eventos de Kubernetes para ver los eventos de extracción de imágenes:

    kubectl get events --all-namespaces
    

    El resultado es similar a este:

    NAMESPACE  LAST SEEN  TYPE    REASON          OBJECT                                                 MESSAGE
    default    11m        Normal  Pulling         pod/frontend-64bcc69c4b-pgzgm                          Pulling image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5"
    default    11m        Normal  Pulled          pod/frontend-64bcc69c4b-pgzgm                          Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 1.536908032s
    default    11m        Normal  ImageStreaming  node/gke-riptide-cluster-default-pool-f1552ec4-0pjv    Image us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5 is backed by image streaming.
    ...
    

    En este resultado, se ilustra lo siguiente:

    • En el evento Pulled, se muestra el tiempo que tarda la transmisión de imágenes en extraer la imagen.
    • En el evento ImageStreaming, se muestra que el nodo usa la transmisión de imágenes para entregar la imagen de contenedor.

Compara el rendimiento con las extracciones de imágenes estándar

En este ejemplo opcional, crearás un clúster nuevo con la transmisión de imágenes inhabilitada y, además, implementarás el Deployment de frontend para comparar el rendimiento con la transmisión de imágenes.

  1. Crea un clúster nuevo con la transmisión de imágenes inhabilitada:

    gcloud container clusters create CLUSTER2_NAME\
        --zone=COMPUTE_ZONE \
        --image-type="COS_CONTAINERD"
    
  2. Obtén credenciales para el clúster:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --zone=COMPUTE_ZONE
    
  3. Implementa el Deployment de frontend del ejemplo anterior:

    kubectl apply -f frontend-deployment.yaml
    
  4. Obtén el registro de eventos de Kubernetes:

    kubectl get events --all-namespaces
    

    El resultado es similar a este:

     NAMESPACE  LAST SEEN  TYPE    REASON     OBJECT                             MESSAGE
     default    87s        Normal  Pulled     pod/frontend-64bcc69c4b-qwmfp      Successfully pulled image "us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5" in 23.929723476s
    

    Observa el tiempo que GKE tardó en extraer toda la imagen. En este resultado de ejemplo, GKE necesitó casi 24 segundos. Con la transmisión de imágenes habilitada, GKE solo necesitaba 1.5 segundos para extraer los datos de imagen necesarios para el inicio de la carga de trabajo.

Limpia

Para evitar cargos, borra los clústeres que creaste en los ejemplos anteriores:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME

Usa la transmisión de imágenes con el escalador automático del clúster

El escalador automático del clúster usa la transmisión de imágenes para mejorar el rendimiento del ajuste de escala automático. Los nodos nuevos creados durante los eventos de escalamiento vertical usan las imágenes importadas por la transmisión de imágenes en lugar de descargar imágenes del repositorio. El escalador automático del clúster habilita la transmisión de imágenes en grupos de nodos nuevos creados en los clústeres con la transmisión de imágenes habilitada.

Inhabilita la transmisión de imágenes

De forma predeterminada, GKE no habilita la transmisión de imágenes en clústeres nuevos. Puedes inhabilitar la transmisión de imágenes en clústeres existentes y en grupos de nodos nuevos y existentes.

En un clúster existente

Puedes inhabilitar la transmisión de imágenes en clústeres existentes con la herramienta de gcloud o Cloud Console.

gcloud

Para inhabilitar la transmisión de imágenes en un clúster existente, ejecuta el siguiente comando:

gcloud container clusters update CLUSTER_NAME \
    --no-enable-image-streaming

Console

  1. Ve a la página de Google Kubernetes Engine en Cloud Console:

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que deseas modificar.

  3. En la página Clústeres, en Funciones, haz clic en junto a Transmisión de imágenes.

  4. En el cuadro de diálogo Edita la transmisión de imágenes, desmarca la casilla de verificación Habilitar la transmisión de imágenes.

  5. Haz clic en Guardar cambios.

En un grupo de nodos nuevo

Para inhabilitar la transmisión de imágenes cuando creas un grupo de nodos nuevo, especifica la marca --no-enable-image-streaming, como en el siguiente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --no-enable-image-streaming

En un grupo de nodos existente

Para inhabilitar la transmisión de imágenes en un grupo de nodos existente, ejecuta el siguiente comando:

gcloud container node-pools update NODE_POOL_NAME \
    --cluster=CLUSTER_NAME
    --no-enable-image-streaming

Soluciona problemas

GKE no usa el sistema de archivos de transmisión de imágenes

Si el registro de acontecimientos de GKE no muestra los eventos de transmisión de imágenes, el sistema de archivos remoto no respalda la imagen. Si GKE extrajo antes la imagen en el nodo, este es el comportamiento esperado, ya que GKE usa la caché local de la imagen para las extracciones posteriores en lugar de usar la transmisión de imágenes. Para verificar esto, busca Container image IMAGE_NAME already present on machine en el campo Message del evento Pulled del pod.

Si no ves el evento de transmisión de imágenes durante la primera extracción de imagen en el nodo, asegúrate de cumplir con los requisitos para la transmisión de imágenes. Si cumples con los requisitos, puedes diagnosticar el problema si te conectas al nodo afectado y revisas los registros del servicio de transmisión de imágenes (llamado gcfsd):

journalctl -u gcfsd

Como alternativa, puedes verificar los registros mediante el Explorador de registros para filtrar los registros gcfsd con logName="projects/PROJECT_ID/logs/gcfsd".

Prueba una de las siguientes soluciones según el mensaje de error que se muestra.

PermissionDenied

Si los registros gcfsd muestran un mensaje de error similar al siguiente, el nodo no tiene el alcance de API correcto. GKE extrae imágenes de contenedor para cargas de trabajo sin usar la transmisión de imágenes.

level=fatal msg="Failed to create a Container File System client: rpc error:
code = PermissionDenied desc = failed to probe endpoint: rpc error: code = PermissionDenied
desc = Request had insufficient authentication scopes."

Para solucionar este problema, otorga el permiso correcto al nodo a fin de permitirle que use la transmisión de imágenes. Agrega el permiso devstorage.read_only al clúster o grupo de nodos, de manera similar al siguiente comando:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --zone=COMPUTE_ZONE \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming \
    --scope="https://www.googleapis.com/auth/devstorage.read_only" \

FailedPrecondition

Si observas un mensaje de error con code = FailedPrecondition, la imagen no se importó al sistema de archivos remoto de transmisión de imágenes.

Es posible que notes este error si intentaste usar la transmisión de imágenes con un grupo de nodos existente. Si un nodo del grupo de nodos ya tiene la imagen de contenedor en el disco, GKE usa la imagen local en lugar de usar la transmisión de imágenes para obtener la imagen.

Para solucionar este problema, prueba lo siguiente:

  • Espera unos minutos y, luego, intenta implementar tu carga de trabajo de nuevo.
  • Agrega nodos o un grupo de nodos nuevos y programa la carga de trabajo en esos nodos.

InvalidArgument

Si observas un mensaje de error con code=InvalidArgument, la imagen de contenedor que usa tu carga de trabajo no es apta para la transmisión de imágenes. Asegúrate de que la imagen cumpla con los requisitos. Si tu imagen no está en Artifact Registry, intenta migrar a Artifact Registry.