Partager via


Détecteur de problèmes de nœud (NPD) dans des nœuds Azure Kubernetes Service (AKS)

Le détecteur de problèmes de nœud (NPD) est un module complémentaire open source de Kubernetes qui détecte et signale des problèmes liés aux nœuds. Il s’exécute en tant que service système sur chaque nœud du cluster et collecte différentes métriques et informations système, telles que l’utilisation du processeur, l’utilisation du disque et la connectivité réseau. Quand il détecte un problème, il génère des événements et/ou des conditions de nœud. Azure Kubernetes Service (AKS) utilise NPD pour surveiller et gérer les nœuds dans un cluster Kubernetes s’exécutant sur la plateforme cloud Azure. L’extension AKS Linux active NPD par défaut.

Remarque

Les mises à niveau vers NPD sont indépendantes des processus de mise à niveau des versions de Kubernetes et de l’image de nœud. Si un pool de nœuds n’est pas sain (autrement dit, dans un état d’échec), les nouvelles versions de NPD ne sont pas installées.

Conditions de nœud

Les conditions de nœud indiquent un problème permanent qui rend le nœud indisponible. AKS utilise les états de nœud suivants de NPD afin de révéler les problèmes permanents du nœud. NPD émet également des événements Kubernetes correspondants.

Type de démon problématique NodeCondition Motif Type de capacité de calcul
CustomPluginMonitor Problème de corruption du système de fichiers CorruptionDuSystèmeDeFichiersDétectée Usage général
CustomPluginMonitor KubeletProblem KubeletIsDown Usage général
CustomPluginMonitor ContainerRuntimeProblem ContainerRuntimeIsDown Usage général
CustomPluginMonitor VMEventScheduled VMEventScheduled Usage général
CustomPluginMonitor FrequentUnregisterNetDevice DésinscrireNetDevice Usage général
CustomPluginMonitor FrequentKubeletRestart FrequentKubeletRestart Usage général
CustomPluginMonitor FrequentContainerdRestart FrequentContainerdRestart Usage général
CustomPluginMonitor Redémarrage fréquent de Docker Redémarrage fréquent de Docker Usage général
CustomPluginMonitor GPU manquant Le nombre de GPU observé ne correspond pas au nombre de GPU attendu GPU uniquement
CustomPluginMonitor NVLinkStatusInactive NVLinkStatusInactive GPU uniquement
CustomPluginMonitor XIDErrors Erreurs XID présentes dans le journal du noyau GPU uniquement
CustomPluginMonitor IBLinkFlapping Connectivité intermittente des appareils InfiniBand GPU uniquement
SystemLogMonitor KernelDeadlock DockerHung Usage général
SystemLogMonitor Système de fichiers en lecture seule FilesystemIsReadOnly Usage général

Remarque

Les GPU only conditions de nœud s’appliquent actuellement aux pools de nœuds AKS avec taille de VM Standard_ND96asr_v4 ou Standard_ND96isr_H100_v5, et sont prises en charge sur les pools de nœuds GPU standard et sur les pools de nœuds GPU avec MIG activé.

Événements

NPD émet des événements avec des informations pertinentes pour vous aider à diagnostiquer les problèmes sous-jacents.

Type de démon problématique Motif Fréquence Descriptif Action
CustomPluginMonitor EgressBlocked 30 minutes Cet événement vérifie la connectivité aux points de terminaison externes Vérifiez si un pare-feu ou un groupe de sécurité réseau bloque l'accès au point de terminaison qui est signalé.
CustomPluginMonitor CorruptionDuSystèmeDeFichiersDétectée 5 minutes Cette vérification de la corruption du système de fichiers est effectuée par Docker.
CustomPluginMonitor KubeletIsDown 30 s Cela vérifie que le service kubelet est actif et en bonne santé
CustomPluginMonitor ContainerRuntimeIsDown 30 s Cet événement vérifie si l'environnement d'exécution de conteneur, par exemple containerd, fonctionne correctement.
CustomPluginMonitor FreezeScheduled 1 minute Cet événement vérifie si un événement Freeze est planifié sur le nœud. Consultez https://aka.ms/aks/scheduledevents pour plus d'informations
CustomPluginMonitor RebootScheduled 1 minute Cet événement vérifie si un événement de redémarrage est planifié sur le nœud Vérifier https://aka.ms/aks/scheduledevents pour plus d’informations
CustomPluginMonitor RedeployScheduled 1 minute Cet événement vérifie si un événement de redéploiement est planifié sur le nœud. Consultez https://aka.ms/aks/scheduledevents pour plus d'informations
CustomPluginMonitor TerminateScheduled 1 minute Cet événement vérifie si un événement Terminate est planifié sur le nœud. Consultez https://aka.ms/aks/scheduledevents pour plus d'informations
CustomPluginMonitor PreemptScheduled 2s Cet événement vérifie si un événement préempt est planifié sur le nœud. Consultez https://aka.ms/aks/scheduledevents pour plus d'informations
CustomPluginMonitor DNSProblem
SystemLogMonitor OOMKilling
SystemLogMonitor TaskHung
SystemLogMonitor DésinscrireNetDevice
SystemLogMonitor KernelOops
SystemLogMonitor DockerSocketCannotConnect
SystemLogMonitor KubeletRPCDeadlineExceeded
SystemLogMonitor KubeletRPCNoSuchContainer
SystemLogMonitor CNICannotStatFS
SystemLogMonitor PLEGUnhealthy
SystemLogMonitor KubeletStart
SystemLogMonitor DockerStart
SystemLogMonitor ContainerdStart

