

 **帮助改进此页面** 

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

# 自动修复 EKS 集群中的节点
<a name="node-repair"></a>

本主题详细介绍 EKS 自动节点修复的行为以及如何根据您的需求进行配置。EKS 自动节点修复在 EKS Auto Mode 中默认启用，并且可以与 EKS 托管节点组和 Karpenter 一起使用。

下表总结了默认的 EKS 自动节点修复操作，这些操作适用于 EKS Auto Mode 、EKS 托管节点组和 Karpenter 的行为。当使用 EKS Auto Mode 或 Karpenter 时，所有 `AcceleratedHardwareReady` 修复操作均为 `Replace`，只有 EKS 托管节点组支持 `Reboot` 作为修复操作。

有关 EKS 节点监控代理检测到的节点运行状况问题及其相应的节点修复操作的详细列表，请参阅 [使用 EKS 节点监控代理检测节点运行状况问题](node-health-nma.md)。


| 节点状况 | 说明 | 修复等待时间 | 修复操作 | 
| --- | --- | --- | --- | 
|  AcceleratedHardwareReady  |  AcceleratedHardwareReady 表示节点上的加速硬件（GPU、Neuron）是否正常运行。  |  10m  |  更换或重启  | 
|  ContainerRuntimeReady  |  ContainerRuntimeReady 表示容器运行时（containererd 等）是否正常运行并能运行容器。  |  30m  |  Replace（替换）  | 
|  DiskPressure  |  DiskPressure 是一个标准的 Kubernetes 状况，表示节点正在经历磁盘压力（磁盘空间不足或 I/O 过高）。  |  不适用  |  无  | 
|  KernelReady  |  KernelReady 表示内核是否运行正常，无严重错误、死锁或资源耗尽问题。  |  30m  |  Replace（替换）  | 
|  MemoryPressure  |  MemoryPressure 是一个标准的 Kubernetes 状况，表示节点正在经历内存压力（可用内存不足）。  |  不适用  |  无  | 
|  NetworkingReady  |  NetworkingReady 表示节点的网络堆栈（接口、路由、连接）是否正常运行。  |  30m  |  Replace（替换）  | 
|  StorageReady  |  StorageReady 表示节点的存储子系统（磁盘、文件系统、I/O）是否正常运行。  |  30m  |  Replace（替换）  | 
|  Ready  |  Ready 是标准的 Kubernetes 状况，表示节点运行正常并已准备好接收容器组（pod）。  |  30m  |  Replace（替换）  | 

