Pourquoi les pods affichent-ils des erreurs pull QPS exceeded lors de la récupération d'images?

Lors du démarrage des pods, vous pouvez rencontrer des erreurs indiquant que les opérations de récupération d'images sont limitées, avec des messages du type pull QPS exceeded.

Lorsque vous déployez des pods qui doivent extraire des images de conteneurs, vous pouvez observer les symptômes suivants :

  • Messages d'erreur contenant pull QPS exceeded lors du démarrage du pod
  • Lenteur de l'extraction des images, en particulier lors de l'extraction de plusieurs images de grande taille
  • Les gousses mettent plus de temps que prévu à atteindre l'état Running
  • Les opérations de tirage d'images semblent être restreintes ou limitées en taux

La cause la plus probable du ralentissement du téléchargement d'images accompagné d'erreurs pull QPS exceeded est que vos nœuds de travail VPC atteignent la limite de bande passante d'E/S disque.

Les nœuds de travail VPC ont des limites de bande passante différentes en fonction de leur configuration :

  • Nœuds de travail standard (sans stockage secondaire): Limité à 393 Mbps (49 MB/sec) pour les opérations d'E/S sur disque
  • Nœuds de travail avec stockage secondaire: Limites de bande passante plus élevées en fonction du niveau de stockage sélectionné

Lorsque plusieurs pods tentent d'extraire simultanément de grandes images de conteneurs :

  1. Chaque opération de tirage d'image consomme de la bande passante d'E/S sur disque
  2. La demande combinée de bande passante peut rapidement saturer la limite de 49 MB/sec
  3. Une fois la limite atteinte, les opérations de tirage d'images ralentissent considérablement
  4. Kubernetes peut signaler des erreurs pull QPS exceeded lorsqu'il limite les opérations

Pour déterminer si vous atteignez la limite de bande passante des nœuds de travail du VPC, utilisez les fonctionnalités de surveillance du site IBM Cloud.

Vérifier la bande passante des E/S du disque

  1. Naviguez vers Observe → Metrics dans la console OpenShift pour votre cluster.

  2. Utilisez la requête suivante Prometheus pour surveiller les taux de lecture et d'écriture des disques :

    irate(node_disk_read_bytes_total[2m]) + irate(node_disk_written_bytes_total[2m])
    
  3. Interpréter les résultats :

    • Si l'un des dispositifs affiche des valeurs proches ou égales à 49M (49 MB/sec ), vous atteignez la limite de la bande passante.
    • La saturation de la bande passante est confirmée par des valeurs proches de cette limite lors d'opérations de tirage d'images.
    • Des pics multiples à cette limite indiquent des contraintes répétées de bande passante.

Vérifier les temps de tirage des images

Vous pouvez également vérifier directement les délais d'extraction des images :

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

Cette commande indique la durée de chaque tirage d'image, ce qui vous permet d'identifier les tirages lents.

Résolution du problème

Solution principale : Utiliser des pools de travailleurs avec un stockage secondaire

La solution recommandée est d'utiliser des pools de travailleurs avec un stockage secondaire. Le stockage secondaire avec 10iops-tier fournit une bande passante E/S dédiée qui n'est pas en concurrence avec le disque de démarrage, ce qui se traduit par un débit beaucoup plus élevé pour les extractions d'images simultanées et des temps de démarrage des pods plus rapides.

  1. Créez un nouveau pool de travailleurs avec un stockage secondaire.

    • Lorsque vous créez un nouveau pool de travailleurs, sélectionnez une saveur avec stockage secondaire.
    • Utilisez l'une des options de stockage 10iops-tier pour des performances optimales.
  2. Migrez vos charges de travail vers le nouveau pool.

  3. Vidanger et supprimer l'ancien pool de travailleurs une fois la migration terminée.

Autres considérations

Si la mise à niveau vers un système de stockage secondaire est la solution principale, vous pouvez aussi.. :

Réduire la taille des images
Utiliser des constructions en plusieurs étapes et minimiser les couches
Utiliser la mise en cache des images
Pré-tirer les images les plus utilisées vers les nœuds de travail
Optimiser imagePullPolicy
Configurez les spécifications de votre pod pour réduire les tirages inutiles :
  • Utilisez imagePullPolicy: IfNotPresent pour extraire des images uniquement si elles n'existent pas déjà sur le nœud.
  • Évitez imagePullPolicy: Always à moins que vous n'ayez spécifiquement besoin d'obtenir la dernière version à chaque fois.
  • Pour les charges de travail de production, utilisez des balises d'image spécifiques, et non latest, combinées avec IfNotPresent pour minimiser les tirages.
Mise en place d'une surveillance et d'alertes
Mettre en place des alertes pour les taux d'E/S disque élevés et soutenus qui approchent les 49 Mo/sec.
  • Surveillez les temps d'extraction des images dans le cadre de vos mesures de déploiement.
  • Suivre les temps de démarrage des pods pour identifier la dégradation des performances.