Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le protocole de datagramme utilisateur (UDP) est un protocole sans connexion utilisé dans les clusters AKS managés. Les paquets UDP sont envoyés sans garantie de distribution, de fiabilité ou d’ordre, car ils n’établissent pas de connexion avant le transfert de données. Cela signifie que les paquets UDP peuvent être perdus, dupliqués ou arrivés à destination dans le désordre pour de multiples raisons.
Cet article décrit comment diagnostiquer et résoudre les problèmes de chute de paquets UDP causés par un petit tampon de lecture qui pourrait déborder en cas de trafic réseau élevé.
Prérequis
- Un cluster AKS avec au moins un pool de nœuds et un pod exécutant une application UDP.
- Azure CLI installé et configuré. Pour plus d’informations, consultez la rubrique Installation de l’interface de ligne de commande Azure (CLI).
- Kubectl installé et configuré pour se connecter à votre cluster AKS. Pour plus d’informations, consultez Install kubectl.
- Un ordinateur client capable d’envoyer et de recevoir des paquets UDP vers et depuis votre cluster AKS.
Problème : les connexions UDP ont un taux de rejet de paquets élevé
L’une des causes possibles de la perte de paquets UDP est que la taille de la mémoire tampon UDP est trop petite pour gérer le trafic entrant. La taille de la mémoire tampon UDP détermine la quantité de données pouvant être stockées dans le noyau avant d’être traitées par l’application. Si la taille de la mémoire tampon est insuffisante, le noyau peut rejeter les paquets qui dépassent la capacité de la mémoire tampon. Ce paramètre est géré au niveau de la machine virtuelle pour vos nœuds, et la valeur par défaut est définie sur 1048576 octets ou 1 Mo.
Remarque
Les versions Ubuntu antérieures à 24.10, à l’exception de 20.04, 22.04 et 24.04, ont la capacité de mémoire tampon UDP par défaut définie sur 212992 octets ou 0,2 Mo.
Il existe deux variables différentes au niveau de la machine virtuelle qui s’appliquent aux tailles de la mémoire tampon :
net.core.rmem_max = 1048576 bytes
: la plus grande valeur de mémoire tampon qu’un propriétaire de socket peut définir explicitement.net.core.rmem_default = 1048576 bytes
: la valeur maximale du système peut augmenter la mémoire tampon si une valeurrmem_max
n’est pas définie explicitement.
Pour permettre à la mémoire tampon de s'agrandir afin de répondre à d'importants flux de trafic, nous devons mettre à jour les valeurs de la taille de la mémoire tampon.
Remarque
Cet article se concentre sur les tailles de mémoire tampon du noyau Ubuntu Linux. Si vous souhaitez découvrir d’autres configurations pour Linux et Windows, consultez Personnaliser la configuration des nœuds pour les pools de nœuds AKS.
Diagnose
Vérifier les paramètres actuels de la mémoire tampon UDP
Obtenez la liste de vos nœuds à l’aide de la commande
kubectl get nodes
et choisissez un nœud pour lequel vous souhaitez vérifier les paramètres de la mémoire tampon.kubectl get nodes
Configurez un pod de débogage sur le nœud sélectionné à l’aide de la commande
kubectl debug
. Remplacez<node-name>
par le nom du nœud que vous souhaitez déboguer.kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
Obtenez la valeur des variables
net.core.rmem_max
etnet.core.rmem_default
à l’aide de la commandesysctl
suivante :sysctl net.core.rmem_max net.core.rmem_default
Mesurer le trafic UDP entrant
Pour vérifier si votre mémoire tampon est trop petite pour votre application et si elle rejette des paquets, commencez par simuler un trafic réaliste sur vos pods et configurer un pod de débogage pour surveiller le trafic entrant. Ensuite, vous pouvez utiliser les commandes suivantes pour mesurer le trafic UDP entrant.
Vérifiez le fichier UDP pendant l’exécution du test à l’aide de la commande
cat
suivante :cat /proc/net/udp
Ce fichier affiche les statistiques des connexions ouvertes actuelles sous la colonne
rx_queue
. Il n’affiche pas les données historiques.Vérifiez le fichier snmp et comparez la valeur
RcvbufErrors
avant et après le test à l’aide de la commandecat
suivante :cat /proc/net/snmp
Ce fichier vous montre la durée de vie des paquets UDP, y compris le nombre de paquets rejetés sous la colonne
RcvbufErrors
.
Si vous remarquez une augmentation au-delà de la taille de votre mémoire tampon dans la rx_queue
ou une augmentation de la valeur RcvbufErrors
, vous devez augmenter votre taille de mémoire tampon.
Remarque
L'augmentation de la taille de la mémoire tampon du système peut s'avérer inefficace si votre application ne peut pas suivre le rythme des paquets entrants. L'augmentation de la taille de la mémoire tampon du système dans ce cas ne ferait que retarder l'abandon des paquets. Vous devriez envisager d'examiner et d'améliorer votre application en ce qui concerne la manière dont elle traite les paquets UDP dans de telles situations. Une taille de tampon plus importante n'est utile que si vous avez des pics de trafic occasionnels qui remplissent parfois le tampon, car cela donne au noyau plus de temps ou de ressources pour traiter l'augmentation des demandes.
Atténuer
Remarque
Le noyau alloue dynamiquement les tampons de lecture pour chaque socket lorsque les paquets arrivent, plutôt que de les allouer à l'avance. Les paramètres rmem_default
et rmem_max
spécifient les limites de mémoire tampon du noyau pour chaque socket avant la perte de paquets.
Vous pouvez modifier les valeurs de taille de mémoire tampon au niveau d’un pool de nœuds pendant le processus de création du pool de nœuds. Les étapes décrites dans cette section vous montrent comment configurer votre système d’exploitation Linux et appliquer les modifications à tous les nœuds du pool de nœuds. Vous ne pouvez pas ajouter ce paramètre à un pool de nœuds existant.
Créez un fichier
linuxosconfig.json
sur votre ordinateur local avec le contenu suivant. Vous pouvez modifier les valeurs en fonction des exigences et de la référence SKU de nœud de votre application. La valeur minimale est de 212 992 octets, et la maximale est de 134 217 728 octets.{ "sysctls": { "netCoreRmemMax": 1572864, "netCoreRmemDefault": 1572864 } }
Vérifiez que vous êtes dans le même répertoire que le fichier
linuxosconfig.json
et créez un pool de nœuds avec la configuration de la taille de la mémoire tampon à l’aide de la commandeaz aks nodepool add
.az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name $NODE_POOL_NAME --linux-os-config ./linuxosconfig.json
Cette commande définit la taille maximale de la mémoire tampon UDP sur 8 Mo pour chaque socket sur le nœud. Vous pouvez ajuster ces valeurs dans le fichier
linuxosconfig.json
pour répondre aux exigences de votre application.
Valider
Une fois les nouvelles valeurs appliquées, vous pouvez accéder à votre machine virtuelle pour vous assurer que les nouvelles valeurs sont définies comme valeurs par défaut.
Obtenez la liste de vos nœuds à l’aide de la commande
kubectl get nodes
et choisissez un nœud pour lequel vous souhaitez vérifier les paramètres de la mémoire tampon.kubectl get nodes
Configurez un pod de débogage sur le nœud sélectionné à l’aide de la commande
kubectl debug
. Remplacez<node-name>
par le nom du nœud que vous souhaitez déboguer.kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
Obtenez la valeur de la variable
net.core.rmem_max
à l’aide de la commandesysctl
suivante :sysctl net.core.rmem_max net.core.rmem_default
Vos valeurs doivent maintenant être définies sur les valeurs décrites dans
linuxosconfig.json
.
Rétablir les valeurs d'origine
Si vous souhaitez restaurer la taille de la mémoire tampon sur sa valeur par défaut de 1 Mo, vous pouvez mettre à jour le fichier linuxosconfig.json
avec les valeurs suivantes :
{
"sysctls": {
"netCoreRmemMax": 1048576,
"netCoreRmemDefault": 1048576
}
}
Étapes suivantes
Dans cet article, vous avez appris à diagnostiquer et résoudre les rejets de paquets UDP dans Azure Kubernetes Service (AKS). Pour plus d’informations sur la résolution des problèmes dans AKS, consultez la documentation de résolution des problèmes Azure Kubernetes Service.
Azure Kubernetes Service