Dans certains cas, AKS isole et draine automatiquement le nœud pour réduire l’interruption des charges de travail. Pour plus d’informations sur les événements et les actions, consultez la section Drainage automatique des nœuds.

EgressBlocked

La liste des points de terminaison vérifiés par egressBlocked est répertoriée ci-dessous

Remarque

Les points de terminaison réels dépendent du type du cluster et de l’emplacement où il est hébergé (cloud public et clouds airgapped). Consultez la documentation relative à l’accès sortant ici. La documentation concerne les clouds publics

Type Exemple : Remarque
MCR https://mcr.microsoft.com
Microsoft Entra ID (système d'identification de Microsoft) https://login.microsoftonline.com"
Gestionnaire de ressources https://management.azure.com
Paquets https://packages.microsoft.com
Kube Binary https://acs-mirror.azureedge.net/acs-mirror/healthz,https://packages.aks.azure.com/acs-mirror/healthz

Vérifier les conditions et événements de nœud

  • Vérifiez les conditions de nœud et les événements à l’aide de la commande kubectl describe node.

    kubectl describe node my-aks-node
    

    Le résultat doit être similaire à l’exemple de sortie condensée suivant :

    ...
    ...
    
    Conditions:
      Type                          Status  LastHeartbeatTime                 LastTransitionTime                Reason                          Message
      ----                          ------  -----------------                 ------------------                ------                          -------
      VMEventScheduled              False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoVMEventScheduled              VM has no scheduled event
      FrequentContainerdRestart     False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentContainerdRestart     containerd is functioning properly
      FrequentDockerRestart         False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentDockerRestart         docker is functioning properly
      FilesystemCorruptionProblem   False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   FilesystemIsOK                  Filesystem is healthy
      FrequentUnregisterNetDevice   False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentUnregisterNetDevice   node is functioning properly
      ContainerRuntimeProblem       False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:40 +0000   ContainerRuntimeIsUp            container runtime service is up
      KernelDeadlock                False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   KernelHasNoDeadlock             kernel has no deadlock
      FrequentKubeletRestart        False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   NoFrequentKubeletRestart        kubelet is functioning properly
      KubeletProblem                False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   KubeletIsUp                     kubelet service is up
      ReadonlyFilesystem            False   Thu, 01 Jun 2023 19:14:25 +0000   Thu, 01 Jun 2023 03:57:41 +0000   FilesystemIsNotReadOnly         Filesystem is not read-only
      NetworkUnavailable            False   Thu, 01 Jun 2023 03:58:39 +0000   Thu, 01 Jun 2023 03:58:39 +0000   RouteCreated                    RouteController created a route
      MemoryPressure                True    Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 19:16:50 +0000   KubeletHasInsufficientMemory    kubelet has insufficient memory available
      DiskPressure                  False   Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:22 +0000   KubeletHasNoDiskPressure        kubelet has no disk pressure
      PIDPressure                   False   Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:22 +0000   KubeletHasSufficientPID         kubelet has sufficient PID available
      Ready                         True    Thu, 01 Jun 2023 19:16:50 +0000   Thu, 01 Jun 2023 03:57:23 +0000   KubeletReady                    kubelet is posting ready status. AppArmor enabled
    ...
    ...
    ...
    Events:
      Type    Reason                   Age                  From     Message
      ----    ------                   ----                 ----     -------
      Normal  NodeHasSufficientMemory  94s (x176 over 15h)  kubelet  Node aks-agentpool-40622340-vmss000009 status is now: NodeHasSufficientMemory
    

Ces événements sont également disponibles dans Container Insights via KubeEvents.

Mesures

NPD expose également des métriques Prometheus basées sur les problèmes de nœud, que vous pouvez utiliser pour la surveillance et les alertes. Ces métriques sont exposées sur le port 20257 de l’adresse IP du nœud et Prometheus peut les scraper.

L’exemple YAML suivant montre une configuration de scraping que vous pouvez utiliser avec le module complémentaire Azure Prometheus managé en tant que DaemonSet :

kind: ConfigMap
apiVersion: v1
metadata:
  name: ama-metrics-prometheus-config-node
  namespace: kube-system
data:
  prometheus-config: |-
    global:
      scrape_interval: 1m
    scrape_configs:
    - job_name: node-problem-detector
      scrape_interval: 1m
      scheme: http
      metrics_path: /metrics
      relabel_configs:
      - source_labels: [__metrics_path__]
        regex: (.*)
        target_label: metrics_path
      - source_labels: [__address__]
        replacement: '$NODE_NAME'
        target_label: instance
      static_configs:
      - targets: ['$NODE_IP:20257']

L’exemple suivant montre les métriques scrapées :

problem_gauge{reason="UnregisterNetDevice",type="FrequentUnregisterNetDevice"} 0
problem_gauge{reason="VMEventScheduled",type="VMEventScheduled"} 0

Étapes suivantes

Pour plus d’informations sur NPD, consultez la page kubernetes/node-problem-detector.