Azure Kubernetes 服务 (AKS) 节点中的节点问题检测器 (NPD)

节点问题检测器 (NPD) 是一个开源 Kubernetes 组件,用于检测与节点相关的问题并报告这些问题。 它作为系统服务在群集中的每个节点上运行,并收集各种指标和系统信息,例如 CPU 使用率、磁盘使用率和网络连接性。 检测到问题时,它会生成事件和/或节点条件。 Azure Kubernetes 服务 (AKS) 使用 NPD 监视和管理在 Azure 云平台上运行的 Kubernetes 群集中的节点。 默认情况下,AKS Linux 扩展启用 NPD。

备注

升级到 NPD 的操作独立于节点映像和 Kubernetes 版本升级过程。 如果节点池运行不正常(即处于失败状态),则不会安装新的 NPD 版本。

节点条件

节点条件指示导致节点不可用的永久性问题。 AKS 使用 NPD 中的以下节点条件来公开节点上的永久性问题。 NPD 还会发出相应的 Kubernetes 事件。

问题守护程序类型 节点条件 原因
自定义插件监视器 (CustomPluginMonitor) 文件系统损坏问题 检测到文件系统损坏
自定义插件监视器 (CustomPluginMonitor) Kubelet问题 KubeletIsDown
自定义插件监视器 (CustomPluginMonitor) 容器运行时问题 容器运行时已停止
自定义插件监视器 (CustomPluginMonitor) VMEventScheduled VMEventScheduled
自定义插件监视器 (CustomPluginMonitor) 频繁注销网络设备 UnregisterNetDevice
自定义插件监视器 (CustomPluginMonitor) 频繁Kubelet重启 FrequentKubeletRestart
自定义插件监视器 (CustomPluginMonitor) 频繁容器重启 FrequentContainerdRestart
自定义插件监视器 (CustomPluginMonitor) 频繁Docker重启 Docker频繁重启
系统日志监控器 内核死锁 DockerHung
系统日志监控器 ReadonlyFilesystem 文件系统是只读的

事件

NPD 发出包含相关信息的事件,以帮助诊断基础问题。

问题守护程序类型 原因 频率 DESCRIPTION 行动
自定义插件监视器 (CustomPluginMonitor) 出口被阻挡 30 分钟 此事件检查与外部终结点的连接 检查防火墙或 NSG 是否阻止了与被标记终结点的连接
自定义插件监视器 (CustomPluginMonitor) 检测到文件系统损坏 5 分钟 这会检查由 docker 所发现的文件系统损坏情况。
自定义插件监视器 (CustomPluginMonitor) KubeletIsDown 30 秒 这会检查 kubelet 服务是否正在运行且正常
自定义插件监视器 (CustomPluginMonitor) 容器运行时已停止 30 秒 此事件检查容器运行时(例如:containerd)是否正在运行且正常
自定义插件监视器 (CustomPluginMonitor) FreezeScheduled 1 分钟 此事件检查节点上是否计划有冻结事件。 有关详细信息,请查看https://aka.ms/aks/scheduledevents
自定义插件监视器 (CustomPluginMonitor) 计划重启 1 分钟 此事件会检查节点上是否有计划的重新启动事件,检查https://aka.ms/aks/scheduledevents以获取详细信息。
自定义插件监视器 (CustomPluginMonitor) 重新部署计划 1 分钟 此事件检查是否在节点上计划了重新部署事件。 有关详细信息,请查看https://aka.ms/aks/scheduledevents
自定义插件监视器 (CustomPluginMonitor) 终止计划 1 分钟 此事件检查节点上是否已安排终止事件。 有关详细信息,请查看https://aka.ms/aks/scheduledevents
自定义插件监视器 (CustomPluginMonitor) 抢占计划 2秒 该事件检查节点上是否安排了抢占事件。 有关详细信息,请查看https://aka.ms/aks/scheduledevents
自定义插件监视器 (CustomPluginMonitor) DNSProblem
系统日志监控器 OOMKilling
系统日志监控器 TaskHung
系统日志监控器 注销网络设备
系统日志监控器 KernelOops
系统日志监控器 DockerSocket无法连接
系统日志监控器 KubeletRPC截止期限超时
系统日志监控器 KubeletRPCNoSuchContainer
系统日志监控器 CNICannotStatFS
系统日志监控器 PLEGUnhealthy
系统日志监控器 KubeletStart
系统日志监控器 DockerStart
系统日志监控器 ContainerdStart

在某些情况下,AKS 会自动封锁并排出节点,以最大程度地减少工作负载的中断。 有关事件和操作的详细信息,请参阅 Node autodrain

出口被阻挡

下面列出了 EgressBlocked 检查的终结点

备注

实际终结点将取决于群集的类型及其托管位置(公有云与 Airgapped 云)。 在此处查看有关出站访问的文档。 文档适用于公有云

类型 示例: 注意
MCR https://mcr.azk8s.cn
Microsoft Entra 身份识别系统 https://login.partner.microsoftonline.cn"
资源管理器 https://management.chinacloudapi.cn
包裹 https://packages.microsoft.com
Kube Binary https://acs-mirror.azureedge.net/acs-mirror/healthz、https://packages.aks.azure.com/acs-mirror/healthz

检查节点条件和事件

  • 使用 kubectl describe node 命令检查节点条件和事件。

    kubectl describe node my-aks-node
    

    输出应该类似于以下示例简洁输出:

    ...
    ...
    
    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
    

这些事件也通过 KubeEvents容器见解中提供。

指标

NPD 还根据节点问题公开 Prometheus 指标,以用于监视和警报。 节点 IP 的 20257 端口公开了了这些指标,Prometheus 可以抓取它们。

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']

以下示例显示了已抓取的指标:

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

后续步骤

有关 NPD 的详细信息,请参阅 kubernetes/node-problem-detector