Usar streaming de imágenes para extraer imágenes de contenedor

En esta página se muestra cómo usar Image streaming en Google Kubernetes Engine (GKE) para extraer imágenes de contenedor mediante el streaming de los datos de la imagen a medida que los necesiten tus aplicaciones.

Los clústeres de Autopilot (versión 1.25.5 y posteriores) usan automáticamente Image streaming para extraer las imágenes aptas. Las instrucciones de esta página solo se aplican a los clústeres estándar.

Información general

El streaming 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 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 supone una mejora significativa de los tiempos de inicialización. El tiempo de extracción reducido te ofrece ventajas como las siguientes:

  • Autoescalado más rápido
  • Latencia reducida al extraer imágenes grandes
  • Inicio de pods más rápido

Con el streaming de imágenes, GKE usa un sistema de archivos remoto como sistema de archivos raíz de los contenedores que usan imágenes de contenedor aptas. GKE transmite datos de imagen desde el sistema de archivos remoto según lo necesiten tus cargas de trabajo. Sin la transmisión de imágenes, GKE descarga toda la imagen del contenedor en cada nodo y la usa como sistema de archivos raíz para tus cargas de trabajo.

Mientras se transmiten los datos de la imagen, GKE descarga toda la imagen del contenedor en el disco local en segundo plano y la almacena en la caché. A continuación, GKE responde a las futuras solicitudes de lectura de datos con la imagen almacenada en caché.

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

Requisitos

Para usar la transmisión de imágenes en clústeres Estándar y Autopilot de GKE, debes cumplir los siguientes requisitos:

  • Debes habilitar la API Container File System.

    Habilitar la API Container File System

  • Debes usar la imagen de nodo de Container-Optimized OS con containerd. Los nodos de Autopilot siempre usan esta imagen de nodo.

  • Las imágenes de contenedor deben almacenarse en repositorios estándar o remotos de Artifact Registry, o bien en registros públicos de Docker Hub.

  • Si habilitas los nodos privados en tu clúster, debes habilitar Acceso privado de Google en la subred para que tus nodos puedan acceder al servicio de streaming de imágenes.

  • Si Controles de Servicio de VPC protege tus imágenes de contenedor y usas la transmisión de imágenes, también debes incluir la API Image streaming (containerfilesystem.googleapis.com) en el perímetro de servicio.

  • Si los nodos de GKE del clúster no usan la cuenta de servicio predeterminada, debes asegurarte de que tu cuenta de servicio personalizada tenga el rol de gestión de identidades y accesos Consumidor de uso de servicios (roles/serviceusage.serviceUsageConsumer) en el proyecto que aloja la imagen de contenedor.

Limitaciones

  • Las imágenes de contenedor que usan el manifiesto de imagen V2, versión 1 del esquema, no cumplen los requisitos.
  • No se admiten imágenes de contenedor con capas duplicadas. GKE descarga estas imágenes sin transmitir los datos. Comprueba si la imagen del contenedor tiene capas vacías o duplicadas.
  • Si tus cargas de trabajo leen muchos archivos en una imagen durante la inicialización, es posible que observes un aumento de los tiempos de inicialización debido a la latencia añadida por las lecturas de archivos remotos.
  • Si tus cargas de trabajo requieren que una gran parte de la imagen esté disponible antes de que se pueda ejecutar el código, es posible que se produzca un retraso entre el momento en que kubelet inicia el contenedor y el momento en que el contenedor empieza a enviar registros.
  • Es posible que no notes las ventajas de la transmisión de imágenes durante la primera extracción de una imagen apta. Sin embargo, después de que Image streaming almacene en caché la imagen, las futuras solicitudes de imágenes en cualquier clúster se beneficiarán de Image streaming.
  • Los clústeres estándar de GKE usan la configuración a nivel de clúster para determinar si se debe habilitar Image Streaming en los 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 esta función está inhabilitada a nivel de clúster.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

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

Puedes habilitar la transmisión de imágenes en clústeres estándar nuevos o ya creados mediante la marca --enable-image-streaming de la CLI de gcloud o la consolaGoogle Cloud . De forma predeterminada, los grupos de nodos del clúster heredan la configuración de streaming de imágenes a nivel de clúster. Puedes cambiar este comportamiento habilitando o inhabilitando la transmisión de imágenes en los grupos de nodos del clúster.

