Il est utile de comprendre les outils de dépannage individuels pour Google Kubernetes Engine (GKE), mais les voir utilisés ensemble pour résoudre un problème concret peut vous aider à consolider vos connaissances.
Suivez un exemple guidé qui combine l'utilisation de la console Google Cloud , de l'outil de ligne de commande kubectl
, de Cloud Logging et de Cloud Monitoring pour identifier la cause première d'une erreur OutOfMemory
(OOMKilled
).
Cet exemple est utile pour tous ceux qui souhaitent voir une application pratique des techniques de dépannage décrites dans cette série, en particulier les administrateurs et opérateurs de plate-forme, ainsi que les développeurs d'applications. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenuGoogle Cloud , consultez Rôles utilisateur et tâches courantes de GKE.
Le scénario
Vous êtes l'ingénieur d'astreinte pour une application Web nommée product-catalog
qui s'exécute dans GKE.
Votre enquête commence lorsque vous recevez une alerte automatique de Cloud Monitoring :
Alert: High memory utilization for container 'product-catalog' in 'prod' cluster.
Cette alerte vous informe qu'un problème existe et qu'il est lié à la charge de travail product-catalog
.
Confirmer le problème dans la console Google Cloud
Vous commencez par obtenir une vue d'ensemble de vos charges de travail pour confirmer le problème.
- Dans la console Google Cloud , accédez à la page Charges de travail et filtrez sur votre charge de travail
product-catalog
. - Vous consultez la colonne d'état Pods. Au lieu de l'état sain
3/3
, la valeur indique un état non opérationnel :2/3
. Cette valeur indique que l'un des pods de votre application n'a pas l'étatReady
. - Vous souhaitez en savoir plus. Vous cliquez donc sur le nom de la charge de travail
product-catalog
pour accéder à sa page d'informations. - Sur la page des détails, vous pouvez consulter la section Pods gérés. Vous identifiez immédiatement un problème : la colonne
Restarts
de votre pod affiche14
, un nombre inhabituellement élevé.
Ce nombre élevé de redémarrages confirme que le problème est à l'origine de l'instabilité de l'application et suggère qu'un conteneur échoue à ses vérifications de l'état ou plante.
Trouver la raison avec les commandes kubectl
Maintenant que vous savez que votre application redémarre à plusieurs reprises, vous devez en trouver la raison. La commande kubectl describe
est un bon outil pour cela.
Vous obtenez le nom exact du pod instable :
kubectl get pods -n prod
Le résultat est le suivant :
NAME READY STATUS RESTARTS AGE product-catalog-d84857dcf-g7v2x 0/1 CrashLoopBackOff 14 25m product-catalog-d84857dcf-lq8m4 1/1 Running 0 2h30m product-catalog-d84857dcf-wz9p1 1/1 Running 0 2h30m
Décrivez le pod instable pour obtenir l'historique détaillé des événements :
kubectl describe pod product-catalog-d84857dcf-g7v2x -n prod
Vous examinez le résultat et trouvez des indices dans les sections
Last State
etEvents
:Containers: product-catalog-api: ... State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: OOMKilled Exit Code: 137 Started: Mon, 23 Jun 2025 10:50:15 -0700 Finished: Mon, 23 Jun 2025 10:54:58 -0700 Ready: False Restart Count: 14 ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 25m default-scheduler Successfully assigned prod/product-catalog-d84857dcf-g7v2x to gke-cs-cluster-default-pool-8b8a777f-224a Normal Pulled 8m (x14 over 25m) kubelet Container image "us-central1-docker.pkg.dev/my-project/product-catalog/api:v1.2" already present on machine Normal Created 8m (x14 over 25m) kubelet Created container product-catalog-api Normal Started 8m (x14 over 25m) kubelet Started container product-catalog-api Warning BackOff 3m (x68 over 22m) kubelet Back-off restarting failed container
Le résultat vous donne deux indices essentiels :
- Tout d'abord, la section
Last State
indique que le conteneur a été arrêté avecReason: OOMKilled
, ce qui signifie qu'il a manqué de mémoire. Cette raison est confirmée par leExit Code: 137
, qui est le code de sortie Linux standard pour un processus qui a été arrêté en raison d'une consommation excessive de mémoire. - Ensuite, la section
Events
affiche un événementWarning: BackOff
avec le messageBack-off restarting failed container
. Ce message confirme que le conteneur est dans une boucle d'échec, qui est la cause directe de l'étatCrashLoopBackOff
que vous avez vu précédemment.
- Tout d'abord, la section
Visualiser le comportement avec des métriques
La commande kubectl describe
vous a indiqué ce qui s'est passé, mais Cloud Monitoring peut vous montrer le comportement de votre environnement au fil du temps.
- Dans la console Google Cloud , accédez à l'explorateur de métriques.
- Vous sélectionnez la métrique
container/memory/used_bytes
. - Vous filtrez la sortie pour n'afficher que le cluster, l'espace de noms et le nom de pod spécifiques.
Le graphique montre un schéma distinct : l'utilisation de la mémoire augmente régulièrement, puis chute brusquement à zéro lorsque le conteneur est arrêté en raison d'une erreur de mémoire insuffisante et redémarre. Cette preuve visuelle confirme une fuite de mémoire ou une limite de mémoire insuffisante.
Identifier la cause dans les journaux
Vous savez maintenant que le conteneur manque de mémoire, mais vous ne savez toujours pas exactement pourquoi. Pour identifier la cause première, utilisez l'explorateur de journaux.
- Dans la console Google Cloud , accédez à l'explorateur de journaux.
Vous écrivez une requête pour filtrer les journaux de votre conteneur spécifique à partir de juste avant l'heure du dernier plantage (que vous avez vu dans la sortie de la commande
kubectl describe
) :resource.type="k8s_container" resource.labels.cluster_name="example-cluster" resource.labels.namespace_name="prod" resource.labels.pod_name="product-catalog-d84857dcf-g7v2x" timestamp >= "2025-06-23T17:50:00Z" timestamp < "2025-06-23T17:55:00Z"
Dans les journaux, vous trouverez un schéma de messages récurrent juste avant chaque plantage :
{ "message": "Processing large image file product-image-large.jpg", "severity": "INFO" }, { "message": "WARN: Memory cache size now at 248MB, nearing limit.", "severity": "WARNING" }
Ces entrées de journal indiquent que l'application tente de traiter des fichiers image volumineux en les chargeant entièrement en mémoire, ce qui finit par épuiser la limite de mémoire du conteneur.
Résultats
En utilisant ces outils ensemble, vous obtenez une vue d'ensemble du problème :
- L'alerte de surveillance vous a informé qu'un problème était survenu.
- La console Google Cloud vous a montré que le problème affectait les utilisateurs (redémarrages).
- Les commandes
kubectl
ont permis d'identifier la raison exacte des redémarrages (OOMKilled
). - L'explorateur de métriques a visualisé le schéma de fuite de mémoire au fil du temps.
- L'explorateur de journaux a révélé le comportement spécifique à l'origine du problème de mémoire.
Vous êtes maintenant prêt à implémenter une solution. Vous pouvez optimiser le code de l'application pour gérer les fichiers volumineux plus efficacement ou, comme solution à court terme, augmenter la limite de mémoire du conteneur (plus précisément, la valeur spec.containers.resources.limits.memory
) dans le fichier manifeste YAML de la charge de travail.
Étapes suivantes
Pour obtenir des conseils sur la résolution de problèmes spécifiques, consultez les guides de dépannage de GKE.
Si vous ne trouvez pas de solution à votre problème dans la documentation, consultez Obtenir de l'aide pour obtenir une assistance supplémentaire, y compris des conseils sur les sujets suivants :
- Ouvrez une demande d'assistance en contactant le service client Google Cloud.
- Obtenir de l'aide de la communauté en posant des questions sur Stack Overflow et en utilisant le tag
google-kubernetes-engine
pour rechercher des problèmes similaires. Vous pouvez également rejoindre le canal Slack#kubernetes-engine
pour obtenir de l'aide auprès de la communauté. - Signaler des bugs ou demander des fonctionnalités à l'aide de l'outil public de suivi des problèmes.