节点自动恢复是指当集群托管节点池中的节点发生异常时,ACK会自动发起节点恢复操作,使节点保持正常运行状态。当节点池为托管节点池或者节点池开启托管之后,节点池中的节点(Node)会同时开启自动恢复功能。ACK将持续关注托管节点池中的节点状态,并根据不同的异常场景发起恢复操作。本文介绍节点自动恢复的场景和流程。

前提条件

  • 已创建托管节点池或开启托管节点池。具体操作,请参见管理托管节点池
  • 已开启事件中心。具体操作,请参见事件监控

触发条件

注意 节点自动恢复的过程中可能会涉及到节点的排水、替盘等操作,建议数据保存在数据盘中。
ACK会根据节点的运行状态(Condition)等信息判断是否发起自动恢复任务。节点的运行状态可通过执行kubectl describe node命令得到的condition字段查看。当节点的运行状况异常,并且异常持续时间超过了阈值时间之后,ACK会发起节点自动恢复任务,触发条件如下表所示。
运行状态 示例 阈值时间(故障发生多长时间后触发自动恢复任务)
NotReady kubelet进程无响应 180s
DockerHung dockerd无响应 90s

恢复流程

节点的自愈功能包括问题的诊断、恢复决策和恢复任务。

说明 节点诊断依赖NPD组件和事件中心,在使用自愈功能前,需要确保已正确安装NPD和事件中心。
一个完整的恢复流程中,节点会在以下状态流转:
  • 正常:当前节点不存在可被发现的故障。
  • 故障:当前节点发现故障。
  • 修复失败:当前节点在恢复任务后无法恢复。
节点自动恢复.png
  1. 当节点的运行状态发生变化并持续一段时间后,判定该状态符合故障状态,便可认为节点故障。
  2. 当发现节点故障时,ACK会根据故障原因触发对应恢复任务,并记录相应的事件:
    • 当恢复任务完成后,故障状态解除,节点恢复正常状态。
    • 当恢复任务完成后,故障状态依然存在,节点会被置为修复失败状态。
说明
  • 如果一个节点池中存在多个异常节点,自动恢复会以串行的方式逐个恢复,一旦某个节点修复失败,将停止对该节点池中其他故障节点的修复。
  • 如果集群中存在多个节点池,节点池之间的节点自动恢复可以并行执行。
  • 当节点处于修复失败状态时,该节点不会再触发自动恢复操作,直到相应的故障解除,才开始自动恢复功能。

自动恢复事件

ACK在触发自动恢复时,会将相关的事件写入事件中心,可以在事件中心中查看自动恢复的记录和具体操作。
事件原因 事件级别 事件描述
NodeRepairStart Normal 节点开始修复。
NodeRepairAction Normal 节点修复操作,例如:重启Kubelet。
NodeRepairSucceed Normal 节点修复成功。
NodeRepairFailed Warning 节点修复失败。

如遇相关问题,请参见常见问题

NodeRepairIgnore Normal 节点修复跳过,当ECS处于非运行状态时,不对节点进行操作。

常见问题

自动恢复失败怎么办?

因为故障的复杂性,自动恢复任务无法恢复所有的故障场景。当节点自动恢复任务执行失败,或者恢复任务执行完毕后故障并未解除,ACK会将节点标记为修复失败状态。

如果托管节点池中修复某个节点失败,在故障解除之前,该节点池不会再触发自动恢复操作。您可以提交工单申请手动恢复故障。

如何忽略某节点的自动恢复?

如果托管节点池中的某个节点需要暂时忽略自动恢复,您可以为该节点添加以下Label:
alibabacloud.com/repair.policy=disable