Cómo solucionar problemas relacionados con la extracción de imágenes


En esta página, se muestra cómo resolver problemas con el proceso de extracción de imágenes en Google Kubernetes Engine (GKE). Si usas la transmisión de imágenes, consulta Cómo solucionar problemas de transmisión de imágenes para obtener sugerencias. En esta página, se describen las extracciones de imágenes estándar.

Esta página está dirigida a los desarrolladores de aplicaciones que desean asegurarse de que sus apps se implementen correctamente y a los administradores y operadores de la plataforma que desean comprender la causa raíz de las fallas de extracción de imágenes y verificar la configuración de la plataforma. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Tareas y roles comunes de los usuarios de GKE Enterprise.

El proceso de extracción de imágenes es la forma en que Kubernetes y, por lo tanto, GKE, recuperan imágenes de contenedores de un registro. Cuando falla una extracción de imágenes, es posible que notes lentitud en la app o que esta no funcione en absoluto.

Para determinar si las extracciones de imágenes son la causa de que tu app no funcione, esta página te ayuda a diagnosticar la falla de extracción de imágenes encontrando y entendiendo los mensajes de error relevantes. Luego, aprenderás a abordar las siguientes causas comunes de fallas de extracción de imágenes:

  • Configuración de autenticación: Tu clúster no tiene los permisos necesarios para acceder al registro de imágenes de contenedores.
  • Conectividad de red: Tu clúster no puede conectarse al registro debido a problemas de DNS, reglas de firewall o falta de acceso a Internet en clústeres que usan aislamiento de red.
  • No se encontró la imagen en el registro: El nombre o la etiqueta de la imagen especificados son incorrectos, se borró la imagen o el registro no está disponible.
  • Limitaciones de rendimiento: El tamaño grande de la imagen, la E/S lenta del disco o la congestión de la red pueden provocar extracciones lentas o tiempos de espera.
  • Arquitectura de imagen incompatible: La imagen se compiló para una arquitectura de CPU diferente a la de tu grupo de nodos de GKE.
  • Versiones de esquemas incompatibles: Es posible que uses containerd 2.0 o una versión posterior con un esquema de Docker v1, que no es compatible.

Si ya viste un mensaje de evento específico, búscalo en esta página y sigue los pasos para solucionar problemas que se indican. Si no ves un mensaje, revisa las siguientes secciones en orden. Si el problema persiste, comunícate con Atención al cliente de Cloud.

Información sobre las extracciones de imágenes

Antes de comenzar a solucionar el problema, es útil comprender un poco más sobre el ciclo de vida de una imagen y dónde puedes alojarlas.

Ciclo de vida de la imagen

Cuando creas un Pod, kubelet recibe la definición del Pod, que incluye la especificación de la imagen. El kubelet necesita esta imagen para poder ejecutar un contenedor basado en ella. Antes de extraer la imagen, kubelet verifica el tiempo de ejecución del contenedor para ver si la imagen está presente. Kubelet también verifica la política de extracción de imágenes del pod. Si la imagen no está en la caché del entorno de ejecución del contenedor o si la política de extracción de imágenes lo requiere, kubelet dirige al entorno de ejecución del contenedor (containerd) para que extraiga la imagen especificada del registro. Si no se puede extraer la imagen, no se iniciará el contenedor del pod.

Después de extraer una imagen correctamente, el entorno de ejecución del contenedor descomprime la imagen para crear un sistema de archivos base de solo lectura para el contenedor. El entorno de ejecución del contenedor almacena esta imagen, que permanece presente mientras los contenedores en ejecución la referencian. Si ningún contenedor en ejecución hace referencia a una imagen, esta se vuelve apta para la recolección de elementos no utilizados y, con el tiempo, kubelet la quita.

Opciones de hosting de imágenes

Te recomendamos que uses una de las siguientes opciones para alojar tus imágenes:

  • Artifact Registry: Es el administrador de paquetes completamente administrado de Google. Artifact Registry se integra estrechamente con otros servicios de Google Cloud y ofrece un control de acceso detallado. Para obtener más información, consulta Cómo trabajar con imágenes de contenedor en la documentación de Artifact Registry.

  • Registro autoalojado: Un registro autoalojado te ofrece más control, pero también requiere que lo administres. Considera esta opción si tienes necesidades específicas de cumplimiento o seguridad que Artifact Registry no puede satisfacer.

Diagnostica la falla de extracción de imágenes

