节点池开启托管能力后,支持启用节点自愈功能,即由ACK自动监控节点状态,并在节点发生异常时自动执行自愈任务,以简化节点运维工作。但由于故障的复杂性,自愈任务无法修复所有的故障场景,部分复杂故障可能仍需人工修复。
执行流程
一个完整的故障发现、故障通知与节点自愈流程如下。
- 故障诊断与发现 - ACK通过ack-node-problem-detector(NPD)组件检查节点的异常情况。节点运行状态发生变化并持续一段时间后,ACK判定该节点存在故障。 
- 故障通知 - 发现故障后,ACK会产生Node Condition和Kubernetes Event。您可以通过事件中心告警配置接收通知。 
- (独占GPU场景)故障隔离 - 检测到GPU异常后,ACK对故障GPU卡进行隔离。 - 关于GPU卡故障检测和自动隔离的详细信息请参见GPU故障检测与自动隔离。 
- 执行节点自愈流程 - 系统与K8s组件异常 - 节点实例异常 - ACK对异常的系统与K8s组件进行修复,例如重启kubelet、重启运行时等。 
- 如果开启了系统与 K8s 组件异常时允许重启节点,当修复动作无效时,ACK继续执行以下操作: - ACK自动将故障节点设置为不可调度。 
- ACK针对需要重启的故障节点执行排水。 
- ACK重启节点。 
- 检测节点状态恢复正常时,ACK将故障节点恢复为可调度。 
 
 - 详细流程说明请参见下文的系统与K8s组件异常。 - ACK自动为故障节点添加污点。 
- 如果开启了节点实例异常时等待授权后修复,ACK会等待您授权同意后再执行后续操作。 
- ACK针对需要重启或更换设备的故障节点执行排水。 
- ACK执行自愈行为,例如节点重启、节点维修等,节点状态为修复中。 
- (独占GPU场景)检测GPU卡恢复正常时,ACK解除对GPU卡的隔离。 
- 检测节点状态恢复正常时,ACK删除此前添加的节点污点。 
 - 详细流程说明请参见下文的节点实例异常。 
- 如果集群中存在多个节点池,各节点池的自愈任务将串行执行。 
- 如果一个节点池存在多个异常节点,自愈任务会以串行的方式逐个恢复。一旦某个节点自愈失败,ACK会停止对该节点池中其他故障节点的自愈。 
使用说明
- 本功能需搭配事件中心使用,以接收节点池的告警事件,并安装ack-node-problem-detector,以检测节点的异常情况。详情请参见事件监控。 
- 本功能仅支持在ACK托管集群中使用,支持开启了托管配置的节点池和灵骏节点池。 
- 以下处于灰度发布中的功能,灰度进度可能不同。如需使用,请提交工单一并申请。 
配置节点自愈
您可以在新增或存量节点池中通过托管配置开启节点自愈功能并定义其行为。
节点池和灵骏节点池的开启步骤类似。以下步骤以节点池为例。
创建节点池时开启
存量节点池中开启
系统与K8s组件异常
自愈流程
ACK会根据节点的运行状态condition等信息判断是否发起自愈任务。您可以执行kubectl describe node命令,在condition字段查看节点的运行状态。
检测到系统与K8s组件异常时,且异常持续时间超过阈值时间(即故障发生多长时间后会触发节点自愈)时,ACK将自动执行自愈任务。系统与K8s组件异常场景下,一个完整的节点自愈流程如下。
- ACK对异常系统和K8s组件进行维修,例如重启kubelet、重启运行时等。 
- 如果开启了系统与 K8s 组件异常时允许重启节点,当修复动作无效时,ACK继续执行以下操作。 - ACK自动将故障节点设置为不可调度。 
- ACK针对需要重启的故障节点执行排水。排水超时时间为30分钟。 - ACK执行节点排水操作时,会在遵循Pod Disruption Budget(PDB)的前提下将节点上的Pod驱逐至其他可用节点。为确保服务高可用性,建议您采用多副本部署策略,将工作负载分散在多个节点上,同时为关键业务配置PDB,控制同时中断的Pod数量。 - 如排水失败,ACK仍会执行后续操作。 
- ACK重启节点。 
- 检测节点状态恢复正常时,ACK将故障节点恢复为可调度。 - 如果某节点在执行节点自愈前已被设置为不可调度,那么在自愈任务完成后,该节点不会自动恢复为可调度。 
 
触发自愈的Node Condition
| Node Condition | 描述 | 风险等级 | 阈值时间 | 自愈行为 | 
| KubeletNotReady(KubeletHung) | kubelet意外停止工作,导致节点NotReady。 | 高 | 180s | 
 | 
| KubeletNotReady(PLEG) | PLEG健康检查失败,导致节点NotReady。 | 中 | 180s | 
 | 
| KubeletNotReady(SandboxError) | PodSandbox not found,导致kubelet无法正常启动。 | 高 | 180s | 
 | 
| RuntimeOffline | containerd或Docker停止工作,节点不可用。 | 高 | 90s | 
 | 
