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.
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
.
Habilita la API Container File System.
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
- En la Google Cloud consola, ve a la página Crear un clúster de Kubernetes.
- En el panel de navegación, ve a Clúster y haz clic en Funciones.
- En la sección Otro, selecciona la casilla Habilitar streaming de imágenes.
- 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
Ve a la página Google Kubernetes Engine en la Google Cloud consola.
Haz clic en el nombre del clúster que quieras modificar.
En la página Clusters (Clusters), en la sección Features (Funciones), haz clic en edit junto a Image streaming (Streaming de imágenes).
En el cuadro de diálogo Editar streaming de imágenes, selecciona la casilla Habilitar streaming de imágenes.
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
Ve a la página Google Kubernetes Engine en la Google Cloud consola.
Haz clic en el nombre del clúster que quieras consultar.
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.
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"
Obtén las credenciales del clúster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
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.Aplica el manifiesto a tu clúster:
kubectl apply -f frontend-deployment.yaml
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
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.
- El evento
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.
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"
Obtén las credenciales del clúster:
gcloud container clusters get-credentials CLUSTER2_NAME \ --location=CONTROL_PLANE_LOCATION
Despliega el
frontend
Deployment del ejemplo anterior:kubectl apply -f frontend-deployment.yaml
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
Ve a la página Google Kubernetes Engine en la Google Cloud consola.
Haz clic en el nombre del clúster que quieras modificar.
En la página Clusters (Clusters), vaya a Features (Funciones) y haga clic en edit junto a Image streaming (Streaming de imágenes).
En el cuadro de diálogo Editar streaming de imágenes, desmarca la casilla Habilitar streaming de imágenes.
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
):
Ve a la página Explorador de registros de la Google Cloud consola:
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.
Haz clic en Realizar una consulta.
También puedes consultar los registros de gcfsd
con el Explorador de registros:
Ve al Explorador de registros de la Google Cloud consola:
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.