Para diagnosticar fallas de extracción de imágenes, realiza las investigaciones que se detallan en las siguientes secciones:

  1. Consulta el estado y los eventos del Pod.
  2. Comprende el significado de los estados.
  3. Usa los mensajes de eventos para encontrar la causa de la falla de extracción de imágenes.
  4. Visualiza los registros del Explorador de registros.

Cómo ver el estado y los eventos del Pod

Para ayudarte a verificar que se produjo un error de extracción de imagen, GKE registra los siguientes estados de los pods:

  • ImagePullBackOff
  • ErrImagePull
  • ImageInspectError
  • InvalidImageName
  • RegistryUnavailable
  • SignatureValidationFailed

ImagePullBackOff y ErrImagePull son los más comunes de estos estados.

Además de estos estados, los eventos de Kubernetes te ayudan a encontrar la causa de las fallas de extracción de imágenes.

Para confirmar si la extracción de imágenes falla, busca mensajes de estado y, luego, lee los mensajes de eventos seleccionando una de las siguientes opciones:

Console

Completa los siguientes pasos:

  1. En la consola de Google Cloud, ve a la página Cargas de trabajo (Workloads).

    Ir a Cargas de trabajo

  2. Elige la carga de trabajo que deseas investigar. Si no estás seguro de cuál es la carga de trabajo que debes examinar, revisa la columna Estado. Esta columna indica qué cargas de trabajo tienen problemas.

  3. En la página Detalles de la carga de trabajo, busca la sección Pods administrados y haz clic en el nombre del Pod con un estado que indique una falla de extracción de imagen.

  4. En la página Detalles del Pod, haz clic en la pestaña Eventos.

  5. Revisa la información en la tabla. En la columna Mensaje, se enumeran los eventos de Kubernetes, que muestran más información sobre las extracciones de imágenes que fallaron. En la columna Motivo, se indica el estado del pod.

kubectl

Completa los siguientes pasos:

  1. Consulta el estado de tus Pods:

    kubectl get pods -n NAMESPACE
    

    Reemplaza NAMESPACE por el espacio de nombres en el que se ejecutan tus Pods.

    El resultado es similar a este:

    NAME         READY   STATUS       RESTARTS      AGE
    POD_NAME_1   2/2     Running      0             7d5h
    POD_NAME_2   0/1     ErrImagePull 0             7d5h
    

    La columna Status indica qué Pods experimentaron una falla de extracción de imagen.

  2. Consulta los eventos de los pods con errores de extracción de imágenes:

    kubectl describe POD_NAME -n NAMESPACE
    

    Reemplaza POD_NAME por el nombre del Pod que identificaste en el paso anterior.

    La sección Events muestra más información sobre lo que sucedió durante cualquier extracción de imágenes fallida.

    El resultado es similar a este:

    ...
    Events:
      Type    Reason    Age               From           Message
      ----    ------    ----              ----           -------
      Warning  Failed   5m (x4 over 7m)   kubelet, NODE  Failed to pull image "IMAGE_ADDRESS": rpc error: code = Unknown desc = Error response from daemon: repository IMAGE_ADDRESS not found
      Warning  Failed   5m (x4 over 7m)   kubelet, NODE  Error: ErrImagePull
      Normal   BackOff  5m (x6 over 7m)   kubelet, NODE  Back-off pulling image "IMAGE_ADDRESS"
      Warning  Failed   2m (x20 over 7m)  kubelet, NODE  Error: ImagePullBackOff
    

    En este resultado, IMAGE_ADDRESS es la dirección completa de la imagen. Por ejemplo, us-west1-docker.pkg.dev/my-project/my-repo/test:staging

Significado de los estados

Para comprender mejor el significado de los diferentes estados, consulta las siguientes descripciones:

  • ImagePullBackOff: kubelet no pudo extraer la imagen, pero seguirá intentándolo con una demora creciente (o tiempo de espera) de hasta cinco minutos.
  • ErrImagePull: Un error general irrecuperable durante el proceso de extracción de imágenes.
  • ImageInspectError: El entorno de ejecución del contenedor encontró un problema cuando intentaba inspeccionar la imagen del contenedor.
  • InvalidImageName: El nombre de la imagen del contenedor especificada en la definición del Pod no es válido.
  • RegistryUnavailable: No se puede acceder al registro. Por lo general, se trata de un problema de conectividad de red.
  • SignatureValidationFailed: No se pudo verificar la firma digital de la imagen del contenedor.

