开启节点自愈

更新时间:
复制 MD 格式

节点池开启托管能力后,支持启用节点自愈功能,即由ACK自动监控节点状态,并在节点发生异常时自动执行自愈任务,以简化节点运维工作。但由于故障的复杂性,自愈任务无法修复所有的故障场景,部分复杂故障可能仍需人工修复。

灵骏节点池的节点自愈,请参见开启节点自愈。

自愈机制说明

节点自愈的完整运作过程可从以下维度理解:

执行流程

一个完整的故障发现、故障通知与节点自愈流程如下。

image
  1. 故障诊断与发现

ACK通过NPD组件检查节点的异常情况。节点运行状态发生变化并持续一段时间后,ACK判定该节点存在故障。

  1. 故障通知

发现故障后,ACK会产生Node Condition和Kubernetes Event。可通过事件中心告警配置接收通知。

  1. (独占GPU场景)故障隔离

检测到GPU异常后,ACK对故障GPU卡进行隔离。

关于GPU卡故障检测和自动隔离的详细信息请参见GPU异常检测与自动隔离。
  1. 执行系统与 K8s 组件异常自愈流程

ACK会根据节点的运行状态condition等信息判断是否发起自愈任务。可执行kubectl describe node命令,在condition字段查看节点的运行状态。

检测到系统与K8s组件异常,且异常持续时间超过阈值时间(即故障发生多长时间后会触发节点自愈)时,ACK将自动执行自愈任务。一个完整的节点自愈流程如下。

  1. ACK对异常的系统与K8s组件进行修复,例如重启kubelet、重启运行时等。

  2. 如果选择仅开启系统与节点组件自愈(允许异常时重启节点),当修复动作无效时,ACK继续执行以下操作:

    1. ACK自动将故障节点设置为不可调度。

    2. ACK针对需要重启的故障节点执行排水。排水超时时间取故障节点上所有待驱逐 Pod 的 TerminationGracePeriodSeconds 最大值与 10 分钟中的较大值,且最长不超过 30 分钟。

      ACK执行节点排水操作时,会在遵循PDB的前提下将节点上的Pod驱逐至其他可用节点。为确保服务高可用性,建议采用多副本部署策略,将工作负载分散在多个节点上,同时为关键业务配置PDB,控制同时中断的Pod数量。

      如排水失败,ACK仍会执行后续操作。

    3. ACK重启节点。

    4. 检测节点状态恢复正常时,ACK将故障节点恢复为可调度。

      如果某节点在执行节点自愈前已被设置为不可调度,那么在自愈任务完成后,该节点不会自动恢复为可调度。

自愈任务执行说明:如果集群中存在多个节点池,各节点池的自愈任务将串行执行。

触发自愈的Node Condition

Node Condition

描述

风险等级

阈值时间

自愈行为

KubeletNotReady(KubeletHung)

kubelet意外停止工作,导致节点NotReady。

高

180s

  1. 重启kubelet。

  2. 如果选择仅开启系统与节点组件自愈(允许异常时重启节点),则重启ECS实例。

KubeletNotReady(PLEG)

PLEG健康检查失败,导致节点NotReady。

中

180s

  1. 重启containerd或Docker。

  2. 重启kubelet。

  3. 如果选择仅开启系统与节点组件自愈(允许异常时重启节点),则重启ECS实例。

KubeletNotReady(SandboxError)

PodSandbox not found,导致kubelet无法正常启动。

高

180s

  1. 删除对应的Sandbox容器。

  2. 重启kubelet。

RuntimeOffline

containerd或Docker停止工作,节点不可用。

高

90s

  1. 重启containerd或Docker。

  2. 如果选择仅开启系统与节点组件自愈(允许异常时重启节点),则重启ECS实例。

NTPProblem

时间同步服务(ntpd或chronyd)异常。

高

10s

重启ntpd或chronyd。

SystemdOffline

Systemd状态异常,无法启动、销毁容器。

高

90s

如果选择仅开启系统与节点组件自愈(允许异常时重启节点),则重启ECS实例。

ReadonlyFilesystem

节点文件系统变为只读。

高

90s

如果选择仅开启系统与节点组件自愈(允许异常时重启节点),则重启ECS实例。

自愈过程中的节点状态

  • 自愈任务执行中,节点状态为修复中。

  • 自愈任务完成后,故障状态解除,节点恢复正常状态。

  • 自愈任务完成后,故障状态依然存在,节点会被置为恢复失败状态。

    节点处于自愈失败状态时,不会再触发自愈操作。相应的故障解除后,该节点才能再次进行自愈操作。

使用说明

  • 本功能需搭配事件中心使用,以接收节点池的告警事件,并安装ack-node-problem-detector(NPD),以检测节点的异常情况。详情请参见事件监控。

  • 仅支持在ACK托管集群中使用,支持开启了托管配置的节点池。

  • 以下处于灰度发布中的功能,灰度进度可能不同。如需使用,请提交工单一并申请。

    • 节点实例异常的自愈:白名单功能。

    • 告警规则集:开启节点自愈后,推荐开启报警管理功能,启用集群节点自愈报警规则集和集群GPU监控告警规则集,在异常情况发生时自动接收告警通知。相应规则集处于灰度发布中。

      规则集启用操作,请参见容器服务报警管理。
    • NPD版本:节点实例异常的自愈依赖NPD组件为1.2.26及以上。1.2.26版本处于灰度中。

启用节点自愈

支持在新增或存量节点池中通过托管配置开启节点自愈功能并定义其行为。

创建节点池时开启

  1. 在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择节点管理 > 节点池。

  2. 单击创建节点池,在托管配置区域选择托管节点池,开启节点自愈功能,选择修复系统与K8s组件异常时是否重启节点,并按照页面提示完成节点池的创建。

    完整配置项说明,请参见创建和管理节点池。关于重启节点和等待授权相关的注意事项,请参见下文说明。

存量节点池中开启

  1. 在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,选择节点管理 > 节点池。

  2. 在节点池列表的操作列,单击目标节点池对应的image > 开启托管(节点池)或托管配置(托管节点池),选择托管配置模式为托管节点池,按照页面提示开启节点自愈功能。

    关于配置项的完整说明,请参见创建和管理节点池。关于重启节点和等待授权相关的注意事项,请参见下文说明。

查看节点自愈事件

ACK触发节点自愈时,会将相关事件写入事件中心。可在集群信息页面选择运维管理 > 事件中心,在节点事件的事件列表中查看自动恢复的记录和具体操作。还可参见事件监控订阅相关事件。

内容

级别

说明

NodeRepairStart

Normal

节点开始自愈。

NodeRepairAction

Normal

节点自愈操作,例如重启kubelet。

NodeRepairSucceed

Normal

节点自愈成功。

NodeRepairFailed

Warning

节点自愈失败。请参见下文的常见问题解决。

NodeRepairIgnore

Normal

节点自愈跳过,当ECS处于非运行状态时,不对节点进行操作。

常见问题

节点自愈失败怎么办?

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

如果某个节点自愈失败,在故障修复前,该节点池不会再触发自愈操作。可提交工单联系技术支持。

相关文档