

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 EKS 节点监控代理检测节点运行状况问题
<a name="node-health-nma"></a>

本主题详细介绍了 EKS 节点监控代理检测到的节点运行状况问题、如何将这些问题显示为节点条件或事件，以及如何配置节点监控代理。

无论是否使用 EKS 自动节点修复，均可使用 EKS 节点监控代理。有关 EKS 自动节点修复的更多信息，请参阅 [自动修复 EKS 集群中的节点](node-repair.md)。

EKS 节点监控代理的源代码发布在 GitHub 上的 [aws/eks-node-monitoring-agent](https://github.com/aws/eks-node-monitoring-agent) 存储库中。

## 节点运行状况问题
<a name="node-health-issues"></a>

下表介绍了节点监控代理可能会检测到的节点运行状况问题。问题有两种类型：
+ 状况 – 需要采取补救措施（例如替换实例或重启实例）的终端问题。启用自动修复后，Amazon EKS 将执行修复操作，可能是替换或重启节点。有关更多信息，请参阅 [节点状况](learn-status-conditions.md#status-node-conditions)。
+ 事件 – 暂时性问题或节点配置不佳问题。不会执行任何自动修复操作。有关更多信息，请参阅 [节点事件](learn-status-conditions.md#status-node-events)。

## AcceleratedHardware 节点运行状况问题
<a name="node-health-AcceleratedHardware"></a>

监控条件是下表中严重性为“状况”的问题的 `AcceleratedHardwareReady`。下表中的事件和条件适用于与 NVIDIA 和 Neuron 相关的节点运行状况问题。


| 名称 | 严重性 | 说明 | 修复操作 | 
| --- | --- | --- | --- | 
| DCGMDiagnosticFailure | 条件 | DCGM 主动诊断测试套件中的测试用例失败。 | 无 | 
| DCGMError | 条件 | 到 DCGM 主机进程的连接已断开或无法建立。 | 无 | 
| DCGMFieldError[Code] | 事件 | DCGM 通过字段标识符检测到 GPU 降级。 | 无 | 
| DCGMHealthCode[Code] | 事件 | DCGM 运行状况检查以非致命方式失败。 | 无 | 
| DCGMHealthCode[Code] | 条件 | DCGM 运行状况检查以致命方式失败。 | 无 | 
| NeuronDMAError | 条件 | DMA 引擎遇到不可恢复的错误。 | Replace（替换） | 
| NeuronHBMUncorrectableError | 条件 | HBM 遇到无法纠正的错误并产生了不正确的结果。 | Replace（替换） | 
| NeuronNCUncorrectableError | 条件 | 检测到无法纠正的 Neuron Core 内存错误。 | Replace（替换） | 
| NeuronSRAMUncorrectableError | 条件 | 片上 SRAM 遇到奇偶校验错误并产生了不正确的结果。 | Replace（替换） | 
| NvidiaDeviceCountMismatch | 事件 | 通过 NVML 可见的 GPU 数量与文件系统中的 NVIDIA 设备计数不一致。 | 无 | 
| NvidiaDoubleBitError | 条件 | GPU 驱动程序产生了双比特错误。 | Replace（替换） | 
| NvidiaNCCLError | 事件 | NVIDIA Collective Communications 库中出现段错误 (`libnccl`)。 | 无 | 
| NvidiaNVLinkError | 条件 | GPU 驱动程序报告了 NVLink 错误。 | Replace（替换） | 
| NvidiaPCIeError | 事件 | 触发 PCIe 重播是为了从传输错误中恢复过来。 | 无 | 
| NvidiaPageRetirement | 事件 | GPU 驱动程序已将内存页标记为停用。如果出现单个双比特错误或在同一地址遇到两个单比特错误，则可能会发生这种情况。 | 无 | 
| NvidiaPowerError | 事件 | GPU 的功率利用率超过了允许的阈值。 | 无 | 
| NvidiaThermalError | 事件 | GPU 的散热状态超过了允许的阈值。 | 无 | 
| NvidiaXID[Code]Error | 条件 | 出现严重的 GPU 错误。 | 更换或重启 | 
| NvidiaXID[Code]Warning | 事件 | 出现了非严重的 GPU 错误。 | 无 | 

## NVIDIA XID 错误代码
<a name="nvidia-xid-codes"></a>

节点监控代理从 GPU 内核日志中检测 NVIDIA XID 错误。XID 错误分为两类：
+  **众所周知的 XID 代码**–关键错误会设置节点条件 (`AcceleratedHardwareReady=False`)，并在启用时触发自动修复。推理代码格式为 `NvidiaXID[Code]Error`。EKS 节点监控代理检测到的众所周知的 XID 代码可能不代表需要修复操作的 NVIDIA XID 代码的完整列表。
+  **未知的 XID 代码**–仅作为 Kubernetes 事件记录。这些不会触发自动修复。推理代码格式为 `NvidiaXID[Code]Warning`。要调查未知的 XID 错误，请使用 `dmesg | grep -i nvrm` 查看内核日志。

有关 XID 错误的更多信息，请参阅《NVIDIA GPU 部署和管理文档》中的 [Xid Errors](https://docs.nvidia.com/deploy/xid-errors/index.html#topic_5_1)**。有关单个 XID 消息的更多信息，请参阅《NVIDIA GPU 部署和管理文档》中的 [Understanding Xid Messages](https://docs.nvidia.com/deploy/gpu-debug-guidelines/index.html#understanding-xid-messages)**。

下表列出了众所周知的 XID 代码、其含义以及启用后的默认节点修复操作（如果启用）。


| XID 代码 | 说明 | 修复操作 | 
| --- | --- | --- | 
| 13 | 图形引擎异常–出现 GPU 图形引擎错误，通常由软件问题或驱动程序错误引起。 | Reboot | 
| 31 | GPU 内存页面错误–应用程序试图访问无法映射或无法访问的 GPU 内存。 | Reboot | 
| 48 | 双位 ECC 错误–GPU 内存中发生无法纠正的双位错误，表示可能出现硬件性能下降。 | Reboot | 
| 63 | GPU 内存重新映射事件–由于检测到错误，GPU 驱动程序重新映射了部分 GPU 内存。这通常是可以恢复的。 | Reboot | 
| 64 | GPU 内存重新映射失败–GPU 无法重新映射有缺陷的内存，这表明存在硬件问题。 | Reboot | 
| 74 | NVLink 错误–GPU 之间的高速 NVLink 互连出现错误。 | Replace（替换） | 
| 79 | GPU 已从总线上掉线–GPU 已无法通过 PCIe 访问，这通常表示硬件故障或电源问题。 | Replace（替换） | 
| 94 | 受控内存错误 – 发生了内存错误，但该错误已被隔离，未影响其他应用程序。 | Reboot | 
| 95 | 未受控内存错误–发生了可能影响其他应用程序或系统内存的内存错误。 | Reboot | 
| 119 | GSP RPC 超时–与 GPU 系统处理器的通信超时，可能是由于固件问题导致。 | Replace（替换） | 
| 120 | GSP 错误–GPU 系统处理器中发生错误。 | Replace（替换） | 
| 121 | C2C 错误–芯片间互连（用于多芯片 GPU）发生错误。 | Replace（替换） | 
| 140 | ECC 未恢复错误–ECC 错误突破了隔离范围，可能导致数据损坏。 | Replace（替换） | 

要查看与 GPU 运行状况相关的当前节点运行状况，请运行以下命令。

```
kubectl get nodes -o custom-columns='NAME:.metadata.name,ACCELERATOR_READY:.status.conditions[?(@.type=="AcceleratedHardwareReady")].status,REASON:.status.conditions[?(@.type=="AcceleratedHardwareReady")].reason'
```

要查看集群中与 XID 相关的事件，请运行以下命令之一。

```
kubectl get events | grep -i "NvidiaXID"
```

## ContainerRuntime 节点运行状况问题
<a name="node-health-ContainerRuntime"></a>

监控条件是下表中严重性为“状况”的问题的 `ContainerRuntimeReady`。


| 名称 | 严重性 | 说明 | 修复操作 | 
| --- | --- | --- | --- | 
| ContainerRuntimeFailed | 事件 | 容器运行时创建容器失败，如果反复发生，则可能与任何报告的问题有关。 | 无 | 
| DeprecatedContainerdConfiguration | 事件 | 使用已弃用映像清单版本 2、架构 1 的容器映像最近通过 `containerd` 拉取到了节点上。 | 无 | 
| KubeletFailed | 事件 | kubelet 处于某个失败状态。 | 无 | 
| LivenessProbeFailures | 事件 | 检测到存活探针失败，如果反复发生，则可能指示应用程序代码问题或超时值不足。 | 无 | 
| PodStuckTerminating | 条件 | 容器组正在或曾经过长时间停滞在正在终止状态，这可能是因 CRI 错误阻止容器组状态进展造成的。 | Replace（替换） | 
| ReadinessProbeFailures | 事件 | 检测到就绪探针失败，如果反复发生，则可能指示应用程序代码问题或超时值不足。 | 无 | 
| [Name]RepeatedRestart | 事件 | systemd 单元频繁重启。 | 无 | 
| ServiceFailedToStart | 事件 | 系统单元启动失败。 | 无 | 

## 节点内核运行状况问题
<a name="node-health-Kernel"></a>

监控条件是下表中严重性为“状况”的问题的 `KernelReady`。


| 名称 | 严重性 | 说明 | 修复操作 | 
| --- | --- | --- | --- | 
| AppBlocked | 事件 | 任务被长时间禁止调度，这通常是由于在输入或输出时被屏蔽所致。 | 无 | 
| AppCrash | 事件 | 节点上的应用程序已崩溃。 | 无 | 
| ApproachingKernelPidMax | 事件 | 根据当前 `kernel.pid_max` 设置，进程数量已接近可用 PID 的最大数量，之后将无法启动更多进程。 | 无 | 
| ApproachingMaxOpenFiles | 事件 | 按照当前内核设置，打开的文件数已接近可能打开的最大文件数，之后打开新文件将失败。 | 无 | 
| ConntrackExceededKernel | 事件 | 连接跟踪超出内核的最大值且无法建立新连接可能会导致数据包丢失。 | 无 | 
| ExcessiveZombieProcesses | 事件 | 无法完全回收的进程正在大量积累，这指示存在应用程序问题，并且可能导致达到系统进程限制。 | 无 | 
| ForkFailedOutOfPIDs | 条件 | 由于系统进程 ID 或内存不足，fork 或 exec 调用失败，这可能是僵尸进程或物理内存耗尽造成的。 | Replace（替换） | 
| KernelBug | 事件 | Linux 内核本身检测到并报告了内核错误，但这有时可能是由节点的 CPU 或内存使用率过高，导致事件处理延迟造成的。 | 无 | 
| LargeEnvironment | 事件 | 此进程的环境变量数大于预期，这可能是因许多将 `enableServiceLinks` 设置为 true 的服务造成的，因为这可能导致性能问题。 | 无 | 
| RapidCron | 事件 | cron 作业在此节点上的运行速度超过每五分钟一次，如果该作业消耗大量资源，则可能会影响性能。 | 无 | 
| SoftLockup | 事件 | CPU 在给定时间停滞。 | 无 | 

## 节点联网运行状况问题
<a name="node-health-Networking"></a>

监控条件是下表中严重性为“状况”的问题的 `NetworkingReady`。


| 名称 | 严重性 | 说明 | 修复操作 | 
| --- | --- | --- | --- | 
| BandwidthInExceeded | 事件 | 因入站总带宽超过实例的最大值，导致数据包已排队或被丢弃。 | 无 | 
| BandwidthOutExceeded | 事件 | 因出站总带宽超过实例的最大值，导致数据包已排队或被丢弃。 | 无 | 
| ConntrackExceeded | 事件 | 连接跟踪超出实例的最大值且无法建立新连接，这可能会导致数据包丢失。 | 无 | 
| EFAErrorMetric | 事件 | EFA 驱动程序指标显示存在性能下降的接口。 | 无 | 
| IPAMDInconsistentState | 事件 | 磁盘上 IPAMD 检查点的状态不反映容器运行时中的 IP。 | 无 | 
| IPAMDNoIPs | 事件 | IPAMD 的 IP 地址已用完。 | 无 | 
| IPAMDNotReady | 条件 | IPAMD 无法连接到 API 服务器。 | Replace（替换） | 
| IPAMDNotRunning | 条件 | 未发现 Amazon VPC CNI 进程正在运行。 | Replace（替换） | 
| IPAMDRepeatedlyRestart | 事件 | IPAMD 服务已多次重启。 | 无 | 
| InterfaceNotRunning | 条件 | 此接口似乎未运行或存在网络问题。 | Replace（替换） | 
| InterfaceNotUp | 条件 | 此接口似乎未启动或存在网络问题。 | Replace（替换） | 
| KubeProxyNotReady | 事件 | Kube-proxy 无法观察或列出资源。 | 无 | 
| LinkLocalExceeded | 事件 | 由于到本地代理服务的流量 PPS 超出网络接口的最大值，数据包被丢弃。 | 无 | 
| MACAddressPolicyMisconfigured | 事件 | systemd-networkd 链接配置的值 `MACAddressPolicy` 不正确。 | 无 | 
| MissingDefaultRoutes | 事件 | 缺少默认路由规则。 | 无 | 
| MissingIPRoutes | 事件 | 容器组（pod）IP 缺少路由。 | 无 | 
| MissingIPRules | 事件 | 容器组（pod）IP 缺少规则。 | 无 | 
| MissingLoopbackInterface | 条件 | 此实例缺少环回接口，导致服务失败，具体取决于本地连接。 | Replace（替换） | 
| NetworkSysctl | 事件 | 此节点的网络 `sysctl` 设置可能不正确。 | 无 | 
| PPSExceeded | 事件 | 因双向 PPS 超过实例的最大值，数据包已排队或被丢弃。 | 无 | 
| PortConflict | 事件 | 如果容器组（pod）使用 hostPort，则可能写入会覆盖主机已经绑定端口的 `iptables` 规则，这可能会阻止 API 服务器访问 `kubelet`。 | 无 | 
| UnexpectedRejectRule | 事件 | 在 `iptables` 中发现了可能阻止预期流量的异常 `REJECT` 或 `DROP` 规则。 | 无 | 

## 节点存储运行状况问题
<a name="node-health-Storage"></a>

监控条件是下表中严重性为“状况”的问题的 `StorageReady`。


| 名称 | 严重性 | 说明 | 修复操作 | 
| --- | --- | --- | --- | 
| EBSInstanceIOPSExceeded | 事件 | 已超过实例的最大 IOPS。 | 无 | 
| EBSInstanceThroughputExceeded | 事件 | 已超过实例的最大吞吐量。 | 无 | 
| EBSVolumeIOPSExceeded | 事件 | 已超过特定 EBS 卷的最大 IOPS。 | 无 | 
| EBSVolumeThroughputExceeded | 事件 | 已超过特定 Amazon EBS 卷的最大吞吐量。 | 无 | 
| EtcHostsMountFailed | 事件 | 由于在 `kubelet-container` 操作过程中进行了用户数据重新挂载 `/var/lib/kubelet/pods`，因此挂载 kubelet 生成的 `/etc/hosts` 失败。 | 无 | 
| IODelays | 事件 | 在进程中检测到输入或输出延迟，如果过长，则可能表明预调配的输入输出读写操作次数不足。 | 无 | 
| KubeletDiskUsageSlow | 事件 | `kubelet` 报告在尝试访问文件系统时磁盘使用率降低。这可能表示磁盘输入输出不足或存在文件系统问题。 | 无 | 
| XFSSmallAverageClusterSize | 事件 | XFS 平均集群大小很小，这表示可用空间碎片过多。这可能会阻止文件创建，尽管有索引节点或可用空间可用。 | 无 | 

## 配置节点监控代理
<a name="node-monitoring-agent-configure"></a>

EKS 节点监控代理以 DaemonSet 形式部署。当将其作为 EKS 插件部署时，您可以通过以下配置值自定义安装。有关默认配置，请参阅 EKS 节点监控代理 [Helm 图表](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)。


| 配置选项 | 说明 | 
| --- | --- | 
|  `monitoringAgent.resources.requests.cpu`  | 监控代理的 CPU 资源请求。 | 
|  `monitoringAgent.resources.requests.memory`  | 监控代理的内存资源请求。 | 
|  `monitoringAgent.resources.limits.cpu`  | 监控代理的 CPU 资源限制。 | 
|  `monitoringAgent.resources.limits.memory`  | 监控代理的内存资源限制。 | 
|  `monitoringAgent.tolerations`  | 在受污染节点上调度监控代理的容差。 | 
|  `monitoringAgent.additionalArgs`  | 要传递给监控代理的其他命令行参数。 | 

**注意**  
您可以通过 EKS 插件或 Helm 安装将 `hostname-override` 和 `verbosity` 配置为 `monitoringAgent.additionalArgs`。目前，您无法通过 EKS 插件或 Helm 安装的额外参数来自定义节点监控代理的 `probe-address`（`8002`）或 `metrics-address`（`8003`）。

节点监控代理包含一个用于监控 NVIDIA GPU 的 NVIDIA DCGM（数据中心 GPU 管理器）服务器组件（`nv-hostengine`）。此组件仅在属于 NVIDIA GPU 实例类型的节点上运行，如代理的 [Helm 图表](https://github.com/aws/eks-node-monitoring-agent/blob/main/charts/eks-node-monitoring-agent/values.yaml)中的 `nodeAffinity` 所示。您无法将现有的 NVIDIA DCGM 安装与 EKS 节点监控代理配合使用，如有此功能需求，请通过 EKS 路线图 [GitHub issue \#2763 ](https://github.com/aws/containers-roadmap/issues/2763)提供反馈。

当您将 EKS 节点监控代理作为 EKS 附加组件部署时，可以通过以下配置值自定义 NVIDIA DCGM 的安装。


| 配置选项 | 说明 | 
| --- | --- | 
|  `dcgmAgent.resources.requests.cpu`  | DCGM 代理的 CPU 资源请求。 | 
|  `dcgmAgent.resources.requests.memory`  | DCGM 代理的内存资源请求。 | 
|  `dcgmAgent.resources.limits.cpu`  | DCGM 代理的 CPU 资源限制。 | 
|  `dcgmAgent.resources.limits.memory`  | DCGM 代理的内存资源限制。 | 
|  `dcgmAgent.tolerations`  | 在受污染节点上调度 DCGM 代理的容忍度。 | 

您可以使用以下 AWS CLI 命令来获取有关 EKS 节点监控代理 EKS 附加组件的版本和架构的有用信息。

获取适用于您的 Kubernetes 版本的最新代理附加组件版本。将 `1.35` 替换为您的 Kubernetes 版本。

```
aws eks describe-addon-versions \
  --addon-name eks-node-monitoring-agent \
  --kubernetes-version 1.35 \
  --query='addons[].addonVersions[].addonVersion'
```

获取 EKS 附加组件中支持的代理附加组件架构。将 `v1.5.1-eksbuild.1` 替换为您的代理版本。

```
aws eks describe-addon-configuration \
  --addon-name eks-node-monitoring-agent \
  --addon-version v1.5.1-eksbuild.1
```