Todos los clústeres de Autopilot (versión 1.25.5 y posteriores) usan la transmisión de imágenes para extraer las imágenes aptas. Para obtener instrucciones, consulta Definir la versión y el canal de lanzamiento de un nuevo clúster de Autopilot. Las siguientes instrucciones solo se aplican a los clústeres Estándar de GKE.

En un clúster nuevo

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

gcloud

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

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --image-type="COS_CONTAINERD" \
    --enable-image-streaming

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del nuevo clúster.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales. Asegúrate de que la región o la zona sea la misma que la región o la multirregión del repositorio de Artifact Registry que contiene la imagen.

Consola

  1. En la Google Cloud consola, ve a la página Crear un clúster de Kubernetes.

    Ir a Crear un clúster de Kubernetes

  2. En el panel de navegación, ve a Clúster y haz clic en Funciones.
  3. En la sección Otro, selecciona la casilla Habilitar streaming de imágenes.
  4. Configura el clúster según sea necesario y, a continuación, haz clic en Crear.

En un clúster

Puedes habilitar la transmisión de imágenes en clústeres que cumplan los requisitos con la interfaz de línea de comandos gcloud o con la consola de Google Cloud .

gcloud

Para actualizar un clúster y usar la transmisión de imágenes, ejecuta el siguiente comando con la interfaz de línea de comandos de gcloud:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --enable-image-streaming

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre de tu clúster.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

Consola

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

    Ir a Google Kubernetes Engine

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

  3. En la página Clusters (Clusters), en la sección Features (Funciones), haz clic en junto a Image streaming (Streaming de imágenes).

  4. En el cuadro de diálogo Editar streaming de imágenes, selecciona la casilla Habilitar streaming de imágenes.

  5. Haz clic en Guardar cambios.

Después de modificar el clúster, GKE habilita Image Streaming en los grupos de nodos que ya tengas de forma automática y predeterminada. Si has habilitado o inhabilitado explícitamente la transmisión de imágenes en grupos de nodos concretos, esos grupos de nodos no heredarán los cambios en la configuración a nivel de clúster.

Si se cambia el ajuste de streaming de imágenes a nivel de clúster, se respeta la disponibilidad del mantenimiento, pero no a nivel de grupo de nodos.

Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos y respetando las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar interrupciones de actualizaciones de nodos.

Verificar que el streaming de imágenes esté habilitado en un clúster

Puedes comprobar si Image streaming está habilitado a nivel de clúster mediante la CLI de gcloud o la consola Google Cloud .

gcloud

Ejecuta el siguiente comando:

gcloud container clusters describe CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --flatten "nodePoolDefaults.nodeConfigDefaults"

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre de tu clúster.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

El ajuste está habilitado si el resultado es similar al siguiente:

gcfsConfig:
  enabled: true
...

El ajuste está inhabilitado si el resultado es similar al siguiente:

gcfsConfig: {}
...

Consola

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

    Ir a Google Kubernetes Engine

  2. Haz clic en el nombre del clúster que quieras consultar.

  3. En la página Clusters (Clusters), en la sección Features (Funciones), junto a Image streaming (Streaming de imágenes), se mostrará si el ajuste está habilitado.

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

De forma predeterminada, los grupos de nodos heredan la configuración de streaming 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 CLI de gcloud.

En un nuevo grupo de nodos

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

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

Haz los cambios siguientes:

  • NODE_POOL_NAME: el nombre del nuevo grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster del nodo pool.
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.

En un grupo de nodos ya creado

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

Para actualizar un grupo de nodos para que use la transmisión de imágenes, ejecuta el siguiente comando:

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

Haz los cambios siguientes:

  • POOL_NAME: el nombre de tu grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster del nodo pool.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

Si se cambia el ajuste de streaming de imágenes a nivel de clúster, se respeta la disponibilidad del mantenimiento, pero no a nivel de grupo de nodos.

Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos sin respetar las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar interrupciones de actualizaciones de nodos.