Usa mensajes de eventos para encontrar la causa de la falla de extracción de imágenes

En la siguiente tabla, se enumeran los mensajes de eventos relacionados con fallas de extracción de imágenes y los pasos para solucionar problemas que debes seguir si encuentras uno de estos mensajes.

Los mensajes relacionados con fallas en la recuperación de imágenes suelen tener el siguiente prefijo:

Failed to pull image "IMAGE_ADDRESS": rpc error: code = CODE = failed to pull and unpack image "IMAGE_ADDRESS": failed to resolve reference "IMAGE_ADDRESS":

Este mensaje incluye los siguientes valores:

  • IMAGE_ADDRESS: Es la dirección completa de la imagen. Por ejemplo, us-west1-docker.pkg.dev/my-project/my-repo/test:staging.
  • CODE: Un código de error asociado con el mensaje de registro. Por ejemplo, NotFoundUnknown.

Algunas causas de fallas de extracción de imágenes no tienen un mensaje de evento relacionado. Si no ves ninguno de los mensajes de eventos en la siguiente tabla, pero sigues teniendo problemas para extraer imágenes, te recomendamos que sigas leyendo el resto de la página.

Mensaje del evento Solución de problemas detallada
Autenticación
  • Failed to authorize: failed to fetch oauth token: unexpected status: 403 Forbidden
  • Pulling from host HOST_NAME failed with status code: 403 Forbidden
  • Unexpected status code [manifests 1.0]: 401 Unauthorized

Conectividad de red
  • Failed to do request: Head "IMAGE_ADDRESS": dial tcp: lookup gcr.io on REGISTRY_IP_ADDRESS: server misbehaving
  • Failed to start Download and install k8s binaries and configurations
  • Failed to do request: Head "IMAGE_ADDRESS": dial tcp REGISTRY_IP_ADDRESS: i/o timeout
No se encontró la imagen
  • "IMAGE_ADDRESS": not found
  • Failed to copy: httpReadSeeker: failed open: could not fetch content descriptor sha256:SHA_HASH (application/vnd.docker.container.image.v1+json) from remote: not found
Tiempo de espera de la imagen
  • Unknown desc = context canceled
Esquema incompatible
  • Failed to get converter for "IMAGE_ADDRESS": Pulling Schema 1 images have been deprecated and disabled by default since containerd v2.0. As a workaround you may set an environment variable `CONTAINERD_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1`, but this will be completely removed in containerd v2.1.

Cómo ver los registros del Explorador de registros

Para examinar los eventos históricos de extracción de imágenes o correlacionar las fallas de extracción de imágenes con la actividad de otros componentes, consulta los registros con el Explorador de registros:

  1. En la consola de Google Cloud, ve a la página Explorador de registros.

    Ir al Explorador de registros

  2. En el panel de consultas, ingresa la siguiente consulta:

    log_id("events")
    resource.type="k8s_pod"
    resource.labels.cluster_name="CLUSTER_NAME"
    jsonPayload.message=~"Failed to pull image"
    

    Reemplaza CLUSTER_NAME por el nombre del clúster en el que se ejecuta el pod con errores de extracción de imágenes.

  3. Haz clic en Ejecutar consulta y revisa los resultados.

Investiga la configuración de autenticación

En las siguientes secciones, encontrarás ayuda para verificar que tu entorno de GKE tenga la configuración de autenticación adecuada para extraer imágenes del repositorio.

Para verificar si tienes problemas de autenticación que causan un problema de extracción de imágenes, realiza las investigaciones que se detallan en las siguientes secciones:

  1. Verifica el acceso a la imagen.
  2. Verifica la configuración de imagePullSecret y la especificación de Deployment.
  3. Verifica el permiso de acceso del nodo para el repositorio privado de Artifact Registry
  4. Verifica la configuración de los Controles del servicio de VPC para acceder a Artifact Registry.

Verifica el acceso a la imagen

Si encuentras un error de extracción de imágenes 403 Forbidden, verifica que los componentes necesarios puedan acceder a la imagen del contenedor.

El método para verificar y aplicar los roles necesarios para otorgar el acceso requerido difiere según el tipo de repositorio que almacene tus imágenes. Para verificar y otorgar acceso, selecciona una de las siguientes opciones:

Artifact Registry

