开启节点自愈

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

执行流程

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

image
  1. 故障诊断与发现

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

  2. 故障通知

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

  3. 独占GPU场景)故障隔离

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

    关于GPU卡故障检测和自动隔离的详细信息请参见GPU故障检测与自动隔离
  4. 执行节点自愈流程

    系统与K8s组件异常

    节点实例异常

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

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

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

      2. ACK针对需要重启的故障节点执行排水。

      3. ACK重启节点。

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

    详细流程说明请参见下文的系统与K8s组件异常
    1. ACK自动为故障节点添加污点。

    2. 如果开启了节点实例异常时等待授权后修复,ACK会等待您授权同意后再执行后续操作。

    3. ACK针对需要重启或更换设备的故障节点执行排水。

    4. ACK执行自愈行为,例如节点重启、节点维修等,节点状态为修复中。

    5. 独占GPU场景)检测GPU卡恢复正常时,ACK解除对GPU卡的隔离。

    6. 检测节点状态恢复正常时,ACK删除此前添加的节点污点。

    详细流程说明请参见下文的节点实例异常
  • 如果集群中存在多个节点池,各节点池的自愈任务将串行执行。

  • 如果一个节点池存在多个异常节点,自愈任务会以串行的方式逐个恢复。一旦某个节点自愈失败,ACK会停止对该节点池中其他故障节点的自愈。

使用说明

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

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

  • 以下处于灰度发布中的功能,如需使用,请提交工单

    • 开启节点自愈后,推荐您开启报警管理功能,启用集群节点自愈报警规则集集群GPU监控告警规则集,在异常情况发生时自动接收告警通知。相关操作请参见容器服务报警管理。相应规则集处于灰度发布中。

    • 节点实例异常的自愈功能处于灰度中。

    • 开启节点实例异常的自愈时,NPD版本需为1.2.26及以上。1.2.26版本处于灰度中。

    • 灵骏节点池的节点自愈功能处于灰度发布中。

配置节点自愈

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

节点池和灵骏节点池的开启步骤类似。以下步骤以节点池为例。

创建节点池时开启

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

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

    image

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

存量节点池中开启

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

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

    image

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

系统与K8s组件异常

自愈流程

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

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

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

  2. 如果开启了系统与 K8s 组件异常时允许重启节点,当修复动作无效时,ACK继续执行以下操作。

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

    2. ACK针对需要重启的故障节点执行排水。

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

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

    3. ACK重启节点。

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

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

触发自愈的Node Condition

Node Condition

描述

风险等级

阈值时间

自愈行为

KubeletNotReady(KubeletHung)

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

180s

  1. 重启kubelet。

  2. 如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。

KubeletNotReady(PLEG)

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

180s

  1. 重启containerdDocker。

  2. 重启kubelet。

  3. 如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。

KubeletNotReady(SandboxError)

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

180s

  1. 删除对应的Sandbox容器。

  2. 重启kubelet。

RuntimeOffline

containerdDocker停止工作,节点不可用。

90s

  1. 重启containerdDocker。

  2. 如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。

NTPProblem

时间同步服务(ntpdchronyd)异常。

10s

重启ntpdchronyd。

SystemdOffline

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

90s

如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。

ReadonlyFilesystem

节点文件系统变为只读。

90s

如果开启了系统与 K8s 组件异常时允许重启节点,则重启ECS实例。

节点实例异常

请确保已参见前文的使用说明完成准备工作。

自愈流程

重要

当灵骏节点发生故障需要硬件维修时,维修过程将重新部署灵骏节点并清空本地盘所有数据。在此场景下,推荐您为节点池开启节点实例异常时等待授权后修复,在授权维修前完成数据备份。

节点实例异常场景下,一个完整的节点自愈流程如下。

ACK会在节点实例异常发生5分钟后自动触发下方的节点自愈流程。
  1. 发现异常后,ACK为故障节点添加如下污点:

    • Key: alibabacloud.com/node-needrepair

    • Value: Unschedulable

    • Effect: NoSchedule

  2. 如果开启了节点实例异常时等待授权后修复,ACK会等待您授权同意后再执行后续操作。

    如需先对异常节点运行的业务进行处理,建议开启节点实例异常时等待授权后修复。ACK会在您授权同意后再开始修复。
    1. ACK自动为故障节点添加Label alibabacloud.com/node-needrepair=Inquiring

    2. 您可以先对异常节点上运行的业务Pod进行处理或提前备份业务数据。处理完成后,您可以通过删除Label alibabacloud.com/node-needrepair或将LabelValue设置为Approvedalibabacloud.com/node-needrepair=Approved)来进行授权。

    3. ACK接收您的授权同意后,继续执行后续操作。

  3. 如未开启节点实例异常时等待授权后修复,ACK会在发现异常后自动执行后续操作。

  4. ACK执行节点排水。

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

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

  5. ACK执行自愈行为,例如节点重启、硬件维修等。

  6. ACK检测节点状态是否恢复正常。

    • 如故障状态解除,则删除此前添加的污点。节点状态恢复正常。

    • 如故障状态未解除或自愈异常,此前添加的节点污点不会删除。ACK会定期发送Event通知。您看可查看Event处理, 或提交工单

  7.  (独占GPU场景)检测GPU卡恢复正常时,ACK解除对GPU卡的隔离。