| NTPProblem | 时间同步服务(ntpd或chronyd)异常。 | 高 | 10s | 重启ntpd或chronyd。 | 
| SystemdOffline | Systemd状态异常,无法启动、销毁容器。 | 高 | 90s | 如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。 | 
| ReadonlyFilesystem | 节点文件系统变为只读。 | 高 | 90s | 如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。 | 
节点实例异常
请确保已参见前文的使用说明完成准备工作。
自愈流程
当灵骏节点发生故障需要硬件维修时,维修过程将重新部署灵骏节点并清空本地盘所有数据。在此场景下,推荐您为节点池开启节点实例异常时等待授权后修复,在授权维修前完成数据备份。
节点实例异常场景下,一个完整的节点自愈流程如下。
ACK会在节点实例异常发生5分钟后自动触发下方的节点自愈流程。
- 发现异常后,ACK为故障节点添加如下污点: - Key: alibabacloud.com/node-needrepair 
- Value: Unschedulable 
- Effect: NoSchedule 
 
- 如果开启了节点实例异常时等待授权后修复,ACK会等待您授权同意后再执行后续操作。 - 如需先对异常节点运行的业务进行处理,建议开启节点实例异常时等待授权后修复。ACK会在您授权同意后再开始修复。 - ACK自动为故障节点添加Label - alibabacloud.com/node-needrepair=Inquiring。
- 您可以先对异常节点上运行的业务Pod进行处理或提前备份业务数据。处理完成后,您可以通过删除Label - alibabacloud.com/node-needrepair或将Label的Value设置为- Approved(- alibabacloud.com/node-needrepair=Approved)来进行授权。
- ACK接收您的授权同意后,继续执行后续操作。 
 
- 如未开启节点实例异常时等待授权后修复,ACK会在发现异常后自动执行后续操作。 
- ACK执行节点排水。排水超时时间为30分钟。 - ACK执行节点排水操作时,会在遵循Pod Disruption Budget(PDB)的前提下将节点上的Pod驱逐至其他可用节点。为确保服务高可用性,建议您采用多副本部署策略,将工作负载分散在多个节点上,同时为关键业务配置PDB,控制同时中断的Pod数量。 - 如排水失败,ACK仍会执行后续操作。 
- ACK执行自愈行为,例如节点重启、硬件维修等。 
- ACK检测节点状态是否恢复正常。 - 如故障状态解除,则删除此前添加的污点。节点状态恢复正常。 
- 如故障状态未解除或自愈异常,此前添加的节点污点不会删除。ACK会定期发送Event通知。您看可查看Event处理, 或提交工单。 
 
- (独占GPU场景)检测GPU卡恢复正常时,ACK解除对GPU卡的隔离。 
触发自愈的Node Condition
| Node Condition | 描述 | 自愈行为 | 
| NvidiaXID74Error | 
 | 硬件维修。 | 
| NvidiaXID79Error | 
 | 硬件维修。 | 
| NvidiaRemappingRowsFailed | GPU存在行重映射失败。 | 硬件维修。 | 
| NvidiaDeviceLost | 
 | 硬件维修。 | 
| NvidiaInfoRomCorrupted | 
 | 硬件维修。 | 
| NvidiaPowerCableErr | 
 | 硬件维修。 | 
| NvidiaXID95Error | 
 | 重启节点。 | 
| NvidiaXID48Error | 
 | 重启节点。 | 
| NvidiaXID119Error | 
 | 重启节点。 | 
| NvidiaXID140Error | 
 | 重启节点。 | 
| NvidiaXID120Error | 
 | 重启节点。 | 
| NvidiaPendingRetiredPages | 
 | 重启节点。 | 
| NvidiaRemappingRowsRequireReset | GPU遇到了无法纠正的、未包含的错误,需要通过重置GPU进行恢复。为了恢复操作,应该尽快重置GPU。 | 重启节点。 | 
| NvidiaXID44Error | 
 | 重启节点。 | 
| NvidiaXID61Error | 
 | 重启节点。 | 
| NvidiaXID62Error | 
 | 重启节点。 | 
| NvidiaXID69Error | 
 | 重启节点。 | 
关于上述项目的更多信息,例如产生的Node Condition、是否产生Event等,请参见GPU故障检测与自动隔离。
自愈过程中的节点状态
- 自愈任务执行中,节点状态为修复中。 
- 自愈任务完成后,故障状态解除,节点恢复正常状态。 
- 自愈任务完成后,故障状态依然存在,节点会被置为恢复失败状态。 - 节点处于自愈失败状态时,不会再触发自愈操作。相应的故障解除后,该节点才能再次进行自愈操作。 
查看节点自愈事件
常见问题
节点自愈失败怎么办?
由于故障的复杂性,自愈任务无法修复所有的故障场景。当节点自愈任务执行失败,或者自愈执行完毕后故障并未解除,ACK会将节点标记为自愈失败状态。
如果某个节点自愈失败,在故障修复前,该节点池不会再触发自愈操作。您可以提交工单联系技术支持。
相关文档
- 推荐启用NPD,基于事件中心监控集群事件,请参见事件监控。 
- 关于GPU故障检测的更多信息,请参见GPU故障检测与自动隔离、自助诊断GPU节点问题。 
- 如需通过移除故障节点并重新添加的方式解决节点问题,请在容器服务管理控制台执行标准化流程,避免出现预期外行为,详情请参见移除节点、添加已有节点。 

 > 开启托管(节点池)或托管配置(托管节点池),选择托管配置模式为托管节点池,开启节点自愈功能,选择修复系统与K8s组件异常时是否重启节点,修复节点实例异常时是否需要等待授权后修复,并按照页面提示完成配置的提交。
 > 开启托管(节点池)或托管配置(托管节点池),选择托管配置模式为托管节点池,开启节点自愈功能,选择修复系统与K8s组件异常时是否重启节点,修复节点实例异常时是否需要等待授权后修复,并按照页面提示完成配置的提交。