Si usas un imagePullSecret, la cuenta de servicio vinculada con el secreto necesita permiso de lectura en el repositorio. De lo contrario, la cuenta de servicio del grupo de nodos necesitará permiso.

  1. Sigue las instrucciones de la documentación de IAM para ver los roles asignados a tu cuenta de servicio.
  2. Si tu cuenta de servicio no tiene el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader), otórgalo:

    gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAMEREPOSITORY_LOCATION \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
        --role="roles/artifactregistry.reader"
    

    Reemplaza lo siguiente:

    • REPOSITORY_NAME: Es el nombre de tu repositorio de Artifact Registry.
    • REPOSITORY_LOCATION: Es la región de tu repositorio de Artifact Registry.
    • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio requerida Si no conoces la dirección, usa el comando gcloud iam service-accounts list para enumerar todas las direcciones de correo electrónico de la cuenta de servicio de tu proyecto.

Container Registry

Si usas un imagePullSecret, la cuenta de servicio vinculada con el secreto necesita permiso de lectura en el repositorio. De lo contrario, la cuenta de servicio del grupo de nodos necesitará permiso.

  1. Sigue las instrucciones de la documentación de IAM para ver los roles asignados a tu cuenta de servicio.
  2. Si tu cuenta de servicio no tiene el rol de IAM Visualizador de objetos de almacenamiento (roles/storage.objectViewer), otórgalo para que la cuenta de servicio pueda leer del bucket:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
        --role=roles/storage.objectViewer
    

    Reemplaza lo siguiente:

    • SERVICE_ACCOUNT_EMAIL: Es el correo electrónico de la cuenta de servicio requerida. Puedes enumerar todas las cuentas de servicio de tu proyecto mediante el comando gcloud iam service-accounts list.
    • BUCKET_NAME: es el nombre del bucket de Cloud Storage que contiene tus imágenes. Puedes enumerar todos los buckets de tu proyecto con el comando gcloud storage ls.

Si tu administrador de registros configuró repositorios de gcr.io en Artifact Registry para almacenar imágenes del dominio gcr.io en lugar de Container Registry, debes otorgar acceso de lectura a Artifact Registry en lugar de Container Registry.

Registro autoalojado

Según cómo hayas configurado tu registro alojado, es posible que necesites claves, certificados o ambos para acceder a la imagen.

Si usas claves, usa un imagePullSecret. Los imagePullSecrets son una forma segura de proporcionarle a tu clúster las credenciales que necesita para acceder a un registro alojado por sí mismo. Para ver un ejemplo que te muestre cómo configurar un ImagePullSecret, consulta Extrae una imagen desde un registro privado en la documentación de Kubernetes.

Para proteger la conexión HTTPS a tu registro, es posible que también necesites certificados, que verifican la integridad de la conexión al servidor remoto. Te recomendamos que uses Secret Manager para administrar tu propia AC autofirmada. Para obtener más información, consulta Accede a registros privados con certificados de la AC privados.

Verifica la configuración de imagePullSecret y la especificación de Deployment

Si usas un imagePullSecret, asegúrate de haber creado un secreto que contenga las credenciales de autenticación para extraer imágenes y de que todas las implementaciones especifiquen el secreto que definiste. Para obtener más información, consulta Especifica imagePullSecrets en un pod en la documentación de Kubernetes.

Verifica el permiso de acceso del nodo para el repositorio privado de Artifact Registry

Si almacenas la imagen del contenedor en un repositorio privado de Artifact Registry, es posible que tu nodo no tenga el permiso de acceso correcto. Cuando esto suceda, es posible que notes un error de extracción de imágenes 401 Unauthorized.

