NPD原理解析

如题所述

第1个回答  2022-07-16

节点问题检测器(Node Problem Detector) 是一个守护程序,用于监视和报告节点的健康状况(包括内核死锁、OOM、系统线程数压力、系统文件描述符压力等指标)。 你可以将节点问题探测器以 DaemonSet 或独立守护程序运行。 节点问题检测器从各种守护进程收集节点问题,并以 NodeCondition 和 Event 的形式报告给 API Server。
您可以通过检测相应的指标,提前预知节点的资源压力,可以在节点开始驱逐 Pod 之前手动释放或扩容节点资源压力,防止 Kubenetes 进行资源回收或节点不可用可能带来的损失。

Git 仓库地址: https://github.com/kubernetes/node-problem-detector

当kubernetes中节点发生上述问题,在整个集群中,k8s服务组件并不会感知以上问题,就会导致pod仍会调度至问题节点。

为了解决这个问题,我们引入了这个新的守护进程node-problem-detector,从各个守护进程收集节点问题,并使它们对上游层可见。一旦上游层面发现了这些问题,我们就可以讨论补救措施。

NPD使用Go modules管理依赖,因此构建它需要Go SDK 1.11+:

构建节点问题检测器的 docker 镜像时,会嵌入 默认配置 。

不过,你可以像下面这样使用 ConfigMap 将其覆盖:

1、更改 config/ 中的配置文件

2、创建 ConfigMap node-strick-detector-config:

3、更改 node-problem-detector.yaml 以使用 ConfigMap:

4、使用新的配置文件重新创建节点问题检测器:

说明: 此方法仅适用于通过 kubectl 启动的节点问题检测器。

如果节点问题检测器作为集群插件运行,则不支持覆盖配置。 插件管理器不支持 ConfigMap。

通常这些错误是比较难真实测试,只能通过发送消息到journal来模拟。

然后通过k8s控制台,你可以看到对应的信息:

然后通过以下命令来对应的event

Problem Daemon 是监控任务子守护进程,NPD 会为每一个 Problem Daemon 配置文件创建一个守护进程,这些配置文件通过 --config.custom-plugin-monitor、--config.system-log-monitor、--config.system-stats-monitor 参数指定。每个 Problem Daemon监控一个特定类型的节点故障,并报告给NPD。目前 Problem Daemon 以 Goroutine 的形式运行在NPD中,未来会支持在独立进程(容器)中运行并编排为一个Pod。在编译期间,可以通过相应的标记禁用每一类 Problem Daemon。

ProblemDaemonHandler 定义了 Problem Daemon 的初始化方法

在NPD启动时,init()方法中完成了 ProblemDaemonHandler 的注册:

Exporter 用于上报节点健康信息到某种控制面。在 NPD 启动时,会根据需求初始化并启动各种 Exporter。Exporter 分为三类:

ExporterHandler 和 ProblemDaemonHandler 功能类似,其定义了 Exporter 的初始化方法。也是在NPD启动时,init()方法中完成了 ExporterHandler 的注册

K8s Exporter 获取到的异常 Condition 信息会上报给 Condition Manager, Condition Manager 每秒检查 Condition 的变化,并同步到 API Server 的 Node 对象中。

Problem Client 负责与 API Server 交互,并将巡检过程中生成的 Events 和 Conditions 上报给 API Server。

Problem Detector 是 NPD 的核心对象,它负责启动所有的 Problem Daemon(也可以叫做 Monitor),并利用 channel 收集 Problem Daemon中发现的异常信息,然后将异常信息提交给 Exporter,Exporter 负责将这些异常信息上报到指定的控制面(如 API Server、Prometheus、 Stackdriver 等)。

Status 是 Problem Daemon 向 Exporter 上报的异常信息对象。

用于从外部控制协程的生命周期, 它的逻辑很简单,准备结束生命周期时:

NPD 启动过程完成的工作有:

