更新时间:2024-01-27 GMT+08:00

CCE节点故障检测

插件简介

CCE节点故障检测插件(node-problem-detector,简称NPD)是一款监控集群节点异常事件的插件,以及对接第三方监控平台功能的组件。它是一个在每个节点上运行的守护程序,可从不同的守护进程中搜集节点问题并将其报告给apiserver。node-problem-detector可以作为DaemonSet运行, 也可以独立运行。

有关社区开源项目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

安装插件

  1. 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到CCE节点故障检测插件,单击“安装”
  2. 在安装插件页面,设置“规格配置”

    表1 npd插件规格配置

    参数

    参数说明

    插件规格

    该插件可配置“自定义”规格。

    实例数

    选择“自定义”规格时,您可根据需求调整插件实例数。

    容器

    选择“自定义”规格时,您可根据需求调整插件实例的容器规格。

  3. 设置插件支持的“参数配置”

    仅v1.16.0及以上版本支持配置。

    表2 npd插件参数配置

    参数

    参数说明

    common.image.pullPolicy

    镜像拉取策略,默认为IfNotPresent。

    feature_gates

    特性门控。

    npc.maxTaintedNode

    单个故障在多个节点间发生时,至多多少节点允许被npc添加污点,避免雪崩效应。

    支持int格式和百分比格式。

    npc.nodeAffinity

    Controller的节点亲和性配置。

  4. 设置插件实例的“调度策略”

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表3 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将无法全部运行。

    节点亲和

    • 不亲和:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见容忍策略

  5. 单击“安装”

组件说明

表4 npd组件

容器组件

说明

资源类型

node-problem-controller

根据故障探测结果提供基础故障隔离能力。

Deployment

node-problem-detector

提供节点故障探测能力。

DaemonSet

NPD检查项

当前检查项仅1.16.0及以上版本支持。

NPD的检查项主要分为事件类检查项和状态类检查项。

  • 事件类检查项

    对于事件类检查项,当问题发生时,NPD会向APIServer上报一条事件,事件类型分为Normal(正常事件)和Warning(异常事件)

    表5 事件类检查项

    故障检查项

    功能

    说明

    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秒。

    表6 系统组件检查

    故障检查项

    功能

    说明

    容器网络组件异常

    CNIProblem

    检查CNI组件(容器网络组件)运行状态

    容器运行时组件异常

    CRIProblem

    检查节点CRI组件(容器运行时组件)Docker和Containerd的运行状态

    检查对象:Docker或Containerd

    Kubelet频繁重启

    FrequentKubeletRestart

    通过定期回溯系统日志,检查关键组件Kubelet是否频繁重启

    • 默认阈值:10分钟内重启10次

      即在10分钟内组件重启10次表示频繁重启,将会产生故障告警。

    • 监听对象:/run/log/journal目录下的日志
    说明:

    Ubuntu和HCE2.0操作系统由于日志格式不兼容,暂不支持上述检查项。

    Docker频繁重启

    FrequentDockerRestart

    通过定期回溯系统日志,检查容器运行时Docker是否频繁重启

    Containerd频繁重启

    FrequentContainerdRestart

    通过定期回溯系统日志,检查容器运行时Containerd是否频繁重启

    Kubelet服务异常

    KubeletProblem

    检查关键组件Kubelet的运行状态

    KubeProxy异常

    KubeProxyProblem

    检查关键组件KubeProxy的运行状态

    表7 系统指标

    故障检查项

    功能

    说明

    连接跟踪表耗尽

    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两者的较小值。
    表8 存储检查

    故障检查项

    功能

    说明

    磁盘只读

    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状态

    典型场景:操作系统硬盘驱动异常或底层网络严重故障导致磁盘无法响应

    • 检查对象:所有数据盘
    • 数据来源:

      /proc/diskstat

      等效查询命令:
      iostat -xmt 1
    • 阈值:
      • 平均利用率,ioutil >= 0.99
      • 平均IO队列长度,avgqu-sz >=1
      • 平均IO传输量,iops(w/s) +ioth(wMB/s) <= 1
      说明:

      部分操作系统卡IO时无数据变化,此时计算CPU IO时间占用率,iowait > 0.8。

    磁盘慢IO

    DiskSlow

    检查节点上所有磁盘是否存在慢IO,即IO读写有响应但响应缓慢

    典型场景:云硬盘由于网络波动导致慢IO。

    • 检查对象:所有数据盘
    • 数据来源:

      /proc/diskstat

      等效查询命令
      iostat -xmt 1
    • 默认阈值:

      平均IO时延,await >= 5000ms

    说明:

    卡IO场景下该检查项失效,原因为IO请求未有响应,await数据不会刷新。

    表9 其他检查

    故障检查项

    功能

    说明

    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进行补足。

    表10 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(节点故障控制器组件),该组件参照Kubernetes节点控制器实现,针对NPD探测上报的故障,自动为节点添加污点以进行基本的节点故障隔离。

