¿Por qué los pods muestran pull QPS exceeded errores al descargar imágenes?

Cuando se inician los pods, es posible que aparezcan errores que indiquen que las operaciones de descarga de imágenes están siendo limitadas, con mensajes como pull QPS exceeded.

Cuando despliega pods que necesitan extraer imágenes de contenedor, puede observar los siguientes síntomas:

  • Mensajes de error que contienen durante pull QPS exceeded el inicio del pod
  • Tiempos de extracción de imágenes lentos, especialmente cuando se extraen varias imágenes de gran tamaño
  • Las vainas tardan más de lo previsto en alcanzar el estado Running
  • Las operaciones de extracción de imágenes parecen estar estranguladas o limitadas en cuanto a la velocidad

La causa más probable de que la descarga de imágenes sea lenta y se produzcan errores pull QPS exceeded es que los nodos de trabajo de tu VPC estén alcanzando el límite de ancho de banda de E/S del disco.

Los nodos worker de la VPC tienen diferentes límites de ancho de banda en función de su configuración:

  • Nodos trabajadores estándar (sin almacenamiento secundario): Limitado a 393 Mbps (49 MB/seg) para operaciones de E/S de disco
  • Nodos de trabajo con almacenamiento secundario: Límites de ancho de banda superiores en función del nivel de almacenamiento seleccionado

Cuando varios pods intentan extraer imágenes de contenedores grandes simultáneamente:

  1. Cada operación de extracción de imágenes consume ancho de banda de E/S de disco
  2. La demanda combinada de ancho de banda puede saturar rápidamente el límite de 49 MB/seg
  3. Una vez alcanzado el límite, las operaciones de extracción de imágenes se ralentizan considerablemente
  4. Kubernetes podría notificar pull QPS exceeded errores al limitar las operaciones

Para determinar si está alcanzando el límite de ancho de banda del nodo trabajador de la VPC, utilice las funciones de supervisión de IBM Cloud.

Compruebe el ancho de banda de E/S del disco

  1. Vaya a Observar → Métricas en la consola OpenShift para su clúster.

  2. Utilice la siguiente consulta Prometheus para supervisar las tasas de lectura y escritura del disco:

    irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m])
    
  3. Interpreta los resultados:

    • Si alguno de los dispositivos muestra valores cercanos o iguales a 49M (49 MB/seg), está alcanzando el límite de ancho de banda.
    • Los valores sostenidos en o cerca de este límite durante las operaciones de extracción de imágenes confirman la saturación del ancho de banda.
    • Múltiples picos hasta este límite indican restricciones repetidas del ancho de banda.

Comprobar los tiempos de extracción de imágenes

También puede consultar directamente los tiempos de extracción de imágenes:

oc get events -A | grep -E "Successfully pulled image"

Este comando muestra el tiempo que ha tardado cada extracción de imagen, lo que ayuda a identificar las extracciones lentas.

Resuelva el problema

Solución primaria: Utilizar grupos de trabajadores con almacenamiento secundario

La solución recomendada es utilizar pools de trabajadores con almacenamiento secundario adjunto. El almacenamiento secundario con 10iops-tier proporciona un ancho de banda de E/S dedicado que no compite con el disco de arranque, lo que se traduce en un rendimiento mucho mayor para las extracciones de imágenes simultáneas y tiempos de arranque del pod más rápidos.

  1. Cree un nuevo grupo de trabajadores con almacenamiento secundario.

    • Cuando crees un nuevo pool de trabajadores, selecciona un tipo con almacenamiento secundario.
    • Utilice una de las opciones de almacenamiento de 10iops-tier para obtener un rendimiento óptimo.
  2. Migre sus cargas de trabajo al nuevo pool.

  3. Vacíe y elimine la antigua reserva de trabajadores una vez finalizada la migración.

Consideraciones adicionales

Aunque la principal solución es actualizar el almacenamiento secundario, también puede hacerlo:

Reducir el tamaño de las imágenes
Utilizar construcciones multietapa y minimizar las capas
Utilizar la caché de imágenes
Extracción previa de las imágenes más utilizadas en los nodos trabajadores
Optimice imagePullPolicy
Configure las especificaciones de su pod para reducir los tirones innecesarios:
  • Utilice imagePullPolicy: IfNotPresent para extraer imágenes sólo si no existen ya en el nodo.
  • Evite imagePullPolicy: Always a menos que necesite específicamente obtener la última versión cada vez.
  • Para cargas de trabajo de producción, utilice etiquetas de imagen específicas, no latest, combinadas con IfNotPresent para minimizar los tirones.
Configurar la supervisión y las alertas
Configure alertas para altas tasas sostenidas de E/S de disco que se acerquen a 49 MB/seg.
  • Supervise los tiempos de extracción de imágenes como parte de sus métricas de despliegue.
  • Realice un seguimiento de los tiempos de arranque de los pods para identificar la degradación del rendimiento.