节点池开启托管能力后,支持启用节点自愈功能,即由ACK自动监控节点状态,并在节点发生异常时自动执行自愈任务,以简化节点运维工作。但由于故障的复杂性,自愈任务无法修复所有的故障场景,部分复杂故障可能仍需人工修复。
前提条件
已开启事件中心,以接收节点池的告警事件,并安装ack-node-problem-detector,以检测节点的异常情况,请参见事件监控。
操作步骤
您可以在新增或存量节点池中开启托管节点池配置。如果同时打开了当节点故障时重启节点开关,节点自愈过程中可能涉及节点的排水、替盘等操作。建议将业务数据保存在数据盘中。
创建节点池时开启
存量节点池中开启
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池列表的操作列,单击目标节点池对应的更多 > 托管配置,按照页面提示勾选开启托管节点池,并选择是否打开当节点故障时重启节点开关。
触发条件
ACK会根据节点的运行状态condition
等信息判断是否发起自愈任务。您可以执行kubectl describe node
命令,通过condition
字段查看节点的运行状态。当节点的运行状况异常,且异常持续时间超过阈值时间(即故障发生多长时间后会触发节点自愈)时,ACK会发起节点自愈行为。
节点池会监控节点的运行状态。如果节点超过10分钟未上报节点状态,或者状态为NotReady,ACK会尝试通过重启故障节点来自愈潜在的故障。因此,节点上的Pod会被重启。
具体触发条件如下表所示。
检测项目 | 描述 | 风险等级 | 阈值时间 | 自愈行为 |
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 | 如果打开了当节点故障时重启节点开关,则重启ECS实例。 |
ReadonlyFilesystem | 节点文件系统变为只读。 | 高 | 90s | 如果打开了当节点故障时重启节点开关,则重启ECS实例。 |
节点自愈事件
执行规则与流程
一个完整的节点自愈流程如下:
节点的运行状态发生变化并持续一段时间后,ACK判定该状态符合故障状态,存在节点故障。
发现节点故障时,ACK会根据故障原因触发对应的自愈任务,并记录相应的事件。
自愈任务执行中,节点状态为修复中。
自愈任务完成后,故障状态解除,节点恢复正常状态。
自愈任务完成后,故障状态依然存在,节点会被置为恢复失败状态。
节点处于自愈失败状态时,不会再触发自愈操作。相应的故障解除后,该节点才能再次进行自愈操作。
如果集群中存在多个节点池,各节点池内的节点的自愈任务可以并行执行。
如果一个节点池存在多个异常节点,自愈任务会以串行的方式逐个恢复。一旦某个节点自愈失败,ACK将停止对该节点池中其他故障节点的自愈。
常见问题
节点自愈失败怎么办?
由于故障的复杂性,自愈任务无法修复所有的故障场景。当节点自愈任务执行失败,或者自愈执行完毕后故障并未解除,ACK会将节点标记为自愈失败状态。
如果某个节点自愈失败,在故障修复前,该节点池不会再触发自愈操作。您可以提交工单联系技术支持。