CCE节点故障检测
插件简介
CCE节点故障检测插件(原名NPD)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。NPD可以作为DaemonSet运行, 也可以独立运行。
CCE节点故障检测插件基于社区开源项目node-problem-detector,详细信息请参见node-problem-detector。
约束与限制
- 使用NPD插件时,不可对节点磁盘进行格式化或分区。
- 节点上每个NPD进程标准占用30mCPU,100MB内存。
- 当NPD插件为1.18.45及以上版本时,不再支持宿主机的操作系统为EulerOS 2.5以下版本。
权限说明
NPD插件为监控内核日志,需要读取宿主机/dev/kmsg设备,为此需要开启容器特权,详见privileged。
同时CCE根据最小化权限原则进行了风险消减,NPD运行限制只拥有以下特权:
- cap_dac_read_search,为访问/run/log/journal
- cap_sys_admin,为访问/dev/kmsg
安装插件
- 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到CCE节点故障检测插件,单击“安装”。
- 在安装插件页面,根据需求选择“规格配置”。
您可根据需求调整插件实例数和资源配额。实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。
- 设置插件支持的“参数配置”。
单故障最大节点隔离数:节点批量发生相同故障时,为避免雪崩效应,最多允许被隔离的节点数量。支持按照百分比或个数配置。
- 设置插件实例的部署策略。
- 调度策略对于DaemonSet类型的插件实例不会生效。
- 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
表1 插件调度配置 参数
参数说明
多可用区部署
- 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
- 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
- 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。
节点亲和
容忍策略
容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。
插件会对实例添加针对node.kubernetes.io/not-ready和node.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。
详情请参见设置容忍策略。
- 单击“安装”。
组件说明
容器组件 |
说明 |
资源类型 |
---|---|---|
node-problem-controller |
根据故障探测结果提供基础故障隔离能力。 |
Deployment |
node-problem-detector |
提供节点故障探测能力。 |
DaemonSet |
NPD检查项
当前检查项仅1.16.0及以上版本支持。
NPD的检查项主要分为事件类检查项和状态类检查项。
- 事件类检查项
对于事件类检查项,当问题发生时,NPD会向APIServer上报一条事件,事件类型分为Normal(正常事件)和Warning(异常事件)
表3 事件类检查项 故障检查项
功能
说明
OOMKilling
监听内核日志,检查OOM事件发生并上报
典型场景:容器内进程使用的内存超过了Limt,触发OOM并终止该进程
Warning类事件
监听对象:/dev/kmsg
匹配规则:"Killed process \\d+ (.+) total-vm:\\d+kB, anon-rss:\\d+kB, file-rss:\\d+kB.*"
TaskHung
监听内核日志,检查taskHung事件发生并上报
典型场景:磁盘卡IO导致进程卡住
Warning类事件
监听对象:/dev/kmsg
匹配规则:"task \\S+:\\w+ blocked for more than \\w+ seconds\\."
ReadonlyFilesystem
监听内核日志,检查系统内核是否有Remount root filesystem read-only错误
典型场景:用户从ECS侧误操作卸载节点数据盘,且应用程序对该数据盘的对应挂载点仍有持续写操作,触发内核产生IO错误将磁盘重挂载为只读磁盘。
说明:节点容器存储Rootfs为Device Mapper类型时,数据盘卸载会导致thinpool异常,影响NPD运行,NPD将无法检测节点故障。
Warning类事件
监听对象:/dev/kmsg
匹配规则:"Remounting filesystem read-only"
- 状态类检查项
对于状态类检查项,当问题发生时,NPD会向APIServer上报一条事件,并同步修改节点状态,可配合Node-problem-controller故障隔离对节点进行隔离。
下列检查项中若未明确指出检查周期,则默认周期为30秒。
表4 系统组件检查 故障检查项
功能
说明
容器网络组件异常
CNIProblem
检查CNI组件(容器网络组件)运行状态
无
容器运行时组件异常
CRIProblem
检查节点CRI组件(容器运行时组件)Docker和Containerd的运行状态
检查对象:Docker或Containerd
Kubelet频繁重启
FrequentKubeletRestart
通过定期回溯系统日志,检查关键组件Kubelet是否频繁重启
说明:Ubuntu和HCE2.0操作系统由于日志格式不兼容,暂不支持上述检查项。
Docker频繁重启
FrequentDockerRestart
通过定期回溯系统日志,检查容器运行时Docker是否频繁重启
Containerd频繁重启
FrequentContainerdRestart
通过定期回溯系统日志,检查容器运行时Containerd是否频繁重启
Kubelet服务异常
KubeletProblem
检查关键组件Kubelet的运行状态
无
KubeProxy异常
KubeProxyProblem
检查关键组件KubeProxy的运行状态
无
表5 系统指标 故障检查项
功能
说明
连接跟踪表耗尽
ConntrackFullProblem
检查连接跟踪表是否耗尽
- 默认阈值:90%
- 使用量:nf_conntrack_count
- 最大值:nf_conntrack_max
磁盘资源不足
DiskProblem
检查节点系统盘、CCE数据盘(包含CRI逻辑盘与Kubelet逻辑盘)的磁盘使用情况
- 默认阈值:90%
- 数据来源:
df -h
当前暂不支持额外的数据盘
文件句柄数不足
FDProblem
检查系统关键资源FD文件句柄数是否耗尽
- 默认阈值:90%
- 使用量:/proc/sys/fs/file-nr中第1个值
- 最大值:/proc/sys/fs/file-nr中第3个值
节点内存资源不足
MemoryProblem
检查系统关键资源Memory内存资源是否耗尽
- 默认阈值:80%
- 使用量:/proc/meminfo中MemTotal-MemAvailable
- 最大值:/proc/meminfo中MemTotal
进程资源不足
PIDProblem
检查系统关键资源PID进程资源是否耗尽
- 默认阈值:90%
- 使用量:/proc/loadavg中nr_threads
- 最大值:/proc/sys/kernel/pid_max和/proc/sys/kernel/threads-max两者的较小值。
表6 存储检查 故障检查项
功能
说明
磁盘只读
DiskReadonly
通过定期对节点系统盘、CCE数据盘(包含CRI逻辑盘与Kubelet逻辑盘)进行测试性写操作,检查关键磁盘的可用性
检测路径:
- /mnt/paas/kubernetes/kubelet/
- /var/lib/docker/
- /var/lib/containerd/
- /var/paas/sys/log/cceaddon-npd/
检测路径下会产生临时文件npd-disk-write-ping
当前暂不支持额外的数据盘
节点emptydir存储池异常
EmptyDirVolumeGroupStatusError
检查节点上临时卷存储池是否正常
故障影响:依赖存储池的Pod无法正常写对应临时卷。临时卷由于IO错误被内核重挂载成只读文件系统。
典型场景:用户在创建节点时配置两个数据盘作为临时卷存储池,用户误操作删除了部分数据盘导致存储池异常。
- 检测周期:30秒
- 数据来源:
vgs -o vg_name, vg_attr
- 检测原理:检查VG(存储池)是否存在p状态,该状态表征部分PV(数据盘)丢失。
- 节点持久卷存储池异常调度联动:调度器可自动识别此异常状态并避免依赖存储池的Pod调度到该节点上。
- 例外场景:NPD无法检测所有PV(数据盘)丢失,导致VG(存储池)丢失的场景;此时依赖kubelet自动隔离该节点,其检测到VG(存储池)丢失并更新nodestatus.allocatable中对应资源为0,避免依赖存储池的Pod调度到该节点上。无法检测单个PV损坏;此时依赖ReadonlyFilesystem检测异常。
节点持久卷存储池异常
LocalPvVolumeGroupStatusError
检查节点上持久卷存储池是否正常
故障影响:依赖存储池的Pod无法正常写对应持久卷。持久卷由于IO错误被内核重挂载成只读文件系统。
典型场景:用户在创建节点时配置两个数据盘作为持久卷存储池,用户误操作删除了部分数据盘。
挂载点异常
MountPointProblem
检查节点上的挂载点是否异常
异常定义:该挂载点不可访问(cd)
典型场景:节点挂载了nfs(网络文件系统,常见有obsfs、s3fs等),当由于网络或对端nfs服务器异常等原因导致连接异常时,所有访问该挂载点的进程均卡死。例如集群升级场景kubelet重启时扫描所有挂载点,当扫描到此异常挂载点会卡死,导致升级失败。
等效检查命令:
for dir in `df -h | grep -v "Mounted on" | awk "{print \\$NF}"`;do cd $dir; done && echo "ok"
磁盘卡IO
DiskHung
检查节点上所有磁盘是否存在卡IO,即IO读写无响应
卡IO定义:系统对磁盘的IO请求下发后未有响应,部分进程卡在D状态
典型场景:操作系统硬盘驱动异常或底层网络严重故障导致磁盘无法响应
磁盘慢IO
DiskSlow
检查节点上所有磁盘是否存在慢IO,即IO读写有响应但响应缓慢
典型场景:云硬盘由于网络波动导致慢IO。
说明:卡IO场景下该检查项失效,原因为IO请求未有响应,await数据不会刷新。
表7 其他检查 故障检查项
功能
说明
NTP异常
NTPProblem
检查节点时钟同步服务ntpd或chronyd是否正常运行,系统时间是否漂移
默认时钟偏移阈值:8000ms
进程D异常
ProcessD
检查节点是否存在D进程
默认阈值:连续3次存在10个异常进程
数据来源:
- /proc/{PID}/stat
- 等效命令:ps aux
例外场景:ProcessD忽略BMS节点下的SDI卡驱动依赖的常驻D进程heartbeat、update
进程Z异常
ProcessZ
检查节点是否存在Z进程
ResolvConf配置文件异常
ResolvConfFileProblem
检查ResolvConf配置文件是否丢失
检查ResolvConf配置文件是否异常
异常定义:不包含任何上游域名解析服务器(nameserver)。
检查对象:/etc/resolv.conf
存在计划事件
ScheduledEvent
检查节点是否存在热迁移计划事件。热迁移计划事件通常由硬件故障触发,是IaaS层的一种自动故障修复手段。
典型场景:底层宿主机异常,例如风扇损坏、磁盘坏道等,导致其上虚机触发热迁移。
数据来源:
- http://169.254.169.254/meta-data/latest/events/scheduled
该检查项为Alpha特性,默认不开启。
另外kubelet组件内置如下检查项,但是存在不足,您可通过集群升级或安装NPD进行补足。
表8 Kubelet内置检查项 故障检查项
功能
说明
PID资源不足
PIDPressure
检查PID是否充足
- 周期:10秒
- 阈值:90%
- 缺点:社区1.23.1及以前版本,该检查项在pid使用量大于65535时失效,详见issue 107107。社区1.24及以前版本,该检查项未考虑thread-max。
内存资源不足
MemoryPressure
检查容器可分配空间(allocable)内存是否充足
- 周期:10秒
- 阈值:最大值-100MiB
- 最大值(Allocable):节点总内存-节点预留内存
- 缺点:该检测项没有从节点整体内存维度检查内存耗尽情况,只关注了容器部分(Allocable)。
磁盘资源不足
DiskPressure
检查kubelet盘和docker盘的磁盘使用量及inodes使用量
- 周期:10秒
- 阈值:90%
Node-problem-controller故障隔离
故障隔离仅1.16.0及以上版本的插件支持。
默认情况下,若多个节点发生故障,NPC至多为10%的节点添加污点,可通过参数npc. maxTaintedNode提高数量限制。
开源NPD插件提供了故障探测能力,但未提供基础故障隔离能力。对此,CCE在开源NPD的基础上,增强了Node-problem-controller(节点故障控制器组件,简称NPC),该组件参照Kubernetes节点控制器实现,针对NPD探测上报的故障,自动为节点添加污点以进行基本的节点故障隔离。
参数 |
说明 |
默认值 |
---|---|---|
npc.enable |
是否启用npc 1.18.0及以上版本不再支持该参数 |
true |
npc.maxTaintedNode |
单个故障在多个节点间发生时,限制多少节点允许被npc添加污点,避免雪崩效应 支持int格式和百分比格式 |
10% 值域:
|
npc.nodeAffinity |
Controller的节点亲和性配置 |
N/A |
查看NPD事件
NPD上报的事件可以在节点管理页面查询。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“节点管理”。
- 在节点所在行,单击“事件”,可查看节点相关事件。
图1 查看节点事件
配置NPD指标告警
针对NPD状态类检查项,您可以通过配置告警规则,在出现异常状态时及时通过短信、邮箱等方式通知到您。关于创建自定义告警规则的步骤,请参见通过告警中心一键配置告警。
如果您需要使用NPD检查项配置告警规则,集群中需要安装“云原生监控插件”,且该插件已对接AOM实例。
Prometheus指标采集
NPD 守护进程POD通过端口19901暴露Prometheus metrics指标,NPD Pod默认被注释metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"prometheus","path":"/metrics","port":"19901","names":""}]'。您可以自建Prometheus采集器识别并通过http://{{NpdPodIP}}:{{NpdPodPort}}/metrics路径获取NPD指标。
NPD插件为1.16.5版本以下时,Prometheus指标的暴露端口为20257。
目前指标信息包含异常状态计数problem_counter与异常状态problem_gauge,如下所示
# HELP problem_counter Number of times a specific type of problem have occurred. # TYPE problem_counter counter problem_counter{reason="DockerHung"} 0 problem_counter{reason="DockerStart"} 0 problem_counter{reason="EmptyDirVolumeGroupStatusError"} 0 ... # HELP problem_gauge Whether a specific type of problem is affecting the node or not. # TYPE problem_gauge gauge problem_gauge{reason="CNIIsDown",type="CNIProblem"} 0 problem_gauge{reason="CNIIsUp",type="CNIProblem"} 0 problem_gauge{reason="CRIIsDown",type="CRIProblem"} 0 problem_gauge{reason="CRIIsUp",type="CRIProblem"} 0 ..
版本记录
插件版本 |
支持的集群版本 |
更新特性 |
社区版本 |
---|---|---|---|
1.19.11 |
v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 v1.30 |
修复部分问题 |
|
1.19.8 |
v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 v1.30 |
|
|
1.19.1 |
v1.21 v1.23 v1.25 v1.27 v1.28 v1.29 |
修复部分问题 |
|
1.19.0 |
v1.21 v1.23 v1.25 v1.27 v1.28 |
修复部分问题 |
|
1.18.48 |
v1.21 v1.23 v1.25 v1.27 v1.28 |
修复部分问题 |
|
1.18.46 |
v1.21 v1.23 v1.25 v1.27 v1.28 |
适配CCE v1.28版本 |
|
1.18.24 |
v1.19 v1.21 v1.23 v1.25 v1.27 |
修复部分问题 |
|
1.18.23 |
v1.19 v1.21 v1.23 v1.25 v1.27 |
修复部分问题 |
|
1.18.22 |
v1.19 v1.21 v1.23 v1.25 v1.27 |
- |
|
1.18.21 |
v1.19 v1.21 v1.23 v1.25 v1.27 |
- |
|
1.18.18 |
v1.19 v1.21 v1.23 v1.25 v1.27 |
适配CCE v1.27集群 |
|
1.18.14 |
v1.19 v1.21 v1.23 v1.25 |
|
|
1.18.10 |
v1.19 v1.21 v1.23 v1.25 |
|
|
1.17.4 |
v1.17 v1.19 v1.21 v1.23 v1.25 |
优化DiskHung检查项 |
|
1.17.3 |
v1.17 v1.19 v1.21 v1.23 v1.25 |
|
|
1.17.2 |
v1.17 v1.19 v1.21 v1.23 v1.25 |
|
|
1.16.4 |
v1.17 v1.19 v1.21 v1.23 |
|
|
1.16.3 |
v1.17 v1.19 v1.21 v1.23 |
新增ResolvConf配置文件检查。 |
|
1.16.1 |
v1.17 v1.19 v1.21 v1.23 |
|
|
1.15.0 |
v1.17 v1.19 v1.21 v1.23 |
|
|
1.14.11 |
v1.17 v1.19 v1.21 |
适配CCE v1.21集群 |
|
1.14.5 |
v1.17 v1.19 |
修复监控指标无法被获取的问题 |
|
1.14.4 |
v1.17 v1.19 |
|
|
1.14.2 |
v1.17 v1.19 |
|
|
1.13.8 |
v1.15.11 v1.17 |
|
|
1.13.6 |
v1.15.11 v1.17 |
修复僵尸进程未被回收的问题 |
|
1.13.5 |
v1.15.11 v1.17 |
增加污点容忍配置 |
|
1.13.2 |
v1.15.11 v1.17 |
增加资源限制,增强cni插件的检测能力 |