Para verificar el permiso de acceso y otorgarlo si es necesario, sigue estos pasos:

  1. Identifica el nodo que ejecuta el Pod:

    kubectl describe pod POD_NAME | grep "Node:"
    

    Reemplaza POD_NAME por el nombre del Pod que experimenta una falla de extracción de imagen.

  2. Verifica que el nodo que identificaste en el paso anterior tenga el permiso de almacenamiento correcto:

    gcloud compute instances describe NODE_NAME \
        --zone="COMPUTE_ZONE \
        --format="flattened(serviceAccounts[].scopes)"
    

    Reemplaza lo siguiente:

    • NODE_NAME: Es el nombre del nodo que identificaste en el paso anterior.
    • COMPUTE_ZONE: La zona de Compute Engine a la que pertenece el nodo.

    El resultado debe contener al menos uno de los siguientes permisos de acceso:

    • serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/devstorage.read_only
    • serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/cloud-platform

    Si el nodo no contiene uno de estos permisos, fallará la extracción de imágenes.

  3. Vuelve a crear el grupo de nodos al que pertenece el nodo con permiso suficiente. Debido a que no puedes modificar los nodos existentes, debes volver a crear el nodo con el permiso correcto.

    Te recomendamos que crees el grupo de nodos con el permiso gke-default. Este permiso proporciona acceso a los siguientes permisos:

    • https://www.googleapis.com/auth/devstorage.read_only
    • https://www.googleapis.com/auth/logging.write
    • https://www.googleapis.com/auth/monitoring
    • https://www.googleapis.com/auth/service.management.readonly
    • https://www.googleapis.com/auth/servicecontrol
    • https://www.googleapis.com/auth/trace.append

    Si el permiso gke-default no es adecuado, otorga al grupo de nodos el permiso devstorage.read_only, que permite el acceso solo a los datos de lectura.

    gke-default

    Crea un grupo de nodos con el permiso gke-default:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --scopes="gke-default"
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: el nombre del grupo de nodos nuevo
    • CLUSTER_NAME: Es el nombre del clúster existente.
    • COMPUTE_ZONE: Es la zona de Compute Engine a la que debe pertenecer el nuevo grupo de nodos.

    devstorage.read_only

    Crea un grupo de nodos con el permiso devstorage.read_only:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --zone=COMPUTE_ZONE \
        --scopes="https://www.googleapis.com/auth/devstorage.read_only"
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: el nombre del grupo de nodos nuevo
    • CLUSTER_NAME: Es el nombre del clúster existente.
    • COMPUTE_ZONE: Es la zona de Compute Engine a la que debe pertenecer el nuevo grupo de nodos.

Verifica la configuración de los Controles del servicio de VPC para acceder a Artifact Registry

Si usas los Controles del servicio de VPC, asegúrate de que los perímetros de servicio permitan el acceso a Artifact Registry. Para obtener más información, consulta Cómo proteger los repositorios en un perímetro de servicio en la documentación de Artifact Registry.

Investiga la conectividad de red

Durante la extracción de una imagen, la conectividad de red puede impedir que se complete el proceso.

Para verificar si los problemas de conectividad de red están causando un problema de extracción de imágenes, realiza las investigaciones que se detallan en las siguientes secciones:

  1. Investiga la resolución de DNS.
  2. Investiga la configuración de tu firewall.
  3. Investiga la conectividad a Internet de los extremos del registro externo.
  4. Investiga si la conexión a las APIs de Google se agota.

Investiga la resolución de DNS

Si ves un error de extracción de imagen server misbehaving, es posible que la resolución de DNS sea la causa de la falla.

Para investigar los problemas con la resolución de DNS, prueba las siguientes soluciones:

  1. Soluciona problemas del servidor de metadatos. El servidor de metadatos del nodo resuelve todas las consultas de DNS. Cualquier problema que involucre a este servidor puede interrumpir la resolución de nombres, lo que impide la conexión al repositorio y hace que falle la extracción de imágenes.
  2. Si usas Cloud DNS para la resolución de DNS, asegúrate de que tus zonas privadas administradas, zonas de reenvío, zonas de intercambio de tráfico y políticas de respuesta de Cloud DNS estén configuradas correctamente. Los errores de configuración en estas áreas pueden interrumpir la resolución de DNS. Para obtener más información sobre Cloud DNS, consulta Usa Cloud DNS para GKE. Si deseas obtener sugerencias para solucionar problemas de Cloud DNS en GKE, consulta Solución de problemas de Cloud DNS en GKE.
  3. Si usas kube-dns para la resolución de DNS, asegúrate de que funcione correctamente. Si necesitas ayuda para solucionar problemas de kube-dns, consulta Soluciona problemas de kube-dns en GKE.
  4. Si los nodos del clúster no tienen direcciones IP externas (lo que es habitual si usas aislamiento de red), habilita el Acceso privado a Google en la subred que usa el clúster y asegúrate de cumplir con los requisitos de red. Si usas Cloud NAT,Google Cloud habilita el Acceso privado a Google automáticamente.

Investiga la configuración de tu firewall

Cuando un problema con el firewall hace que falle la extracción de imágenes, es posible que veas el siguiente mensaje de error:

Failed to start Download and install k8s binaries and configurations

Diagnostica problemas con el firewall

