更新时间:2024-04-23 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(节点故障控制器组件,简称NPC),该组件参照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.19.1

v1.21

v1.23

v1.25

v1.27

v1.28

v1.29

修复部分问题

0.8.10

1.19.0

v1.21

v1.23

v1.25

v1.27

v1.28

修复部分问题

0.8.10

1.18.48

v1.21

v1.23

v1.25

v1.27

v1.28

修复部分问题

0.8.10

1.18.46

v1.21

v1.23

v1.25

v1.27

v1.28

适配CCE v1.28版本

0.8.10

1.18.24

v1.19

v1.21

v1.23

v1.25

v1.27

修复部分问题

0.8.10

1.18.23

v1.19

v1.21

v1.23

v1.25

v1.27

修复部分问题

0.8.10

1.18.22

v1.19

v1.21

v1.23

v1.25

v1.27

-

0.8.10

1.18.21

v1.19

v1.21

v1.23

v1.25

v1.27

-

0.8.10

1.18.18

v1.19

v1.21

v1.23

v1.25

v1.27

适配CCE 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

  • 适配ARM64节点部署
  • 适配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

分享:

    相关文档

    相关产品