Verificar que el streaming de imágenes esté habilitado en un grupo de nodos

Comprueba si la transmisión de imágenes está habilitada en un grupo de nodos:

gcloud container node-pools describe POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION

Haz los cambios siguientes:

  • POOL_NAME: el nombre de tu grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster del nodo pool.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

El ajuste está habilitado si el resultado es similar al siguiente:

gcfsConfig:
  enabled: true
...

El ajuste está inhabilitado si el resultado es similar al siguiente:

gcfsConfig: {}
...

Programar una carga de trabajo con la transmisión de imágenes

Después de habilitar la transmisión de imágenes en tu clúster, GKE usará automáticamente la transmisión de imágenes al extraer imágenes de contenedor aptas de Artifact Registry sin necesidad de realizar más configuraciones.

GKE añade la etiqueta cloud.google.com/gke-image-streaming: "true" a los nodos de los grupos de nodos en los que se ha habilitado el streaming de imágenes. En GKE Standard, si habilitas o inhabilitas Image Streaming en grupos de nodos específicos para que tu clúster tenga una combinación de nodos que usen Image Streaming y nodos que no lo usen, puedes usar selectores de nodos en tus implementaciones para controlar si GKE programa tus cargas de trabajo en nodos que usen Image Streaming.

En el siguiente ejemplo, se programa un Deployment que usa una imagen de contenedor grande en un clúster con Image streaming habilitado. Después, puedes comparar el rendimiento con una extracción de imágenes sin la función de streaming de imágenes habilitada.

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

    gcloud container clusters create CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-image-streaming \
        --image-type="COS_CONTAINERD"
    
  2. Obtén las credenciales del clúster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. Guarda el siguiente archivo de 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 a tu clúster:

    kubectl apply -f frontend-deployment.yaml
    
  5. Verifica que GKE haya creado la implementación:

    kubectl get pods -l app=guestbook
    

    El resultado debería ser similar al siguiente:

    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 debería ser similar al siguiente:

    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:

    • El evento Pulled muestra el tiempo que tarda el streaming de imágenes en extraer la imagen.
    • El evento ImageStreaming muestra que el nodo usa el streaming de imágenes para servir la imagen de contenedor.

Comparar el rendimiento con las solicitudes de imágenes estándar

En este ejemplo opcional, se crea un clúster con la función de streaming de imágenes inhabilitada y se implementa la frontend implementación para comparar el rendimiento con la función de streaming de imágenes.

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

    gcloud container clusters create CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --image-type="COS_CONTAINERD"
    
  2. Obtén las credenciales del clúster:

    gcloud container clusters get-credentials CLUSTER2_NAME \
        --location=CONTROL_PLANE_LOCATION
    
  3. Despliega el frontend Deployment 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 debería ser similar al siguiente:

     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
    

    Fíjate en el tiempo que ha tardado GKE en extraer toda la imagen. En este ejemplo, GKE ha necesitado casi 24 segundos. Con la transmisión de imágenes habilitada, GKE solo necesitó 1,5 segundos para extraer los datos de la imagen que necesitaba la carga de trabajo para iniciarse.

Limpieza

Para evitar que se te cobre, elimina los clústeres que has creado en los ejemplos anteriores:

gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME \
    --location=CONTROL_PLANE_LOCATION

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre de tu primer clúster.
  • CLUSTER2_NAME: el nombre de tu segundo clúster.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de los clústeres.

Inhabilitar la transmisión de imágenes

Si usas Autopilot de GKE, no puedes inhabilitar el streaming de imágenes en clústeres concretos. Puedes inhabilitar la API Container File System, lo que inhabilita la transmisión de imágenes en todo el proyecto.

Si usas clústeres de GKE Standard, puedes inhabilitar Image Streaming en clústeres concretos o en grupos de nodos específicos, como se describe en las siguientes secciones.

Inhabilitar la transmisión de imágenes en un clúster de GKE Standard

Puedes inhabilitar la transmisión de imágenes en clústeres estándar de GKE con la CLI de gcloud o laGoogle Cloud consola.

gcloud

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

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre de tu clúster.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