Si usas un clúster estándar y quieres confirmar si un problema con el firewall está causando problemas con la extracción de imágenes, sigue estos pasos:

  1. Usa SSH para conectarte al nodo que tiene problemas:

    gcloud compute ssh NODE_NAME --zone=ZONE_NAME
    

    Reemplaza lo siguiente:

  2. Envía los registros más recientes de los servicios kube-node-installation.service y kube-node-configuration.service a archivos de texto llamados kube-node-installation_status.txt y kube-node-configuration_status.txt:

    systemctl status kube-node-installation.service > kube-node-installation_status.txt
    systemctl status kube-node-configuration.service > kube-node-configuration_status.txt
    

    Si estos registros no incluyen información del momento en que falló la extracción de imágenes, genera una copia completa de los registros:

    sudo journalctl -u kube-node-installation.service > kube-node-installation_logs.txt
    sudo journalctl -u kube-node-configuration.service > kube-node-configuration_logs.txt
    
  3. Revisa el contenido de los archivos kube-node-installation_status.txt y kube-node-configuration_status.txt. Si ves i/o timeout en el resultado, es probable que el problema esté relacionado con el firewall.

Cómo resolver problemas con la configuración del firewall

Para resolver problemas con el firewall, prueba las siguientes soluciones:

  1. Identifica y resuelve las reglas de firewall que bloquean el tráfico de red. Por ejemplo, puedes tener una regla que bloquee el tráfico al registro que almacena tu imagen.

    1. Accede a los registros de flujo de VPC:

      1. En la consola de Google Cloud, ve a la página Explorador de registros.

        Ir al Explorador de registros

      2. En el panel de consultas, ingresa la siguiente consulta:

        resource.type="gce_subnetwork"
        logName="projects/PROJECT_ID/logs/[compute.googleapis.com%2Fvpc_flows](http://compute.googleapis.com%2Fvpc_flows)"
        resource.labels.subnetwork_name="SUBNET_NAME",
        

        Reemplaza lo siguiente:

        • PROJECT_ID: El ID del proyecto de Google Cloud.
        • SUBNET_NAME: Es el nombre de tu subred.

        Para obtener más información, consulta Cómo acceder a los registros de flujo con consultas en la documentación de VPC.

    2. Si encuentras reglas de firewall que bloquean el tráfico necesario, actualízalas.

  2. Si los nodos del clúster no tienen direcciones IP externas (lo que es habitual si usas aislamiento de red), habilita el Acceso privado a Google en la subred que usa el clúster y asegúrate de cumplir con los requisitos de red. Si usas Cloud NAT,Google Cloud habilita el Acceso privado a Google automáticamente.

Investiga la conectividad a Internet de los extremos de registro externos

Si la configuración de tu red dirige el tráfico a través de un extremo de registro externo, es posible que ese extremo no tenga conectividad a Internet. Cuando el extremo no tiene acceso, es posible que la extracción de imágenes falle y veas un error de extracción de imágenes i/o timeout.

Para verificar la conectividad de red desde el extremo del registro externo al registro, usa ping o traceroute:

ping REGISTRY_ENDPOINT

O

traceroute REGISTRY_ENDPOINT

Reemplaza REGISTRY_ENDPOINT por el extremo del registro. Este valor puede ser un nombre de host o una dirección IP.

Si encuentras un error con la conectividad, revisa las rutas de VPC:

  1. En la consola de Google Cloud, ve a Rutas.

    Ir a Rutas

  2. Revisa la columna Priority y asegúrate de que la ruta de prioridad más alta vaya a una fuente que tenga acceso al registro. Las rutas con valores más bajos tienen prioridad.

Investiga si se agota el tiempo de espera de la conexión a las APIs de Google

Si usas el aislamiento de red, es posible que experimentes un error en el que se agote el tiempo de espera de la conexión a las APIs y los servicios de Google, lo que genera un error de extracción de imágenes i/o timeout.

Este error ocurre porque tus nodos no pudieron conectarse a una de las siguientes APIs cuando intentaron extraer imágenes del registro:

  • containerregistry.googleapis.com
  • artifactregistry.googleapis.com

