# 节点自愈功能
节点自愈是CCE提供的节点故障自动恢复能力。当节点发生指定类型的故障且持续时间超过阈值时，系统将自动触发自愈任务，通过重启节点等方式尝试修复故障，减少人工干预，提升集群可用性。
#### 前提条件
高级自愈依赖以下条件：
- 已创建Kubernetes集群，且集群版本满足以下要求：
  - v1.30集群：v1.30.14-r100及以上版本
  
  - v1.31集群：v1.31.14-r60及以上版本
  
  - v1.32集群：v1.32.13-r30及以上版本
  
  - v1.33集群：v1.33.12-r10及以上版本
  
  - v1.34集群：v1.34.8-r10及以上版本
  
  - v1.35集群：v1.35.5-r10及以上版本
  
  - v1.36集群：v1.36.2-r0及以上版本
  
  - 其他更高版本的集群
   
- 安装NPD 插件（节点故障检测插件）。
 
#### 注意事项
- 重启节点会导致该节点上所有Pod被驱逐或中断，请确保业务已具备高可用部署能力。
- 若自愈任务执行后故障仍未恢复，系统不会无限重试，需人工排查根因。
- 如果某个节点自愈失败，在故障修复前，该节点池不会再触发重启节点的自愈操作。
- 同一节点池内，同一时刻仅允许一个节点执行重启自愈任务。
- 节点完成重启自愈后，2小时内不再对该节点触发重启自愈。
- 裸金属节点和超节点不支持节点自愈功能。
 
#### 核心原理
自愈能力由守护进程与Systemd服务管理器协同实现，整体流程如下：
1. **定时健康探测**：守护进程常驻后台，按预设周期向目标组件发起健康检查，探测方式包括进程存活检测和端口响应探测。
2. **异常判定**：当组件在连续多次探测中均未响应或返回错误状态时，守护进程判定组件异常。单次探测失败不会触发自愈，避免因网络抖动等瞬时干扰导致误重启。
3. **触发自愈**：判定异常后，守护进程通过调用Systemd执行服务重启，使组件自动恢复。
若开启了"系统与K8s组件异常时允许重启节点"，在组件重启未能恢复故障时，系统将进入节点级自愈流程。
#### 自愈流程
自愈任务触发后，系统按以下步骤依次执行：
1. **标记节点为修复中**：将节点状态标记为"修复中"，调度器停止向该节点调度新的Pod。
2. **驱逐节点Pod**：为节点添加驱逐污点（Taint），触发节点上已有Pod的优雅驱逐。已配置容忍该污点的Pod不受影响。超时时间取故障节点上所有待驱逐Pod的TerminationGracePeriodSeconds最大值与10分钟中的较大值，且最长不超过30分钟。超过超时时间后，如果驱逐失败，仍会执行后续操作。
3. **重启节点**：对节点执行重启操作，尝试恢复故障组件。
4. **确认故障是否恢复** ：重启完成后，系统检测故障是否已恢复。
   - 恢复成功：移除驱逐污点，节点状态恢复正常，重新接受Pod调度。
   
   - 恢复失败：节点保持异常状态，自愈任务标记为失败，需人工介入排查。
    
 
#### 故障类型
表1基础自愈支持的故障类型 
| 故障类型                                        | 说明                                                   | 阈值    | 自愈行为                 |
|:---|:---|:---|:---|
| 容器网络组件异常CNIProblem                        | 节点网络组件异常，将影响新建Pod。                                    | 50s  | 重启网络组件               |
| Kubelet服务异常KubeletProblem                  | kubelet进程不可用或运行异常，无法正常上报节点状态。                      | 50s  | 重启kubelet             |
| 容器运行时组件异常CRIProblem                       | 容器运行时进程异常，导致容器无法正常创建或管理。                          | 50s | 重启containerd/docker |
| KubeProxy异常KubeProxyProblem              | 检测到KubeProxy运行异常。                                   | 50s  | 重启kube-proxy         |
| PodIdentityAgent异常PodIdentityAgentProblem | PodIdentityAgent状态异常，可能影响CCE插件以及依赖Pod Identity的服务运行。 | 50s  | 重启pod-identity-agent  |
   
