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.
Los clústeres nuevos de Autopilot que ejecutan la versión 1.25.5-gke.1000 y posteriores de GKE usan la transmisión de imágenes de forma automática para extraer imágenes aptas. Las instrucciones de esta página solo se aplican a los clústeres estándar.
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
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. Sin la transmisión de imágenes, GKE descarga la imagen de contenedor completa en cada nodo y la usa como sistema de archivos raíz para 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.
Requisitos
Debes cumplir con los siguientes requisitos para usar la transmisión de imágenes en los clústeres de GKE Autopilot y Standard:
Debes habilitar la API del sistema de archivos de contenedor.
Los clústeres Autopilot nuevos deben ejecutar la versión 1.25.5-gke.1000 o posterior de GKE para que la transmisión de imágenes se habilite automáticamente. Para obtener instrucciones, consulta Configura la versión y el canal de versiones de un clúster de Autopilot nuevo.
Los clústeres nuevos y existentes de GKE Standard deben ejecutar la versión 1.18.6-gke.4801 o una posterior.
Debes usar Container-Optimized OS con la imagen de nodo containerd. Los nodos de Autopilot siempre usan esta imagen de nodo.
Tus imágenes de contenedor se deben almacenar en Artifact Registry.
Si usas clústeres privados, debes habilitar el Acceso privado a Google en la subred para que tus nodos accedan al servicio de transmisión de imágenes.
Si los Controles del servicio de VPC protegen las imágenes de contenedor y usas la transmisión de imágenes, también debes incluir la API de transmisión de imágenes (
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 Consumidor de Service Usage (
roles/serviceusage.serviceUsageConsumer
) de IAM en el proyecto que aloja la imagen de contenedor.
Limitaciones
- No puedes usar un secreto para extraer imágenes de contenedor en las versiones de GKE anteriores a la 1.23.5-gke.1900.
- 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) son aptas para la transmisión de imágenes en la versión 1.25.3-gke.1000 o posteriores de GKE. En versiones anteriores, 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.
- No se admiten imágenes de contenedor con capas duplicadas. GKE descarga estas imágenes sin transmitir los datos. Revisa la imagen de contenedor en busca de capas vacías o duplicadas.
- El repositorio de Artifact Registry debe estar en la misma región que tus nodos de GKE o en una multirregión que corresponda a la región en la que se ejecutan los nodos. Por ejemplo:
- Si tus nodos están en
us-east1
, la transmisión de imágenes está disponible para los repositorios en la regiónus-east1
o la multirregiónus
, ya que GKE y Artifact Registry se ejecutan en ubicaciones de centros de datos en EE.UU. - Si tus nodos están en la región
northamerica-northeast1
, se ejecutan en Canadá. En este caso, la transmisión de imágenes solo está disponible para repositorios en la misma región.
- Si tus nodos están en
- 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.
- Los clústeres de GKE Standard usan 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 funciones de archivos de Linux, como
CAP_NET_RAW
, son compatibles con la transmisión de imágenes en la versión 1.22.6-gke.300 y posteriores de GKE. En versiones anteriores de GKE, estas funciones no están disponibles cuando se transmite el archivo de imagen ni cuando se guarda la imagen en el disco local. A fin de evitar posibles interrupciones, no uses la transmisión de imágenes para contenedores con estas funciones en versiones de GKE anteriores a la 1.22.6-gke.300. Si el contenedor depende de las capacidades de los archivos de Linux, es posible que falle su inicio con errores de permiso denegado cuando se ejecuta con la transmisión de imágenes habilitada.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta
gcloud components update
para obtener la versión más reciente.
Habilita la API del sistema de archivos de contenedor.
Habilita la transmisión de imágenes en clústeres
Puedes habilitar la transmisión de imágenes en clústeres Standard nuevos o existentes mediante la marca --enable-image-streaming
de la CLI de gcloud o con la consola de Google Cloud. 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.
Todos los clústeres nuevos de Autopilot que ejecutan la versión 1.25.5-gke.1000 de GKE y versiones posteriores usan la transmisión de imágenes para extraer imágenes aptas. Para obtener instrucciones, consulta Configura la versión y el canal de versiones de un clúster de Autopilot nuevo. Las siguientes instrucciones solo se aplican a los clústeres de GKE Standard.
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 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
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en add_box Crear.
En la sección GKE Standard, haz clic en Configurar.
En el panel de navegación, en Clúster, haz clic en Funciones.
En la sección Otro, selecciona la casilla de verificación Habilitar la transmisión de imágenes.
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 CLI de gcloud o la consola de Google Cloud.
gcloud
A fin de actualizar un clúster existente para usar la transmisión de imágenes, ejecuta el siguiente comando mediante la CLI de gcloud:
gcloud container clusters update CLUSTER_NAME \
--enable-image-streaming
Console
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En la página Clústeres, en la sección Funciones, haz clic en edit junto a Transmisión de imágenes.
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.
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.
Verifica que la transmisión de imágenes esté habilitada en un clúster
Puedes verificar si la transmisión de imágenes está habilitada a nivel del clúster mediante la CLI de gcloud o la consola de Google Cloud.
gcloud
Ejecuta el comando siguiente:
gcloud container clusters describe CLUSTER_NAME \
--flatten "nodePoolDefaults.nodeConfigDefaults"
La configuración está habilitada si el resultado es similar al siguiente:
gcfsConfig:
enabled: true
...
La configuración está inhabilitada si el resultado es similar al siguiente:
gcfsConfig: {}
...
Console
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En la página Clústeres, en la sección Funciones, junto a Transmisión de imágenes, se mostrará si la configuración está habilitada.
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 CLI 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
Verifica que la transmisión de imágenes esté habilitada en un grupo de nodos
Verifica si la transmisión de imágenes está habilitada para un grupo de nodos:
gcloud container node-pools describe POOL_NAME \
--cluster=CLUSTER_NAME \
La configuración está habilitada si el resultado es similar al siguiente:
gcfsConfig:
enabled: true
...
La configuración está inhabilitada si el resultado es similar al siguiente:
gcfsConfig: {}
...
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. En GKE Standard, 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.
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"
Obtén credenciales para el clúster:
gcloud container clusters get-credentials CLUSTER_NAME \ --zone=COMPUTE_ZONE
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.Aplica el manifiesto al clúster:
kubectl apply -f frontend-deployment.yaml
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
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.
- En el evento
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.
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"
Obtén credenciales para el clúster:
gcloud container clusters get-credentials CLUSTER2_NAME \ --zone=COMPUTE_ZONE
Implementa el Deployment de
frontend
del ejemplo anterior:kubectl apply -f frontend-deployment.yaml
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.
Realiza una limpieza
Para evitar cargos, borra los clústeres que creaste en los ejemplos anteriores:
gcloud container clusters delete CLUSTER_NAME CLUSTER2_NAME
Inhabilita la transmisión de imágenes
Si usas GKE Autopilot, no puedes inhabilitar la transmisión de imágenes en clústeres individuales. Puedes inhabilitar la API del sistema de archivos de contenedor, que inhabilita la transmisión de imágenes para todo el proyecto.
Si usas clústeres de GKE Standard, puedes inhabilitar la transmisión de imágenes en clústeres individuales o grupos de nodos específicos, como se describe en las siguientes secciones.
Inhabilita la transmisión de imágenes en un clúster de GKE Standard
Puedes inhabilitar la transmisión de imágenes en clústeres de GKE Standard existentes mediante la CLI de gcloud o la consola de Google Cloud.
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
Ve a la página de Google Kubernetes Engine en la consola de Google Cloud.
Haz clic en el nombre del clúster que deseas modificar.
En la página Clústeres, en Funciones, haz clic en edit junto a Transmisión de imágenes.
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.
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
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. En los clústeres de GKE Standard, esta reserva cambia los recursos de memoria disponibles para que solicites en tus Pods. En GKE Autopilot, GKE administra las asignaciones del sistema, por lo que no hay impacto en la programación de tus cargas de trabajo.
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 para las reservas nuevas:
- No hay una memoria adicional para las máquinas con menos de 1 GiB de memoria
- Un 1% de los primeros 4 GiB de memoria
- Un 0.8% de los siguientes 4 GiB de memoria (hasta 8 GiB)
- Un 0.4% de los siguientes 8 GiB de memoria (hasta 16 GiB)
- Un 0.24% de los siguientes 112 GiB de memoria (hasta 128 GiB)
- Un 0.08% de cualquier memoria por encima de 128 GiB
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 revisas los registros del servicio de transmisión de imágenes (llamado gcfsd
):
Ve al Explorador de registros en la consola de Google Cloud:
En el campo Consulta, ingresa la siguiente consulta:
logName="projects/PROJECT_ID/logs/gcfsd" resource.labels.cluster_name="CLUSTER_NAME"
Reemplaza lo siguiente:
PROJECT_ID
: el nombre del proyecto.CLUSTER_NAME
: Es el nombre del clúster.
Haga clic en Ejecutar consulta.
También puedes verificar los registros gcfsd
con el explorador de registros:
Ve al Explorador de registros en la consola de Google Cloud:
En el campo Consulta, ingresa la siguiente consulta:
logName="projects/PROJECT_ID/logs/gcfsd"
Reemplaza
PROJECT_ID
por el ID del proyecto de Google Cloud.
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.
backend.FileContent failed
El siguiente error puede aparecer cuando se leen archivos de contenedor con la transmisión 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 superó la cuota necesaria para leer archivos del servicio de sistema de archivos del contenedor remoto. Para resolver este problema, aumenta las siguientes cuotas:
- Solicitudes de contenido por proyecto por región por minuto por región
- Solicitudes de contenido por proyecto por región
GKE descarga la imagen sin transmitir los datos.
Las imágenes de contenedor que usan claves de encriptación administradas por el cliente (CMEK) solo son aptas para 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 son aptas para la transmisión de imágenes. Consulta las Limitaciones para obtener más información.
Comprueba si hay capas vacías o duplicadas
Para verificar la imagen del contenedor en busca de capas vacías o duplicadas, ejecuta el siguiente comando:
docker inspect IMAGE_NAME
Reemplaza IMAGE_NAME
por el nombre de la imagen de contenedor.
En el resultado del comando, inspecciona las entradas bajo "Layers"
.
Si una de las entradas coincide con exactitud con el siguiente resultado "sha256"
, la imagen de contenedor tiene una capa vacía y no es apta para la transmisión de imágenes.
"Layers": [ ... "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4", ... ]
Si hay entradas duplicadas, como en el siguiente ejemplo, la imagen de contenedor tiene capas duplicadas y no es apta para la transmisión de imágenes.
"Layers": [
"sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
...
"sha256:28699c71935fe3ffa56533db44ad93e5a30322639f7be70d5d614e06a1ae6d9b",
...
]
El comando mv
y las llamadas al sistema renameat2
fallan en los archivos symlink
Para los nodos de GKE que ejecutan la versión 1.25 y otras posteriores, cuando la transmisión de imágenes está habilitada, el comando mv
y la llamada al sistema renameat2
pueden fallar en archivos symlink de imágenes de contenedor con el mensaje de error “No existe el dispositivo o la dirección”. El problema se debe a una regresión en kernels de Linux recientes.
Estas llamadas al sistema no son comunes, por lo que la mayoría de las imágenes no se ven afectadas por este problema. Por lo general, el problema ocurre en las etapas de inicialización del contenedor, cuando una aplicación se prepara para ejecutarse y moverse por los 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 encontrar el problema antes de usar 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
De forma alternativa, para mitigar este problema en las cargas de trabajo afectadas, puedes intentar reemplazar el código que conduce a la llamada al sistema renameat2
. Si no puedes modificar el código, debes inhabilitar la transmisión de imágenes en el grupo de nodos para mitigar el problema.