Para asegurarte de poder conectarte a las APIs requeridas, prueba las siguientes soluciones:

  1. Habilita el Acceso privado a Google. Los nodos sin direcciones IP externas necesitan el Acceso privado a Google para llegar a las direcciones IP externas de los servicios y las APIs de Google.
  2. Usa un dominio compatible.
  3. Revisa tus políticas de firewall:

    1. En la consola de Google Cloud, ve a Políticas de firewall.

      Ir a Políticas de firewall

    2. Verifica si tienes alguna regla que bloquee el tráfico TCP de salida en el puerto 443 a 199.36.153.4/30, 199.36.153.8/30 o cualquier rango de direcciones IP que use el dominio que elegiste para las APIs y los servicios de Google. Los rangos de direcciones IP 199.36.153.4/30 y 199.36.153.8/30 se usan para el Acceso privado a Google y el Acceso restringido a Google, respectivamente. El tráfico TCP en el puerto 443 a estos rangos es para acceder a los servicios y las APIs de Google.

      Si encuentras alguna de estas reglas, crea una regla de firewall de salida para permitir ese tráfico.

  4. Si usas Artifact Registry, asegúrate de que tu entorno cumpla con los requisitos para usar Artifact Registry con aislamiento de red.

  5. Verifica que las direcciones IP virtuales (VIP) (199.36.153.4/30 o 199.36.153.8/30) tengan rutas de VPC configuradas:

    1. En la consola de Google Cloud, ve a Redes de VPC.

      Ir a las redes de VPC

    2. En la columna Nombre, haz clic en default.

    3. En la página de detalles de la red de VPC, haz clic en la pestaña Rutas.

    4. Revisa la tabla de rutas.

      Si tu red de VPC contiene una ruta predeterminada (destino 0.0.0.0/0 o ::0/0) y el siguiente salto de esa ruta es la puerta de enlace de Internet predeterminada (predeterminada de la red), usa esa ruta para que los VIP accedan a las APIs y los servicios de Google.

      Si reemplazaste una ruta predeterminada por una ruta personalizada cuyo siguiente salto no es la puerta de enlace de Internet predeterminada, cumple con los requisitos de enrutamiento de las APIs y los servicios de Google mediante el enrutamiento personalizado.

Investiga por qué kubelet no puede encontrar tu imagen

Cuando kubelet no puede encontrar tu imagen, es posible que veas un error image not found y experimentes fallas de extracción de imágenes.

Para ayudar a kubelet a encontrar tu imagen, prueba las siguientes soluciones:

  1. Revisa el manifiesto de tu Pod y asegúrate de que el nombre de la imagen y la etiqueta de imagen estén escritos correctamente. Cualquier error ortográfico o de formato hará que falle la extracción de imágenes.
  2. Verifica que la imagen aún exista en el registro en el que la almacenaste. Si la imagen tiene una ruta de registro completa, verifica que exista en el registro de Docker que usas. Si proporcionas solo el nombre de la imagen, verifica el registro de Docker Hub.
  3. Si tu clúster usa aislamiento de red, prueba las siguientes soluciones:
    1. Habilita el Acceso privado a Google.
    2. Verifica que el perímetro del servicio esté configurado correctamente.

Investiga por qué hay tiempos de espera de recuperación de imágenes o recuperaciones de imágenes lentas

Si usas una imagen muy grande para tu carga de trabajo de GKE, es posible que se agote el tiempo de espera de la extracción de imágenes y se genere un error context cancelled. Si bien las imágenes no tienen un límite de tamaño definido, el error context cancelled suele indicar que el tamaño de la imagen es la causa.

También es posible que notes extracciones de imágenes que no fallan, pero que tardan mucho más de lo habitual. Si deseas tener un modelo de referencia de tus tiempos de extracción de imágenes normales, revisa la entrada de registro Successfully pulled image. Por ejemplo, el siguiente mensaje de registro muestra que la extracción de imágenes tardó 30.313387996 segundos:

Successfully pulled image "IMAGE_ADDRESS" in 30.313387996s.

