插件简介
CCE节点故障检测(node-problem-detector,简称npd)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。node-problem-detector可以作为DaemonSet运行, 也可以独立运行。
有关社区开源项目node-problem-detector的详细信息,请参见node-problem-detector。
约束与限制
- 使用NPD插件时,不可对节点磁盘进行格式化或分区。
- 节点上每个NPD进程标准占用30mCPU,100MB内存。
权限说明
NPD插件为监控内核日志,需要读取宿主机/dev/kmsg设备,为此需要开启容器特权,详见privileged。
同时CCE根据最小化权限原则进行了风险消减,NPD运行限制只拥有以下特权:
- cap_dac_read_search,为访问/run/log/journal
- cap_sys_admin,为访问/dev/kmsg
安装插件
步骤 1 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件管理”,在右侧找到 npd ,单击“安装”。
步骤 2 根据下表配置参数,然后单击“安装”。
仅v1.16.0及以上版本支持配置。
npc.enable:是否启用npc,默认值为 false ,true表示启用。
NPD检查项
说明当前检查项仅1.16.0及以上版本支持。
NPD的检查项主要分为事件类检查项和状态类检查项。
- 事件类检查项
对于事件类检查项,当问题发生时,NPD会向APIServer上报一条事件,事件类型分为Normal(正常事件)和Warning(异常事件)
故障检查项 | 功能 | 说明 |
---|---|---|
KubeletStart | 检查kubelet启动并上报 | Normal类事件 |
DockerStart | 检查Docker启动并上报 | Normal类事件 |
ContainerdStart | 检查Containerd启动并上报 | Normal类事件 |
OOMKilling | 检查oom事件发生并上报 | Warning类事件 |
TaskHung | 检查taskHung事件发生并上报 | Warning类事件 |
KernelOops | 检查内核0指针panic错误 | Warning类事件 |
ConntrackFull | 检查连接跟踪表是否满 | Warning类事件周期:30秒阈值:80% |
- 状态类检查项
对于状态类检查项,当问题发生时,NPD会向APIServer上报一条事件,并同步修改节点状态,可配合Node-problem-controller故障隔离对节点进行隔离。
下列检查项中若未明确指出检查周期,则默认周期为30秒。
故障检查项 | 功能 | 说明 |
---|---|---|
FrequentKubeletRestart | 通过监听journald日志检测kubelet是否频繁重启 | 周期:5分钟 回溯时间:10分钟 阈值:10次即在回溯时间段内重启10次表示频繁重启,将会产生故障告警。 监听对象:/run/log/journal目录下的日志说明Ubuntu操作系统由于日志格式不兼容,暂不支持上述检查项。 |
FrequentDockerRestart | 通过监听journald日志检测docker是否频繁重启 | |
FrequentContainerdRestart | 通过监听journald日志检测containerd是否频繁重启 | |
CRIProblem | 检查容器CRI组件状态 | 检查对象:Docker或Containerd |
KUBELETProblem | 检查Kubelet状态 | 无 |
NTPProblem | 检查ntp、chrony服务状态检查节点时钟是否偏移 | 时钟偏移阈值:8000ms |
PIDProblem | 检查Pid是否充足 | 阈值:90% 使用量:/proc/loadavg中nr_threads 最大值:/proc/sys/kernel/pid_max和/proc/sys/kernel/threads-max两者的较小值。 |
FDProblem | 检查文件句柄数是否充足 | 阈值:90% 使用量:/proc/sys/fs/file-nr中第1个值 最大值:/proc/sys/fs/file-nr中第3个值 |
MemoryProblem | 检查节点整体内存是否充足 | 阈值:90% 使用量:/proc/meminfo中MemTotal-MemAvailable 最大值:/proc/meminfo中MemTotal |
ResolvConfFileProblem | 检查ResolvConf配置文件是否丢失检查ResolvConf配置文件是否异常异常定义:不包含任何上游域名解析服务器(nameserver)。 | 检查对象:/etc/resolv.conf |
ProcessD | 检查节点是否存在D进程 | 数据来源: /proc/{PID}/stat 等效命令:ps aux例外场景:ProcessD忽略BMS节点下的SDI卡驱动依赖的常驻D进程heartbeat、update |
ProcessZ | 检查节点是否存在Z进程 | |
ScheduledEvent | 检查节点是否存在主机计划事件典型场景:底层宿主机异常,例如风扇损坏、磁盘坏道等,导致其上虚机触发冷热迁移。 | 数据来源: http://169.254.169.254/meta-data/latest/events/scheduled该检查项为Alpha特性,默认不开启。 |
网络连通类检查项
故障检查项 | 功能 | 说明 |
---|---|---|
CNIProblem | 检查容器CNI组件是否正常运行 | 无 |
KUBEPROXYProblem | 检查Kube-proxy是否正常运行 | 无 |
另外kubelet组件内置如下检查项,但是存在不足,您可通过集群升级或安装NPD进行补足。
Kubelet内置检查项
故障检查项 | 功能 | 说明 |
---|---|---|
PIDPressure | 检查Pid是否充足 | 周期:10秒 阈值:90% 缺点:社区1.23.1及以前版本,该检查项在pid使用量大于65535时失效,详见issue 107107。社区1.24及以前版本,该检查项未考虑thread-max。 |
MemoryPressure | 检查容器可分配空间(allocable)内存是否充足 | 周期:10秒 阈值:最大值-100M 最大值(Allocable):节点总内存-节点预留内存 缺点:该检测项没有从节点整体内存维度检查内存耗尽情况,只关注了容器部分(Allocable),在低。 |
DiskPressure | 检查kubelet盘和docker盘的磁盘使用量及inodes使用量 | 周期:10秒阈值:90% |
Node-problem-controller故障隔离
说明故障隔离仅1.16.0及以上版本支持。
Node-problem-controller(NPC)并不会随NPD插件默认安装。在安装NPD插件时,将参数 npc.enable
配置为true以部署双实例NPC(注:也可配置单实例但不保证高可用)。
默认情况下,若多个节点发生故障,NPC只会为1个节点添加污点,可通过参数npc. maxTaintedNode提高数量限制。故障恢复时,NPC不在运行状态,污点会残留,需要手动清理或启动NPC。
开源NPD插件提供了故障探测能力,但未提供基础故障隔离能力。对此,CCE在开源NPD的基础上,增强了Node-problem-controller(节点故障控制器组件),该组件参照kubernetes节点控制器实现,针对NPD探测上报的故障,自动为节点添加污点以进行基本的节点故障隔离。
可以按下表修改插件npc.customConditionToTaint参数,配置故障隔离规则。
参数说明
参数 | 说明 | 默认值 |
---|---|---|
npc.enable | 是否启用npc | false |
npc.customCondtionToTaint | 故障隔离规则列表 | 见下表 |
npc.customConditionToTaint[i] | 故障隔离规则项 | N/A |
npc.customConditionToTaint[i].condition.status | 故障状态 | true |
npc.customConditionToTaint[i].condition.type | 故障类型 | N/A |
npc.customConditionToTaint[i].enable | 是否启用该故障隔离规则项 | false |
npc.customConditionToTaint[i]..taint.effect | 故障隔离效果NoSchedule、PreferNoSchedule、NoExecute | NoSchedule值域:NoSchedule、PreferNoSchedule、NoExecute |
npc. maxTaintedNode | 集群内多少节点允许被npc添加污点支持int格式和百分比格式 | 1值域: int格式,数值范围为1到无穷大 百分比格式,数值范围为1%到100%,与集群节点数量乘积计算后最小值为1。 |
Npc.affinity | Controller的节点亲和性配置 | N/A |
推荐故障隔离规则配置
故障 | 故障详情 | 污点 |
---|---|---|
DiskReadonly | 磁盘只读 | NoSchedule,禁止新建Pod |
DiskProblem | 磁盘空间不足,关键逻辑磁盘被卸载 | NoSchedule,禁止新建Pod |
FrequentKubeletRestart | kubelet频繁重启 | NoSchedule,禁止新建Pod |
FrequentDockerRestart | Docker频繁重启 | NoSchedule,禁止新建Pod |
FrequentContainerdRestart | Containerd频繁重启 | NoSchedule,禁止新建Pod |
KUBEPROXYProblem | Kubeproxy异常 | NoSchedule,禁止新建Pod |
PIDProblem | Pid不足 | NoSchedule,禁止新建Pod |
FDProblem | FD文件句柄数不足 | NoSchedule,禁止新建Pod |
MemoryProblem | 节点内存不足 | NoSchedule,禁止新建Pod |
查看NPD事件
NPD上报的事件可以在节点管理页面查询。
步骤 1 登录CCE控制台。
步骤 2 单击集群名称进入集群,在左侧选择“节点管理”。
步骤 3 在节点所在行,单击“事件”,可查看节点相关事件。
查看节点事件
如下所示,当有事件上报可以查询。
AOM告警配置
针对NPD状态类检查项,您可以通过配置AOM(应用运维管理服务),以将异常状态转换为AOM告警,并通过短信、邮箱等方式通知到您。
步骤 1 登录AOM控制台。
步骤 2 在左侧导航栏选择“告警 > 告警规则”,在右上角单击“添加告警”。
步骤 3 设置告警规则。
- 规则类型:选择阈值类告警。
- 监控对象:选择命令行输入
- 命令行输入框:
sum(problem_gauge{clusterName="test"}) by (podIP,type)
- 告警条件:选择触发条件在1个监控周期内,如果平均值>=1达到连续1次时,产生重要告警。
- 告警通知(可选):若需要将告警通过邮件、手机方式通知您,可在告警通知处,为此告警规则配置行动规则。若此处无行动规则,请新建告警行动规则。
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 counterproblem_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 gaugeproblem_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
..
版本记录
CCE插件版本记录
插件版本 支持的集群版本 更新特性 社区版本(仅1.17及以上版本集群支持) 1.16.4 /v1.(17|19|21|23).*/ 新增beta检查项ScheduledEvent,支持通过metadata接口检测宿主机异常导致虚拟机进行冷热迁移事件。该检查项默认不开启。 0.8.10 1.16.3 /v1.(17|19|21|23).*/ 新增ResolvConf配置文件检查。 0.8.10 1.16.1 /v1.(17|19|21|23).*/ 新增node-problem-controller。支持基本故障隔离能力。
新增PID、FD、磁盘、内存、临时卷存储池、持久卷存储池检查项。0.8.10 1.15.0 /v1.(17|19|21|23).*/ 检测项全面加固,避免误报。
支持内核巡检。支持OOMKilling事件,TaskHung事件上报。0.8.10 1.14.11 /v1.(17|19|21).*/ 适配CCE 1.21集群 0.7.1 1.14.5 /v1.(17|19).*/ 修复监控指标无法被获取的问题 0.7.1 1.14.4 /v1.(17|19).*/ 适配ARM64节点部署
适配containerd运行时节点0.7.1 1.14.2 /v1.(17|19).*/ 适配Kubernetes 1.19集群,新增支持Ubuntu操作系统和安全容器场景 0.7.1 1.13.8 /v1.15.11|v1.17.*/ 修复容器隧道网络下CNI健康检查问题
调整资源配额0.7.1 1.13.6 /v1.15.11|v1.17.*/ 修复僵尸进程未被回收的问题 0.7.1 1.13.5 /v1.15.11|v1.17.*/ 增加污点容忍配置 0.7.1 1.13.2 /v1.15.11|v1.17.*/ 增加资源限制,增强cni插件的检测能力 0.7.1