Cette page explique comment identifier et résoudre les problèmes de contention des ressources dans votre environnement Google Distributed Cloud.
Présentation
Il peut arriver que Google Distributed Cloud rencontre des problèmes de contention des ressources, ce qui peut ralentir vos conteneurs, réduire leurs performances ou les arrêter. Cela peut se produire en raison d'une forte consommation de processeur ou de mémoire par les conteneurs.
Fonctionnement de la gestion du processeur et de la mémoire
CPU :
- Un pod est planifié sur un nœud en fonction des demandes de processeur spécifiées par les conteneurs du pod.
- Un conteneur dans un pod ne peut pas utiliser plus de processeurs que la limite spécifiée par le conteneur.
- L'utilisation du processeur du conteneur est limitée à la limite de processeur.
- Si l'utilisation du processeur est limitée au niveau du nœud, les conteneurs se voient automatiquement attribuer des cycles de processeur proportionnels aux demandes.
En savoir plus sur la programmation des pods avec des demandes de ressources
Mémoire :
- Un pod est planifié sur un nœud en fonction des demandes de mémoire spécifiées par les conteneurs du pod.
- Un conteneur ne peut pas utiliser plus de mémoire que la limite spécifiée par le conteneur.
- Si aucune limite de mémoire n'est spécifiée, un conteneur peut consommer toute la mémoire disponible sur un nœud. Le système peut alors déclencher le tueur de mémoire insuffisante et évincer les pods de faible priorité.
Pour en savoir plus, consultez les ressources suivantes :
- Attribuer des ressources de processeur
- Attribuer des ressources mémoire
- Métriques Google Distributed Cloud
Problèmes
Le conteneur devient lent
Les problèmes de contention du processeur peuvent ralentir les conteneurs. Voici quelques-unes des raisons possibles :
Utilisation élevée du processeur sur le conteneur :
Un conteneur peut devenir lent s'il n'obtient pas de cycles de processeur proportionnels aux demandes de processeur, ou si les demandes de processeur ont été définies sur une valeur trop faible par rapport à ce dont le conteneur a besoin. Vérifiez donc le rapport entre la limite de processeur et l'utilisation du processeur pour le conteneur.
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_container
| metric 'kubernetes.io/anthos/container/cpu/limit_utilization'
| group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)]
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.container_name == 'CONTAINER_NAME'
| filter resource.pod_name == 'POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| every 1m
Effectuez l' une des opérations suivantes :
- Si ce ratio est élevé (>=0,8), cela signifie que la limite de processeur du conteneur est faible et que Kubernetes limite les cycles de processeur du conteneur pour maintenir l'utilisation du processeur dans les limites. Pour résoudre ce problème, augmentez la limite de processeur sur le conteneur.
- Si ce ratio n'est pas élevé (< 0,8), vérifiez si l'utilisation du processeur est élevée sur le nœud.
Utilisation élevée du processeur sur le nœud
Si le ratio entre la limite de processeur et l'utilisation n'est pas élevé pour un conteneur individuel du pod, il se peut que le nœud ne dispose pas de suffisamment de cycles de processeur à allouer à l'ensemble des conteneurs exécutés sur le nœud. Pour vérifier le ratio entre l'utilisation réelle du processeur et les processeurs pouvant être alloués sur le nœud, procédez comme suit :
Obtenez le nœud du pod qui fonctionne lentement :
kubectl get pod –kubeconfig CLUSTER_KUBECONFIG --namespace NAMESPACE POD --output wide
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_node | metric 'kubernetes.io/anthos/node/cpu/allocatable_utilization' | group_by 1m, [value_allocatable_utilization_mean: mean(value.allocatable_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name == 'NODE_NAME' | every 1m
Si ce ratio est élevé (>= 0,8), cela signifie que le nœud ne dispose pas de suffisamment de cycles de processeur et qu'il fait l'objet d'une sursouscription. Suivez ces étapes pour vérifier l'utilisation du processeur pour tous les autres pods de ce nœud et déterminer si un autre conteneur utilise plus de processeurs.
- Obtenez tous les pods sur le nœud :
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME
- Vérifiez l'utilisation du processeur sur chaque conteneur :
fetch k8s_container | metric 'kubernetes.io/anthos/container/cpu/limit_utilization' | group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.container_name == 'CONTAINER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | every 1m
Si un autre conteneur utilise beaucoup de processeur sur le nœud, augmentez les demandes et les limites de processeur sur le conteneur qui fonctionne lentement. Le pod sera recréé sur un autre nœud pour obtenir les cycles de processeur requis.
Si c'est un pod système qui fonctionne lentement, contactez l'Assistance Google.
Sursouscription du processeur au niveau de vSphere
Si la consommation de processeur n'est pas élevée sur le nœud ou le pod, et que le conteneur est toujours lent, la VM peut faire l'objet d'une sursouscription au niveau de vSphere. Par conséquent, le nœud ne peut pas obtenir les cycles de processeur attendus de la virtualisation sous-jacente.
Suivez ces étapes pour vérifier si la VM fait l'objet d'une sursouscription. Si une sursouscription est détectée, essayez les solutions suivantes :
- Déplacez certaines VM vers d'autres hôtes.
- Évaluez et diminuez le nombre de processeurs virtuels par VM pour l'hôte.
- Allouez davantage de ressources aux VM du cluster.
- Augmentez les demandes et les limites de processeur sur le conteneur. Le pod sera recréé sur un autre nœud pour obtenir les cycles de processeur requis.
Le pod est arrêté pour cause de mémoire insuffisante
Les pods peuvent être arrêtés en raison de fuites de mémoire ou d'une mauvaise configuration des demandes et des limites de mémoire sur les conteneurs. Voici quelques-unes des raisons possibles :
Utilisation élevée de la mémoire sur le conteneur
Un pod peut être arrêté par manque de mémoire si un conteneur du pod consomme la totalité de la mémoire allouée. Vérifiez donc le ratio entre les demandes de mémoire et les limites de mémoire sur le conteneur.
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_container
| metric 'kubernetes.io/anthos/container/memory/limit_utilization'
| filter (metric.memory_type == 'non-evictable')
| group_by 1m, [value_limit_utilization_mean: mean(value.limit_utilization)]
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.container_name == 'CONTAINER_NAME'
| filter resource.pod_name == 'POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| every 1m
Effectuez l' une des opérations suivantes :
- Si ce ratio est élevé (>= 0,8), augmentez la limite de mémoire du conteneur.
- Si ce ratio n'est pas élevé (< 0,8), vérifiez si l'utilisation de la mémoire sur le nœud est élevée.
Utilisation élevée de la mémoire sur le nœud
Un pod peut être arrêté par manque de mémoire si l'utilisation de la mémoire de tous les pods exécutés sur le nœud dépasse la mémoire disponible. Vérifiez donc si la condition MemoryPressure
sur le nœud est True
.
Exécutez la commande suivante et examinez la section
Conditions
:kubectl describe nodes --kubeconfig CLUSTER_KUBECONFIG NODE-NAME
Si la condition
MemoryPressure
estTrue
, vérifiez l'utilisation de la mémoire sur le nœud :fetch k8s_node | metric 'kubernetes.io/anthos/node/memory/allocatable_utilization' | filter (metric.memory_type == 'non-evictable') | group_by 1m, [value_allocatable_utilization_mean: mean(value.allocatable_utilization)] | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name = 'NODE_NAME' | every 1m
Si ce ratio est élevé (>= 0,8), cela signifie que le nœud ne dispose pas de suffisamment de mémoire à allouer au pod, peut-être en raison de certains processus ou d'autres pods qui consomment beaucoup de mémoire.
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante pour vérifier l'utilisation de la mémoire pour les conteneurs sur le nœud :
fetch k8s_node | metric 'kubernetes.io/anthos/container_memory_usage_bytes' | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.node_name == 'NODE_NAME' | group_by 1m, [value_container_memory_usage_bytes_mean: mean(value.container_memory_usage_bytes)] | every 1m
Si un conteneur utilise beaucoup de mémoire, examinez son fonctionnement ou augmentez la demande de mémoire pour le conteneur, si nécessaire.
Si c'est un pod système qui consomme beaucoup de mémoire, contactez l'Assistance Google.
De plus, vous pouvez activer la fonctionnalité d'autoscaling dans Google Distributed Cloud pour augmenter ou réduire automatiquement la taille des pools de nœuds en fonction des exigences de vos charges de travail.
Découvrez comment activer l'autoscaler.
Problèmes liés à etcd
Parfois, vos Clusters Anthos sur VMware peuvent rencontrer des échecs de conteneur en raison de problèmes liés au serveur etcd. Vous pouvez alors observer les problèmes suivants :
Journaux du serveur d'API répétés au format suivant :
etcdserver: request timed out
etetcdserver: leader changed
Journaux etcd répétés au format suivant :
W | wal: sync duration of 2.466870869s, expected less than 1s
etW | etcdserver: read-only range request * took too long
Voici quelques-unes des raisons possibles :
Limitation du CPU
Le serveur etcd peut être lent en raison de la limitation du processeur sur le pod du serveur etcd et/ou sur le nœud sur lequel le serveur etcd s'exécute. Reportez-vous à la section Le conteneur devient lent pour vérifier les problèmes de conflit de processeur.
Si vous détectez une contention de processeur sur le pod de serveur ectd ou sur le nœud, ajoutez des processeurs au nœud du plan de contrôle du cluster d'utilisateur. Utilisez gkectl update
pour modifier le champ cpus
dans le fichier de configuration du cluster d'utilisateur.
Pod etcd arrêté pour cause de mémoire insuffisante
Le pod etcd peut être arrêté en raison de problèmes de conflit de ressources. Reportez-vous à la section Le pod est arrêté pour cause de mémoire insuffisante pour vérifier tout problème de conflit de mémoire avec le pod du serveur etcd et/ou le nœud sur lequel le serveur etcd est exécuté.
Si vous détectez que le pod etcd est arrêté pour cause de mémoire insuffisante, augmentez la mémoire disponible pour le nœud du plan de contrôle du cluster d'utilisateur. Utilisez gkectl update
pour modifier le champ memoryMB
dans le fichier de configuration du cluster d'utilisateur.
Lenteur du disque
S'il n'y a aucun problème de consommation de processeur ou de mémoire sur le pod ou le nœud du serveur etcd, il est possible que l'etcd soit lent si le datastore sous-jacent est lent ou limité.
Recherchez les problèmes suivants :
Pour vérifier si le serveur etcd met trop de temps à lire/écrire sur le disque sous-jacent :
Récupérez les journaux etcd :
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG logs -n ETCD_POD_NAMESPACE ETCD_POD
Recherchez les entrées du modèle suivant pour détecter si etcd met trop de temps à lire les données sur le disque :
W | etcdserver: read-only range request "key:\"/registry/configmaps/default/clusterapi-vsphere-controller-manager-leader-election\" " with result "range_response_count:1 size:685" took too long (6.893127339s) to execute
Recherchez les entrées du modèle suivant pour détecter si etcd met trop de temps à écrire sur le disque :
W | wal: sync duration of 2.466870869s, expected less than 1s
Si l'un ou les deux modèles de journal ci-dessus s'affichent fréquemment dans les journaux etcd, cela indique une lenteur du disque. Ensuite, vérifiez les performances du datastore et des disques.
Pour vérifier les métriques etcd :
Récupérez les latences de synchronisation WAL etcd :
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_container::kubernetes.io/anthos/etcd_disk_wal_fsync_duration_seconds | every 1m | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | percentile 99
Récupérez les latences d'écriture etcd :
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_container::kubernetes.io/anthos/etcd_disk_backend_commit_duration_seconds | every 1m | filter resource.cluster_name == 'CLUSTER_NAME' | filter resource.pod_name == 'POD_NAME' | filter resource.namespace_name == 'NAMESPACE_NAME' | percentile 99
Si
p99
pouretcd_disk_wal_fsync_duration_seconds
est constamment supérieur à 10 ms et/ou sip99
pouretcd_disk_backend_commit_duration_seconds
est constamment supérieur à 25 ms, cela indique une lenteur du disque. Ensuite, vérifiez les performances du datastore et des disques.
Latences de lecture/écriture sur le disque de la VM
Pour vérifier les latences de lecture/écriture sur le disque virtuel de la VM, procédez comme suit :
Identifiez le nœud du pod etcd lent :
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods -n ETCD_POD_NAMESPACE ETCD_POD -owide
Connectez-vous à vSphere et sélectionnez la VM identifiée à l'étape précédente : dans vSphere, accédez à Surveiller > Performances > Avancé, puis sélectionnez Disque virtuel dans la section Afficher pour identifier les latences de lecture et d'écriture des disques virtuels.
Si la latence de lecture/écriture du disque virtuel est élevée :
- Examinez les autres VM exécutées sur le datastore pour vérifier si l'utilisation des opérations d'entrée/sortie par seconde (IOPS) est élevée. Si des pics d'IOPS sont constatés pour une VM, évaluez son fonctionnement.
- Consultez votre équipe de laboratoire/d'infrastructure pour vous assurer que la bande passante de lecture et d'écriture n'est pas limitée ni bridée à un moment donné.
- Consultez votre équipe de laboratoire/d'infrastructure pour identifier les problèmes de performances des disques et de performances de stockage, le cas échéant.
Pour en savoir plus, consultez les bonnes pratiques pour mettre à l'échelle vos ressources.
Problèmes liés au serveur d'API
Si les conteneurs de votre expérience Google Distributed Cloud présentent une latence lors de la communication avec le serveur d'API, ou si les commandes Kubectl échouent ou mettent trop de temps à répondre, cela peut indiquer des problèmes avec le serveur d'API.
Voici quelques-unes des raisons possibles :
Volume élevé de requêtes API
Le serveur d'API peut mettre du temps à répondre si la fréquence et le volume des requêtes sont trop élevés. La lenteur du temps de réponse peut persister même après que le serveur API a commencé à limiter les requêtes. Vérifiez donc le taux de requêtes API sur le serveur d'API.
Dans la consoleGoogle Cloud > Monitoring > Explorateur de métriques, dans l'éditeur MQL, exécutez la requête suivante :
fetch k8s_container::kubernetes.io/anthos/apiserver_request_total
| filter resource.cluster_name == 'CLUSTER_NAME'
| filter resource.pod_name == 'APISERVER_POD_NAME'
| filter resource.namespace_name == 'NAMESPACE_NAME'
| align rate(1m)
| every 1m
| group_by [metric.verb]
En cas d'augmentation inattendue des requêtes API, utilisez la journalisation d'audit Cloud pour identifier le pod qui interroge peut-être trop souvent le serveur d'API.
- S'il s'agit d'un pod système, contactez l'Assistance Google.
- S'il s'agit d'un pod utilisateur, effectuez des recherches supplémentaires pour déterminer si les requêtes API sont attendues.
Limitation du CPU
Un taux de requêtes élevé sur le serveur d'API peut entraîner une limitation du processeur. Le serveur d'API peut alors devenir lent en raison d'un conflit de processeur sur le pod et/ou le nœud du serveur d'API.
Reportez-vous à la section Le conteneur devient lent pour vérifier les problèmes de conflit de processeur avec le pod et/ou le nœud.
Pod du serveur d'API arrêté pour cause de mémoire insuffisante
Le pod du serveur d'API peut être arrêté en raison de problèmes de conflit de ressources. Reportez-vous à la section Le pod est arrêté pour cause de mémoire insuffisante pour vérifier les problèmes de conflit de mémoire avec le pod et/ou le nœud.
Réponses etcd lentes
Le serveur d'API s'appuie sur la communication avec le cluster etcd pour répondre aux requêtes de lecture / écriture des clients. Si etcd est lent ou ne répond pas, le serveur d'API le devient également.
Récupérez les journaux du serveur d'API pour vérifier si le serveur d'API est lent en raison de problèmes etcd :
kubectl –kubeconfig ADMIN_CLUSTER_KUBECONFIG logs -n APISERVER_NAMESPACE APISERVER_POD_NAME
Si vous observez des journaux récurrents tels que etcdserver: request timedout
ou etcdserver: leader changed
, suivez les étapes décrites dans Problèmes liés à etcd pour résoudre les problèmes liés au disque.
Si votre cluster n'exporte pas de métriques
Les techniques présentées précédemment dans ce document reposent sur l'exportation des métriques de votre cluster vers un projet Google Cloud .
Si votre cluster n'exporte pas de métriques, vous pouvez utiliser la ligne de commande pour examiner la contention des ressources. Voici quelques commandes que vous pouvez exécuter sur votre station de travail d'administrateur pour afficher les métriques.
Pour afficher les métriques d'un nœud :
kubectl --kubeconfig CLUSTER_KUBECONFIG get --raw \ /apis/metrics.k8s.io/v1beta1/nodes/NODE_NAME | jq
Remplacez les éléments suivants :
- CLUSTER_KUBECONFIG : chemin d'accès au fichier kubeconfig du cluster
- NODE_NAME : nom du nœud
Affichez les métriques d'un pod :
kubectl --kubeconfig CLUSTER_KUBECONFIG get --raw \ /apis/metrics.k8s.io/v1beta1/namespaces/NAMESPACE/pods/POD_NAME | jq
Remplacez les éléments suivants :
- NAMESPACE : espace de noms du pod
- POD_NAME : nom du pod
Affichez les métriques de tous les nœuds :
kubectl --kubeconfig CLUSTER_KUBECONFIG top node
Affichez les métriques de tous les pods d'un espace de noms :
kubectl --kubeconfig CLUSTER_KUBECONFIG top pod --namespace NAMESPACE
Affichez les métriques des conteneurs de tous les pods d'un espace de noms :
kubectl --kubeconfig CLUSTER_KUBECONFIG top pod --containers --namespace NAMESPACE
Pour en savoir plus, consultez kubectl top pod et kubectl top node.
Vous pouvez également exécuter la commande top à partir d'un conteneur exécuté sur un nœud.
Voici deux façons d'exécuter une commande dans un conteneur :
Sur votre station de travail d'administrateur, exécutez kubectl exec pour obtenir une interface système dans le conteneur. Exécutez la commande dans le shell.
Obtenez une connexion SSH à un nœud. Utilisez ensuite docker exec pour obtenir une interface système dans le conteneur. Exécutez la commande dans le shell.
Étape suivante
Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.
Vous pouvez également consulter Obtenir de l'aide pour en savoir plus sur les ressources d'assistance, y compris les suivantes :
- Conditions requises pour ouvrir une demande d'assistance.
- Des outils pour vous aider à résoudre les problèmes, tels que les journaux et les métriques.
- Composants, versions et fonctionnalités compatibles de Google Distributed Cloud pour VMware (logiciel uniquement).