Los tiempos de espera y las extracciones de imágenes lentas comparten muchas de las mismas causas. Para resolver estos problemas, prueba las siguientes soluciones:

  1. Verifica si hay interrupciones. Si solo notaste este problema durante un período determinado, consulta si hubo Google Cloud interrupciones.
  2. Verifica el rendimiento del disco. La E/S lenta del disco puede aumentar los tiempos de recuperación de imágenes. Considera actualizar a discos persistentes con SSD (pd-ssd) o usar discos más grandes para mejorar el rendimiento. Para obtener más sugerencias, consulta Soluciona problemas de rendimiento del disco.
  3. Reduce el tamaño de la imagen. Por ejemplo, es posible que puedas mover algunos datos de las imágenes del contenedor a los volúmenes persistentes.
  4. Aprovecha el almacenamiento en caché de imágenes para obtener tiempos de inicio rápidos de los Pods. GKE almacena en caché imágenes en nodos. Durante la extracción de una imagen, el entorno de ejecución del contenedor solo descarga las capas que aún no están presentes en la caché. Para maximizar la eficacia de este mecanismo de almacenamiento en caché y minimizar los tiempos de extracción de imágenes, estructura tu Dockerfile para colocar las partes de la imagen que cambian con frecuencia (como el código de tu aplicación) al final del archivo y usa imágenes base más pequeñas.
  5. Habilita la transmisión de imágenes. Esta función puede acelerar el inicio de los pods y las descargas de imágenes. Para obtener más información, consulta Usa la transmisión de imágenes para extraer imágenes de contenedor.
  6. Asegúrate de que la cuenta de servicio predeterminada tenga los permisos necesarios. Modificar los roles asignados a la cuenta de servicio predeterminada puede interrumpir las cargas de trabajo, incluidos los extracciones de imágenes. Para obtener más sugerencias, consulta Cómo identificar clústeres con cuentas de servicio de nodos a las que les faltan permisos fundamentales.
  7. Examina las configuraciones de proxy. Si existe un proxy entre tu clúster de GKE y un repositorio que no es administrado por Google, podría generar latencia.
  8. Verifica el software de terceros. Algunos software de terceros pueden interferir con las extracciones de imágenes. Investiga si alguna de las herramientas instaladas recientemente podría estar causando conflictos.

Verifica que el manifiesto de la imagen use la arquitectura correcta.

Si la imagen que intentas extraer se compiló para una arquitectura de computadora diferente a la que usan tus grupos de nodos, la extracción de la imagen fallará.

Para confirmar si el manifiesto de tu imagen usa la arquitectura correcta, sigue estos pasos:

  1. Para confirmar qué arquitectura usa tu imagen, consulta el manifiesto de esta. Por ejemplo, para ver una imagen de Docker, ejecuta el siguiente comando:

    docker manifest inspect --verbose IMAGE_NAME
    

    Reemplaza IMAGE_NAME por el nombre de la imagen que deseas ver.

    El resultado es similar a este:

    ...
    "Platform": {
              "architecture": "amd64",
              "os": "linux"
      }
    ...
    

    En este ejemplo, la arquitectura admitida es amd64.

  2. Revisa el tipo de máquina que usan tus grupos de nodos:

    gcloud container node-pools list --cluster CLUSTER_NAME --location LOCATION
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME: Es el nombre del clúster en el que se ejecuta el pod con errores de extracción de imágenes.
    • LOCATION: La región o zona de Compute Engine en la que se creó el nodo. Por ejemplo, us-central1-a o us-central1.

    El resultado es similar a este:

    NAME: example-node-pool
    MACHINE_TYPE: e2-standard-2
    DISK_SIZE_GB: 100
    NODE_VERSION: 1.30.8-gke.1162000
    

    En este ejemplo, el tipo de máquina es e2-standard-2.

  3. Compara los valores de los campos architecture y MACHINE_TYPE, y asegúrate de que ambos sean compatibles. Por ejemplo, si la imagen tiene una arquitectura amd64, sería compatible con un grupo de nodos que use e2-standard-2 como su tipo de máquina. Sin embargo, si el grupo de nodos usara t2a-standard-1 (un tipo de máquina basado en Arm), este tipo de máquina provocaría una falla.

  4. Si la arquitectura de la imagen no es compatible con el tipo de máquina del grupo de nodos, vuelve a compilar la imagen para que se oriente a la arquitectura requerida.

Verifica la compatibilidad de la versión del esquema de imagen

El uso de containerd 2.0 con una imagen de esquema de Docker v1 hace que falle la extracción de imágenes porque containerd 2.0 quitó la compatibilidad con la extracción de imágenes de esquema de Docker 1 en GKE 1.33. Cuando este problema es la causa del error de extracción de la imagen, es posible que veas el siguiente mensaje de error:

Failed to get converter for "IMAGE_ADDRESS": Pulling Schema 1 images have been deprecated and disabled by default since containerd v2.0. As a workaround you may set an environment variable `CONTAINERD_ENABLE_DEPRECATED_PULL_SCHEMA_1_IMAGE=1`, but this will be completely removed in containerd v2.1.

Para resolver este problema, identifica y migra estas imágenes siguiendo las instrucciones que se indican en Cómo migrar desde imágenes de Docker de esquema 1.

¿Qué sigue?

Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.