Dans Kubernetes, le terme OOM Killed indique un scénario où un pod dépasse la limite de mémoire allouée. Cela entraine le noyau Linux à mettre fin au processus pour libérer des ressources mémoire. Si le OOM killer est un composant essentiel de la bonne santé de vos clusters Kubernetes, son fonctionnement peut être difficile à appréhender. Dans cet article, nous tâcherons de le démystifier afin d’éviter les erreurs de mémoire.
Si vous souhaitez devenir incollable sur la gestion de la mémoire dans Kubernetes et dans vos applications conteneurisées, vous pouvez suivre nos formations Kubernetes et Kubernetes avancé. Vous apprendrez la maitrise de l’outil afin de déployer, gérer et entretenir des conteneurs applicatifs.
L’équipe Ambient IT
Comment fonctionne l’OOMKiller ?
L’OOM Killer (Out-Of-Memory Killer) est une fonction clé de Kubernetes qui aide à maintenir la stabilité du système et à prévenir l’épuisement de la mémoire. Il agit comme la dernière ligne de défense lorsque les ressources mémoire sont très faibles.
Le rôle de l’OOM killer est d’identifier le processus ou le pod responsable de la surcharge de mémoire et y met fin afin de libérer de la mémoire pour le reste du système. En sacrifiant un processus, l’OOM killer évite une panne complète du système, ce qui garantit la stabilité globale de votre infrastructure.
Déclenchement du OOMKiller
Pour prendre sa décision, l’OOM killer s’appuie sur les métriques de mémoire obtenues à partir de cAdvisor (Container Advisor) et exposées à Kubernetes. La principale métrique utilisée par le tueur d’OOM est container_memory_working_set_bytes. Elle indique la mémoire qui ne peut pas être expulsée en tenant compte des pages de mémoire utilisées par le conteneur.
Si container_memory_usage_bytes peut sembler un choix évident pour surveiller l’utilisation de la mémoire, il inclut des éléments mis en cache, tels que le cache du système de fichiers, qui peuvent être expulsés sous la pression de la mémoire. Il n’est par conséquent pas réellement représentatif de la mémoire observée et utilisée par le OOM Killer. container_memory_working_set_bytes est donc un meilleur indicateur, car il n’englobe que la mémoire surveillée.
Déboguer la consommation de mémoire
Si un système manque de mémoire, l’OOM Killer se reveille et a pour mission de sélectionner un processus à tuer. Il base toute ses descisions en en fonction du score OOM de chaque processus présent dans le sysème. L’objectif est de libérer suffisamment de mémoire pour que le système puisse continuer à fonctionner correctement.
Vous pouvez commencer par trouver quel processus a été ciblé par l’OOM Killer. Utilisez la commande dmesg pour consulter le journal.
dmesg | grep -i 'killed process'
Cette commande permet d’obtenir des informations sur les processus tués. La sortie vous indiquera quel processus a été tué et pourquoi.
Si vous souhaitez en plus comprendre pourquoi ce processus a été ciblé spécifiquement, utilisez la commande cat sur le fichier oom score dans le répertoire du processus sous /proc. Elle permet de connaitre l’OOM score d’un processus. Le score OOM est un nombre que le noyau attribue à chaque processus pour déterminer lequel il doit tuer dans une situation de mémoire insuffisante. Un score élevé signifie qu’un processus a plus de chance d’être tué.
echo -500 > /proc/12345/oom_score_adj
Enfin, les commandes free et top peuvent vous donner une vue en temps réel de l’utilisation de la mémoire de votre système. free -m affiche la quantité totale de mémoire physique et d’échange libre et utilisés dans le système, ainsi que les tampons et les caches utilisés par le noyau. La commande top vous permet de voir en temps réel les métriques d’un système en cours d’exécution, en affichant des informations récapitulatives sur le système ainsi qu’une liste des tâches actuellement gérées par le noyau.
Comment surveiller la mémoire dans Kubernetes ?
Pour surveiller l’utilisation de la mémoire et du processeur dans vos infrastructures, vous pouvez utiliser la commande kubectl top. Elle vous permet de voir la consommation de ressources pour les nœuds ou les pods. C’est un outil extrêmement utile pour les administrateurs kubernetes. Elle fournit des informations en temps réel sur l’utilisation de la mémoire et du CPU. Cela vous permet d’identifier les goulots d’étranglement potentiels, vous pouvez, par exemple, l’utiliser pour connaître l’utilisation du processeur et de la mémoire de vos nœuds avec la commande suivante.
kubectl top nodes
Il vous suffit de changer la fin par node <node name> à cette commande pour cibler un nœud en particulier. Changez nodes par pods ou pod <pod name> pour réaliser la même opération avec vos pods. Cela marche aussi pour les namespace.
Conclusion
L’OOM Killer de Kubernetes est un composant essentiel dans la bonne santé de vos clusters et applications conteneurisées. Pour éviter des conflits et des bugs liés à cet outil, la commande kubectl top est un outil précieux qui vous permet de surveiller l’utilisation de la mémoire et du CPU des pods et des nœuds dans votre cluster Kubernetes.