Consola

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

    Ir a Google Kubernetes Engine

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

  3. En la página Clusters (Clusters), vaya a Features (Funciones) y haga clic en junto a Image streaming (Streaming de imágenes).

  4. En el cuadro de diálogo Editar streaming de imágenes, desmarca la casilla Habilitar streaming de imágenes.

  5. Haz clic en Guardar cambios.

Si se cambia el ajuste de streaming de imágenes a nivel de clúster, se respeta la disponibilidad del mantenimiento, pero no a nivel de grupo de nodos.

Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos y respetando las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar interrupciones de actualizaciones de nodos.

En un nuevo grupo de nodos

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

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --no-enable-image-streaming

En un grupo de nodos ya creado

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

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

Haz los cambios siguientes:

  • NODE_POOL_NAME: el nombre de tu grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster del nodo pool.
  • CONTROL_PLANE_LOCATION: la ubicación del plano de control de tu clúster.

Si se cambia el ajuste de streaming de imágenes a nivel de clúster, se respeta la disponibilidad del mantenimiento, pero no a nivel de grupo de nodos.

Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos sin respetar las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar interrupciones de actualizaciones de nodos.

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 que se reserva para que se ejecuten los componentes del sistema de los nodos. GKE no reserva recursos de CPU adicionales para el streaming de imágenes. En los clústeres Estándar de GKE, esta reserva cambia los recursos de memoria que puedes solicitar en tus pods. En Autopilot de GKE, GKE gestiona las asignaciones del sistema, por lo que no afecta a la programación de tus cargas de trabajo.

Para obtener información sobre las reservas de memoria que hace GKE para los componentes de los nodos, consulta Arquitectura de clúster estándar.

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

  • No se añade memoria adicional a las máquinas con menos de 1 GiB de memoria
  • 1% de los primeros 4 GiB de memoria
  • 0,8% de los siguientes 4 GiB de memoria (hasta 8 GiB)
  • 0,4% de los siguientes 8 GiB de memoria (hasta 16 GiB)
  • 0,24% de los siguientes 112 GiB de memoria (hasta 128 GiB)
  • 0,08% de la memoria que supere los 128 GiB

Solución de problemas

En las siguientes secciones se ofrecen consejos para solucionar problemas con la transmisión de imágenes. Para obtener información sobre cómo solucionar problemas con las extracciones de imágenes estándar, consulta Solucionar problemas con las extracciones de imágenes.

GKE no usa el sistema de archivos de streaming de imágenes

Si en el registro de eventos de GKE no se muestran los eventos de streaming de imágenes, significa que tu imagen no está respaldada por el sistema de archivos remoto. Si GKE ya había extraído la imagen del 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. Puedes comprobarlo buscando 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 imágenes en el nodo, asegúrate de que cumples los requisitos de transmisión de imágenes. Si cumples los requisitos, puedes diagnosticar el problema consultando los registros del servicio de streaming de imágenes (llamado gcfsd):

  1. Ve a la página Explorador de registros de la Google Cloud consola:

    Ir a Explorador de registros

  2. En el campo Consulta, especifica la siguiente consulta:

    logName="projects/PROJECT_ID/logs/gcfsd"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    Haz los cambios siguientes:

    • PROJECT_ID: el nombre de tu proyecto.
    • CLUSTER_NAME: el nombre del clúster.
  3. Haz clic en Realizar una consulta.

También puedes consultar los registros de gcfsd con el Explorador de registros:

  1. Ve al Explorador de registros de la Google Cloud consola:

    Ir a Explorador de registros

  2. En el campo Consulta, especifica la siguiente consulta:

    logName="projects/PROJECT_ID/logs/gcfsd"
    

    Sustituye PROJECT_ID por el ID de tu proyecto. Google Cloud

PermissionDenied

Si los registros gcfsd muestran un mensaje de error similar al siguiente, el nodo no tiene el ámbito de API correcto. GKE extrae imágenes de contenedor para cargas de trabajo sin usar el streaming 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 solucionarlo, concede el ámbito correcto al nodo para que pueda usar la transmisión de imágenes. Añade el ámbito devstorage.read_only al clúster o al grupo de nodos, como en el siguiente comando:

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