采集节点的健康状态是为了能够在业务Pod不可用之前提前发现节点异常,从而运维或开发人员可以对Docker、Kubelet或节点进行修复。在NPDPlus中,为了减轻运维人员的负担,提供了根据采集到的节点状态从而进行不同自愈动作的能力。集群管理员可以根据节点不同的状态配置相应的自愈能力,如重启Docker、重启Kubelet或重启CVM节点等。同时为了防止集群中的节点雪崩,在执行自愈动作之前做了严格的限流,防止节点大规模重启。同时为了防止集群中的节点雪崩,在执行自愈动作之前做了严格的限流。具体策略为:

在同一时刻只允许集群中的一个节点进行自愈行为,并且两个自愈行为之间至少间隔1分钟

当有新节点添加到集群中时,会给节点2分钟的容忍时间,防止由于节点刚刚添加到集群的不稳定性导致错误自愈

此Problem Daemon为NPD提供了一种插件化机制,允许基于任何语言来编写监控脚本,只需要这些脚本遵循NPD关于退出码和标准输出的规范。通过调用用户配置的脚本来检测各种节点问题

脚本退出码:

脚本输出应该小于80字节,避免给Etcd的存储造成压力

使用标记禁用:disable_custom_plugin_monitor

plugin 是NPD或用户自定义的一些异常检查程序,可以用任意语言编写。custom-plugin-monitor 在执行过程中会执行这些异常检测程序,并根据返回结果来判断是否存在异常。NPD提供了三个 plugin,分别是:

health-checker 的执行流程可以分为三个步骤:

依赖的插件是 journald,其作用是统计指定的 journal 日志中近一段时间满足正则匹配的历史日志条数。

检查 conntrack table 的使用率是否超过 90%

system-log-monitor 用于监控系统和内核日志,根据预定义规则来报告问题、指标。它支持基于文件的日志、Journald、kmsg。要监控其它日志,需要实现LogWatcher接口

LogWatcher 的主要作用的监听文件更新,并将追加的文件内容写入 LogBuffer 中供 LogMonitor 处理。NPD 中提供了三种 LogWatcher 的实现:

LogWatcher 也需要在 init() 方法中完成注册。

filelog 通过监控指定的文件更新,并对日志内容进行正则匹配,以发现异常日志,从而判断组件是否正常。

journald 底层依赖 sdjournal 包,监控系统日志的更新,并且可以从指定的历史时间点开始读取。如果未指定 journal 日志路径,则从系统默认路径读取。读取到的日志会转换成 logtypes.Log 对象,并写入 logCh 通道中。journal 通过监控 journal 文件更新,并对日志内容进行正则匹配,以发现异常日志,从而判断组件是否正常。

kmsg 和 journald 的实现原理类似,它底层依赖 kmsgparser 包,实现内核日志的监控更新和回溯。默认的文件路径是 /dev/kmsg。kmsg 通过监控系统日志文件更新,并对日志内容进行正则匹配,以发现异常日志,从而判断组件是否正常。

LogBuffer 是一个可循环写入的日志队列,max 字段控制可记录日志的最大条数,当日志条数超过 max 时,就会从头覆盖写入。LogBuffer 也支持正则匹配 buffer 中的日志内容。

将各种健康相关的统计信息报告为Metrics

目前支持的组件仅仅有主机信息、磁盘:

使用标记禁用:disable_system_stats_monitor

health-checker-kubelet.json

kernel-monitor.json

node-problem-detector使用 Event 和 NodeCondition 将问题报告给apiserver。

通过配置 metricsReporting 可以选择是否开启 System Log Monitor 的指标上报功能。该字段默认为 true。

临时异常只会上报 counter 指标,如下:

永久异常会上报 gauge 指标和 counter 指标,如下:

Counter是一个累计类型的数据指标,它代表单调递增的计数器。
Gauge是可以任意上下波动数值的指标类型。

NPD对指标这一概念也进行了封装,它依赖OpenCensus而不是Prometheus这样具体的实现的API。

所有指标如下:

其中ProblemCounterID 和 ProblemGaugeID 是针对所有Problem的Counter/Gauge,其他都是SystemStatsMonitor暴露的指标。