默认情况下，EKS 自动节点修复操作在以下场景中处于禁用状态。在每个场景中，正在进行的节点修复操作仍在继续。有关如何覆盖这些默认设置的信息，请参阅 [配置自动节点修复](#configure-node-repair)。

 **EKS 托管式节点组** 
+ 节点组的节点数量超过五个，并且节点组中超过 20% 的节点运行状况不佳。
+ 集群的可用区转移通过应用程序恢复控制器（ARC）触发。

 **EKS Auto Mode 和 Karpenter** 
+ NodePool 中超过 20% 的节点运行状况不佳。
+ 对于独立的 nodeClaims，集群中有 20% 的节点运行状况不佳。

## 配置自动节点修复
<a name="configure-node-repair"></a>

使用 EKS Auto Mode 时，自动节点修复无法配置，并且始终以与 Karpenter 相同的默认设置启用。

### Karpenter
<a name="configure-node-repair-karpenter"></a>

要将自动节点修复与 Karpenter 结合使用，请启用功能门控 `NodeRepair=true`。您可以通过 Karpenter 部署中的 `--feature-gates` CLI 选项或 `FEATURE_GATES` 环境变量来启用功能门控。有关更多信息，请参阅 [Karpenter](https://karpenter.sh/docs/concepts/disruption/#node-auto-repair) 文档。

### 托管节点组
<a name="configure-node-repair-mng"></a>

您可以在创建新的 EKS 托管节点组时或通过更新现有 EKS 托管节点组来启用自动节点修复。
+  **Amazon EKS 控制台**–为托管节点组选中**启用节点自动修复**复选框。有关更多信息，请参阅 [为集群创建托管式节点组](create-managed-node-group.md)。
+  **AWS CLI**–将 `--node-repair-config enabled=true` 添加到 [https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html](https://docs.aws.amazon.com/cli/latest/reference/eks/create-nodegroup.html) 或 [https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html](https://docs.aws.amazon.com/cli/latest/reference/eks/update-nodegroup-config.html) 命令中。
+  **eksctl**–配置 `managedNodeGroups.nodeRepairConfig.enabled: true`，参见 [eksctl GitHub](https://github.com/eksctl-io/eksctl/blob/main/examples/44-node-repair.yaml) 中的示例。

使用 EKS 托管节点组时，您可以通过以下设置控制节点自动修复行为。

要控制节点自动修复何时停止执行操作，请根据节点组中运行状况不佳节点的数量设置一个阈值。设置绝对数量或百分比，但不要同时设置两者。


| 设置 | 说明 | 
| --- | --- | 
|   `maxUnhealthyNodeThresholdCount`   |  节点自动修复停止执行操作的运行状况不佳节点的绝对数量。用于限制修复范围。  | 
|   `maxUnhealthyNodeThresholdPercentage`   |  停止节点自动修复的运行状况不佳节点百分比（0-100）。  | 

要控制同时修复的节点数量，您可以配置修复并行度。与运行状况不佳节点阈值一样，设置绝对数量或百分比，但不要同时设置两者。


| 设置 | 说明 | 
| --- | --- | 
|   `maxParallelNodesRepairedCount`   |  可同时修复的最大节点数量。  | 
|   `maxParallelNodesRepairedPercentage`   |  要同时修复的运行状况不佳节点的最大百分比 (0–100)。  | 

使用 `nodeRepairConfigOverrides`，您可以为特定状况自定义修复行为。当您需要对不同问题类型采取不同的修复操作或等待时间时，请使用此功能。

每个覆盖配置都需要以下所有字段：


| 字段 | 说明 | 
| --- | --- | 
|   `nodeMonitoringCondition`   |  节点监控代理报告的节点状况类型。例如：`AcceleratedHardwareReady`、`NetworkingReady`、`StorageReady`、`KernelReady`。  | 
|   `nodeUnhealthyReason`   |  运行状况不佳的具体原因代码。例如：`NvidiaXID31Error`、`IPAMDNotRunning`。  | 
|   `minRepairWaitTimeMins`   |  在节点符合修复条件之前，该情况必须持续的最短时间（以分钟为单位）。使用此选项可以避免因临时问题修复节点。  | 
|   `repairAction`   |  条件满足时采取的操作。有效值：`Replace`（终止并替换节点）、`Reboot`（重新启动节点）或`NoAction`（不执行修复操作）。  | 

以下 AWS CLI 示例创建了一个具有自定义修复设置的节点组。

```
aws eks create-nodegroup \
  --cluster-name my-cluster \
  --nodegroup-name my-nodegroup \
  --node-role arn:aws:iam::111122223333:role/NodeRole \
  --subnets subnet-0123456789abcdef0 \
  --node-repair-config '{
    "enabled": true,
    "maxUnhealthyNodeThresholdPercentage": 10,
    "maxParallelNodesRepairedCount": 3,
    "nodeRepairConfigOverrides": [
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID64Error",
        "minRepairWaitTimeMins": 5,
        "repairAction": "Replace"
      },
      {
        "nodeMonitoringCondition": "AcceleratedHardwareReady",
        "nodeUnhealthyReason": "NvidiaXID31Error",
        "minRepairWaitTimeMins": 15,
        "repairAction": "NoAction"
      }
    ]
  }'
```

此配置执行以下操作：
+ 启用节点自动修复
+ 当超过 10% 的节点运行状况不佳时，停止修复操作
+ 一次最多修复 3 个节点
+ 覆盖 XID 64 错误（GPU 内存重新映射失败），在 5 分钟后替换节点。默认是在 10 分钟后重启。
+ 覆盖 XID 31 错误（GPU 内存页面故障），不采取任何操作。默认是在 10 分钟后重启。