表2高级自愈支持的故障类型 
| 故障类型                                                                                  | 说明                                                   | 阈值 | 自愈行为                                                                                              |
|:---|:---|:---|:---|
| 容器网络组件异常CNIProblem                                                                    | 节点网络组件异常，将影响新建Pod。                                    | 50s | 重启网络组件                                                                                             |
| Kubelet服务异常KubeletProblem                                                              | kubelet进程不可用或运行异常，无法正常上报节点状态。                        | 180s  | 1. 重启kubelet（50s触发） 2. 若已开启"系统与K8s组件异常时允许重启节点"，则重启ECS实例。            |
| 容器运行时组件异常CRIProblem                                                                   | 容器运行时进程异常，导致容器无法正常创建或管理。                             | 180s   | 1. 重启containerd/docker（50s触发） 2. 若已开启"系统与K8s组件异常时允许重启节点"，则重启ECS实例。 |
| KubeProxy异常KubeProxyProblem                                                          | 检测到KubeProxy运行异常。                                    | 50s  | 重启kube-proxy                                                                                      |
| PodIdentityAgent异常PodIdentityAgentProblem                                             | PodIdentityAgent状态异常，可能影响CCE插件以及依赖Pod Identity的服务运行。 | 50s  | 重启pod-identity-agent                                                                              |
| 文件系统只读ReadonlyFilesystemProblem（依赖NPD插件版本大于等于1.19.75）                                 | 节点文件系统进入只读状态，无法执行写入操作，影响kubelet及容器运行时正常工作。             | 180s | 若已开启"系统与K8s组件异常时允许重启节点"，则重启ECS实例。                                                                   |
| systemd异常SystemdOfflineProblem （依赖NPD插件版本大于等于1.19.75） | systemd状态异常，无法启动、销毁容器。                               | 180s | 若已开启"系统与K8s组件异常时允许重启节点"，则重启ECS实例。                                                                  |
| kubeletNotReady（PLEG）                                                                  | PLEG健康检查失败。                                          | 180s  | 若已开启"系统与K8s组件异常时允许重启节点"，则重启ECS实例。                                                                   |
   
#### 相关文档
- 如需了解CCE节点故障检测插件的约束、安装及组件信息，请参见[CCE节点故障检测](https://support.huaweicloud.com/usermanual-cce/cce_10_0132.html)。
 
#### 常见问题
#### 重启失败
- 失败信息示例
  ```
  auto repair for kubelet failed: reboot job xxx failed: instance not found
  auto repair for container runtime (containerd/docker) failed: reboot job xxx failed: internal server error
  ```
  
- 原因分析 CCE已下发节点重启指令，但由于ECS层面异常（如实例状态异常、底层硬件故障等），导致重启操作未能实际执行。
  
- 处理步骤
  1. 登录ECS控制台，找到对应节点，手动执行重启操作，并观察节点是否恢复正常。
  
  2. 若ECS侧重启仍然失败，说明可能存在底层资源问题，请提交工单联系技术支持人员协助处理。
   
 
#### 节点重启后故障未恢复
- 失败信息示例
  ```
  auto repair for read-only filesystem failed: node not recovered in 15m0s
  auto repair for kubelet PLEG failed: node not recovered in 15m0s
  ```
  
- 原因分析 节点重启后故障依然存在，说明问题并非由临时性异常引起，而是存在更底层的系统性故障（如磁盘损坏、内核异常、系统文件损坏等），单纯重启无法修复。
  
- 处理步骤
  1. 对故障节点执行**重置节点** 操作，将节点操作系统重装为初始状态并重新加入集群。详情请参见[重置节点](https://support.huaweicloud.com/usermanual-cce/cce_10_0003.html)。
     ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
     - 确认节点上无不可迁移的有状态数据，或已完成数据备份；
     
     - 重置会销毁节点上所有Pod，请确保业务已具备高可用部署或已做好驱逐准备。
       
  
  2. 重置完成后，确认节点正常加入集群且Pod可正常调度运行。
  
  3. 若重置后故障依旧，说明底层硬件可能存在不可逆损坏，请提交工单联系技术支持人员。
   
 
#### 节点自愈后残留node.cce.io/repair污点
- 问题现象 节点状态已恢复为"运行中"，但仍存在node.cce.io/repair污点，导致新Pod无法调度至该节点。
  
- 原因分析 节点重启后，节点状态先恢复为可用，但部分组件尚未完全就绪，系统保留污点以防止业务调度到未就绪的节点。
  
- 处理步骤 检查节点上的组件是否都恢复正常，如果组件都恢复正常，可以手动去除污点恢复节点调度。如果未恢复，请提交工单联系技术支持人员。
  
 