在NPD的术语中,治愈系统(Remedy System)是一个或一组进程,负责分析NPD检测出的问题,并且采取补救措施,让K8S集群恢复健康状态。

目前官方提及的治愈系统有只有Draino。NPD项目并没有提供对Draino的集成,你需要手工部署和配置Draino。

Draino 是Planet开源的小项目,最初在Planet用于解决GCE上运行的K8S集群的持久卷相关进程(mkfs.ext4、mount等)永久卡死在不可中断睡眠状态的问题。Draino的工作方式简单粗暴,只是检测到NodeCondition并Cordon、Drain节点。

基于Label和NodeCondition自动的Drain掉故障K8S节点:

Draino可以联用Cluster Autoscaler,自动的终结掉Drained的节点。

在Descheduler项目成熟以后,可以代替Draino。

kubernetes addons之node-problem-detector

Kubernetes故障检测和自愈

NPD原理解析
Problem Daemon 是监控任务子守护进程,NPD 会为每一个 Problem Daemon 配置文件创建一个守护进程,这些配置文件通过 --config.custom-plugin-monitor、--config.system-log-monitor、--config.system-stats-monitor 参数指定。每个 Problem Daemon监控一个特定类型的节点故障,并报告给NPD。目前 Problem Daemon 以 Gorouti...

常见五种检测器的工作原理和结构示意图说明
最后,Nitrogen-Phosphorus Detector,NPD是高选择性的质量型检测器,对于氮和磷的有机化合物尤其敏感。其工作原理,如图5所示,可能涉及到气相电离和表面电离理论,通过化合物与铷原子的反应,释放出电子信号,为我们揭示了这些化合物的精确存在。每个检测器都是色谱分析的神奇钥匙,它们通过不同的物理或化学...

精神分析理论用什么来解释人的行为动力
NPD,自恋人格疾患在精神科疾病诊断统计手册第四版(DSM-IV)里的基本特征是持续型态的夸大、过度敏感,以及缺乏神入、夸大感,、认为自己的问题是唯一,且只会被特定的人所了解:需要持久的注意与钦佩(当『表现癖』被用来定义自恋家时,有时会被拿来使用) :权力感。夸大感、独一感,和被赞赏的需求,是三个最能将自恋...

高效液相色谱和气相色谱的异同点
液相主要为:紫外检测器,荧光检测器、示差折光检测器...气相色谱主要为:氢火焰离子化检测器(FID),热导检测器(TCD),电子捕获检测器(ECD),火焰光度检测器(FPD),氮磷检测器(NPD)...相同点:基本原理相同。都是利用物质在流动相和固定相中的分配系数的差别,从而在两相间反复多次(1000-10000...

苹果7的音质怎么样?
其次更加深入的感受就是人声解析力要有提升,同时背景“干净”了许多,至少听人声不会有其他杂七杂八的声音干扰,变化不大的是低频部分,这也局限于这款耳机采用了开放式,对于低频来讲确实有一定损失。高频对于这款耳机来讲还是可圈可点的,首先它的调音就不是“刺激”的,整体偏于平淡,因此高频耐听...

农药残留分析技术进展概况
它根据液相分离、解析、浓缩等原理,使样品溶液混合物通过柱子后,样品中某一组份保留在柱中,通过再选择合适的溶剂把保留在柱中的组分洗脱下来,从而达到分离、净化的目的。SPE克服了液-液萃取技术(LLE)及一般柱层析的缺点,具有高效、简便、快速、安全、重复性好、便于前处理自动化等特点。根据柱中填料大体可分为吸附...

高效液相色谱和气相色谱的异同点急用
气相色谱主要为:氢火焰离子化检测器(fid),热导检测器(tcd),电子捕获检测器(ecd),火焰光度检测器(fpd),氮磷检测器(npd)...相同点:基本原理相同。都是利用物质在流动相和固定相中的分配系数的差别,从而在两相间反复多次(1000-1000000次,甚至更多)的分配,使原来分配系数差别很小的各组分...

相似回答
大家正在搜