表11 参数说明

参数

说明

默认值

npc.enable

是否启用npc

1.18.0及以上版本不再支持该参数

true

npc.maxTaintedNode

单个故障在多个节点间发生时,至多多少节点允许被npc添加污点,避免雪崩效应

支持int格式和百分比格式

10%

值域:

  • int格式,数值范围为1到无穷大
  • 百分比格式,数值范围为1%到100%,与集群节点数量乘积计算后最小值为1。

npc.nodeAffinity

Controller的节点亲和性配置

N/A

查看NPD事件

NPD上报的事件可以在节点管理页面查询。

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“节点管理”
  3. 在节点所在行,单击“事件”,可查看节点相关事件。

    图1 查看节点事件

    如下所示,当有事件上报可以查询。

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 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
..

版本记录

表12 CCE节点故障检测插件版本记录

插件版本

支持的集群版本

更新特性

社区版本

1.18.46

v1.21

v1.23

v1.25

v1.27

v1.28

适配CCE v1.28版本

0.8.10

1.18.22

v1.19

v1.21

v1.23

v1.25

v1.27

-

0.8.10

1.18.14

v1.19

v1.21

v1.23

v1.25

  • 支持插件实例AZ反亲和配置
  • 支持在竞价实例被释放前给节点加污点,驱逐节点上的pod
  • 插件挂载节点时区

0.8.10

1.18.10

v1.19

v1.21

v1.23

v1.25

  • 配置界面优化
  • 优化DiskSlow检查项,支持阈值配置
  • 优化NTPProblem检查项,支持阈值配置
  • 支持插件实例AZ反亲和配置
  • 支持竞价实例中断检测,中断前驱逐节点上的pod

0.8.10

1.17.4

v1.17

v1.19

v1.21

v1.23

v1.25

优化DiskHung检查项

0.8.10

1.17.3

v1.17

v1.19

v1.21

v1.23

v1.25

  • NPC最大可打污点节点数支持百分比配置
  • 新增进程Z状态检查项ProcessZ
  • 优化NTPProblem检查项,支持检测时间偏差
  • 修复BMS节点场景存在常驻D状态进程,干扰ProcessD检查项

0.8.10

1.17.2

v1.17

v1.19

v1.21

v1.23

v1.25

  • 新增磁盘卡IO检查项DiskHung
  • 新增磁盘慢IO检查项DiskSlow
  • 新增进程D状态检查项ProcessD
  • 新增挂载点健康检查MountPointProblem
  • 避免与Service端口范围冲突,默认健康检查监听端口修改为19900,默认Prometheus指标暴露端口修改为19901。
  • 新增支持1.25集群版本

0.8.10

1.16.4

v1.17

v1.19

v1.21

v1.23

  • 新增beta检查项ScheduledEvent,支持通过metadata接口检测宿主机异常导致虚拟机进行冷热迁移事件。该检查项默认不开启。

0.8.10

1.16.3

v1.17

v1.19

v1.21

v1.23

新增ResolvConf配置文件检查。

0.8.10

1.16.1

v1.17

v1.19

v1.21

v1.23

  • 新增node-problem-controller。支持基本故障隔离能力。
  • 新增PID、FD、磁盘、内存、临时卷存储池、持久卷存储池检查项。

0.8.10

1.15.0

v1.17

v1.19

v1.21

v1.23

  • 检测项全面加固,避免误报。
  • 支持内核巡检。支持OOMKilling事件,TaskHung事件上报。

0.8.10

1.14.11

v1.17

v1.19

v1.21

适配CCE v1.21集群

0.7.1

1.14.5

v1.17

v1.19

修复监控指标无法被获取的问题

0.7.1

1.14.4

v1.17

v1.19

  • 适配containerd运行时节点

0.7.1

1.14.2

v1.17

v1.19

  • 适配CCE v1.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