触发自愈的Node Condition

重要

如自愈行为中涉及灵骏节点的硬件维修。维修成功后,您需手动将节点从节点池移除,再通过添加已有节点的方式将维修后的设备重新加入节点池。相关操作及注意事项,请参见移除节点添加已有灵骏节点

Node Condition

描述

自愈行为

NvidiaXID74Error

  • Fatal NVLINK Error.

  • NVLink硬件错误产生的Xid,收到此事件说明GPU已经出现严重硬件故障,需要下线维修。

硬件维修。

NvidiaXID79Error

  • GPU has fallen off the bus.

  • GPU硬件检测到掉卡,无法从总线上检测到。收到此事件说明GPU已经出现严重硬件故障,需要下线维修。

硬件维修。

NvidiaRemappingRowsFailed

GPU存在行重映射失败。

硬件维修。

NvidiaDeviceLost

  • The GPU has fallen off the bus or has otherwise become inaccessible.

  • GPU已从总线上掉落或变得不可访问。

硬件维修。

NvidiaInfoRomCorrupted

  • infoROM is corrupted.

  • infoROM已损坏。

硬件维修。

NvidiaPowerCableErr

  • A device's external power cables are not properly attached.

  • 设备的外部电源线连接不当。

硬件维修。

NvidiaXID95Error

  • Uncontained ECC error.

  • Xid95代表抑制失败,此时表明运行在该GPU上的所有应用程序都已受到影响,受影响的GPU必须重置后,应用程序才能重新启动。

重启节点。

NvidiaXID48Error

  • Double Bit ECC Error(DBE).

  • GPU检测到不可纠正的错误发生时,会记录此事件。这一情况也会反馈给应用程序。需要GPU重置或重启节点才能清除此错误。

重启节点。

NvidiaXID119Error

  • GSP RPC Timeout.

  • 在等待GSP核心响应RPC消息时发生超时。

重启节点。

NvidiaXID140Error

  • Unrecovered ECC Error.

  • GPU驱动程序在GPU内存中检测到不可纠正的错误,这些错误影响了驱动程序标记页面以进行动态页面下线或行重新映射的能力时,可能会发生此事件。需要重置GPU。

重启节点。

NvidiaXID120Error

  • GSP Error.

  • GPUGSP核心上运行的代码出错。

重启节点。

NvidiaPendingRetiredPages

  • GPU存在处于pending状态的Retried Pages。

  • 需要重置GPU才能使这些Retried Pages生效。

重启节点。

NvidiaRemappingRowsRequireReset

GPU遇到了无法纠正的、未包含的错误,需要通过重置GPU进行恢复。为了恢复操作,应该尽快重置GPU。

重启节点。

NvidiaXID44Error

  • Graphics Engine fault during context switch

  • 通常意味着在GPU上发生了不可纠正的错误,并且该错误也会报告给用户应用程序。需要进行GPU重置或节点重启以清除此错误。

重启节点。

NvidiaXID61Error

  • Internal micro-controller breakpoint/warning (newer drivers)

  • 通常意味着在GPU上发生了不可纠正的错误,并且该错误也会报告给用户应用程序。需要进行GPU重置或节点重启以清除此错误。

重启节点。

NvidiaXID62Error

  • Internal micro-controller halt (newer drivers)

  • 这些故障意味着在GPU上发生了不可纠正的错误,并且该错误也会报告给用户应用程序。需要进行GPU重置或节点重启以清除此错误。

重启节点。

NvidiaXID69Error

  • Graphics Engine class error

  • 这些故障意味着在GPU上发生了不可纠正的错误,并且该错误也会报告给用户应用程序。需要进行GPU重置或节点重启以清除此错误。

重启节点。

关于上述项目的更多信息,例如产生的Node Condition、是否产生Event等,请参见GPU故障检测与自动隔离

自愈过程中的节点状态

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

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

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

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

查看节点自愈事件

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

内容

级别

说明

NodeRepairStart

Normal

节点开始自愈。

NodeRepairAction

Normal

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

NodeRepairSucceed

Normal

节点自愈成功。

NodeRepairFailed

Warning

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

NodeRepairIgnore

Normal

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

常见问题

节点自愈失败怎么办?

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

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

相关文档