FailedPrecondition

Si ves un mensaje de error con code = FailedPrecondition, significa que la imagen no se ha importado al sistema de archivos remoto de Image Streaming.

Puede que veas este error si has intentado usar la transmisión de imágenes con un grupo de nodos ya creado. 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 el streaming de imágenes para obtenerla.

Para solucionar este problema, prueba lo siguiente:

  • Espera unos minutos y vuelve a intentar desplegar tu carga de trabajo.
  • Añade nodos o un grupo de nodos nuevos y programa la carga de trabajo en esos nodos.

InvalidArgument

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

backend.FileContent failed

Puede que se produzca el siguiente error al leer archivos de contenedor con la función de streaming de imágenes habilitada:

level=error msg="backend.FileContent failed" error="rpc error: code = ResourceExhausted desc = Quota exceeded for quota metric 'Content requests per project per region' and limit 'Content requests per project per region per minute per region' of service 'containerfilesystem.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'." layer_id="sha256:1234567890" module=gcfs_backend offset=0 path=etc/passwd size=4096

Este error indica que el proyecto ha superado la cuota necesaria para leer archivos del servicio del sistema de archivos del contenedor remoto. Para solucionar este problema, solicite un ajuste de cuota para aumentar los siguientes valores de cuota:

  • Solicitudes de contenido por proyecto, región y minuto
  • Solicitudes de contenido por proyecto y región

GKE descarga la imagen sin transmitir los datos

Las imágenes de contenedor que usan claves de cifrado gestionadas por el cliente (CMEK) solo se pueden usar con la transmisión de imágenes en la versión 1.25.3-gke.1000 o posterior de GKE. Las imágenes de contenedor con capas duplicadas no se pueden usar con el streaming de imágenes. Consulta las limitaciones para obtener más información.

Comprobar si hay capas vacías o duplicadas

Para comprobar si la imagen de contenedor tiene capas vacías o duplicadas, ejecuta el siguiente comando:

docker inspect IMAGE_NAME

Sustituye IMAGE_NAME por el nombre de la imagen del contenedor.

En el resultado del comando, inspecciona las entradas de "Layers".

Si una de las entradas coincide exactamente con el siguiente"sha256" resultado, la imagen del contenedor tiene una capa vacía y no cumple los requisitos para usar la transmisión de imágenes.

"Layers": [
  ...
  "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4",
  ...
]

Si hay entradas duplicadas, como en el ejemplo siguiente, la imagen del contenedor tiene capas duplicadas y no cumple los requisitos para el streaming de imágenes.

"Layers": [
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
  "sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
  ...
]

Los comandos mv y las llamadas al sistema renameat2 fallan en archivos de enlaces simbólicos

En los nodos de GKE que ejecutan la versión 1.25 y posteriores, cuando se habilita la transmisión de imágenes, es posible que el comando mv y la llamada al sistema renameat2 fallen en los archivos de enlaces simbólicos de las imágenes de contenedor con el mensaje de error "No such device or address" (No se ha encontrado ningún dispositivo o dirección). El problema se debe a una regresión en los kernels de Linux recientes.

Estas llamadas al sistema no son habituales, por lo que la mayoría de las imágenes no se ven afectadas por este problema. El problema suele producirse en las fases de inicialización del contenedor cuando se está preparando una aplicación para ejecutarse y mover archivos. No es posible probar la imagen de forma local, por lo que GKE recomienda usar la transmisión de imágenes en entornos de prueba para detectar el problema antes de que se utilice la imagen en producción.

La corrección está disponible en las siguientes versiones de parche de GKE:

  • 1.25: 1.25.14-gke.1351000 y versiones posteriores
  • 1.26: 1.26.9-gke.1345000 y versiones posteriores
  • 1.27: 1.27.6-gke.100 y versiones posteriores
  • 1.28: 1.28.1-gke.1157000 y versiones posteriores

También puedes probar a sustituir el código que lleva a la llamada al sistema renameat2 para mitigar este problema en las cargas de trabajo afectadas. Si no puedes modificar el código, debes inhabilitar la transmisión de imágenes en el grupo de nodos para mitigar el problema.