Node Problem Detector¶
Node Problem Detector 简称 NPD,是 Kubernetes 开源的集群节点监控插件,用于节点故障检查。
NPD 功能:
- 产生事件信息,上报给 APIServer。
- 检测指标信息,输出为 Metrics。
配置¶
前置条件¶
- 安装 K8S 环境
- 安装 DataKit
安装 NPD¶
可以参考安装文档,这里采用 yaml
的方式进行安装。
kubectl apply -f rbac.yaml
kubectl apply -f node-problem-detector-config.yaml
kubectl apply -f node-problem-detector.yaml
日志事件模式¶
默认安装 NPD 后,无需其他配置,Datakit 默认采集 Kubernetes 事件,存储至数据来源是 Kubernetes_events
的日志reason
(tag)中。
指标模式¶
除了事件模式外,NPD 也支持输出指标
准备工作¶
DataKit 开启 ServiceMonitor
¶
自动发现 Pod/Service 的 Prometheus 指标
以下通过ServiceMonitor
方式采集 NPD
指标信息
- 调整 node-problem-detector.yaml
...
- name: node-problem-detector
command:
- /node-problem-detector
- --logtostderr
- --config.system-log-monitor=/config/kernel-monitor.json,/config/docker-monitor.json
- --address=0.0.0.0
- --prometheus-address=0.0.0.0
...
ports:
- containerPort: 20257
hostPort: 20257
name: man-port
- 创建
npd-service.yaml
apiVersion: v1
kind: Service
metadata:
name: node-problem-detector
namespace: kube-system
labels:
app: node-problem-detector
spec:
selector:
app: node-problem-detector
ports:
- protocol: TCP
port: 20257
targetPort: 20257
name: metrics
- 创建
npd-server-monitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: npd-server-metrics
labels:
app: node-problem-detector
namespace: kube-system
spec:
selector:
matchLabels:
app: node-problem-detector
endpoints:
- port: metrics
params:
measurement:
- node-problem-detector
- 执行
kubectl apply -f rbac.yaml
kubectl apply -f node-problem-detector-config.yaml
kubectl apply -f node-problem-detector.yaml
kubectl apply -f npd-service.yaml
kubectl apply -f npd-server-monitor.yaml
指标¶
problem_gauge¶
Tag | 描述 |
---|---|
type="ConntrackFullProblem" |
节点链接跟踪表故障 |
type="EmptyDirVolumeGroupStatusError" | 临时卷存储池故障 |
type="MemoryProblem" | 节点内存故障 |
type="LocalPvVolumeGroupStatusError" | 节点上持久卷存储池故障 |
type="MountPointProblem" | 节点挂载点故障 |
type="FDProblem" | 系统关键资源FD文件句柄数故障 |
type="DiskHung" | 节点磁盘是否存在卡 IO |
type="DiskReadonly" | 节点磁盘是否只读 |
type="DiskProblem" | 节点系统盘故障 |
type="DiskSlow" | 节点磁盘是否存在慢 IO 故障 |
type="FrequentCRIRestart" | CRI 频繁重启 |
type="FrequentDockerRestart" | Docker 频繁重启 |
type="FrequentKubeletRestart" | Kubelet 频繁重启 |
type="FrequentContainerdRestart" | Containerd 频繁重启 |
type="NTPProblem" | ntpd 同步异常 |
type="PIDProblem" | 系统关键资源 PID 进程资源不足 |
type="ResolvConfFileProblem " |
ResolvConf 配置异常 |
type="CNIProblem" | CNI(容器网络)组件异常 |
type="CRIProblem" | 组件CRI(容器运行时组件)Docker 或 Containerd 的运行状态异常 |
type="KUBEPROXYProblem " |
Kube-proxy 运行异常 |
type="KUBELETProblem " |
Kubelet 状态异常 |
type="ScheduledEvent" | 点是否存在主机计划事件 |
type="ProcessD" | 节点存在 D 进程 |
type="ProcessZ" | 节点存在 Z 进程 |
日志¶
以下列表包含但不限于默认配置下 NPD 能够检测的事件,事件写入至数据来源为Kubernetes_events
的日志中:
原因 | 持久性 | 描述 |
---|---|---|
DockerHung |
是 | Docker 挂起或无响应 |
ReadonlyFilesystem |
是 | 文件系统被挂载为只读模式,通常是一种保护机制,在某些情况下防止文件系统损坏 |
CorruptDockerOverlay2 |
是 | Overlay2 存储驱动存在问题 |
ContainerdUnhealthy |
是 | Containerd 处于非健康状态 |
KubeletUnhealthy |
是 | Kubelet 处于非健康状态 |
DockerUnhealthy |
是 | Docker 处于非健康状态 |
OOMKilling |
否 | Kubernetes 因 OOM 结束 Pod |
TaskHung |
否 | 任务挂起 |
UnregisterNetDevice |
否 | 网络接口异常 |
KernelOops |
否 | 内核检测到的异常行为,例如:空指针、设备错误 |
Ext4Error |
否 | Ext4 文件系统问题 |
Ext4Warning |
否 | Ext4 文件系统问题 |
IOError |
否 | 缓冲区问题 |
MemoryReadError |
否 | 可被修复的内存错误,频繁发生意味着内存硬件可能出现问题 |
KubeletStart |
否 | Kubelet 启动,频繁出现意味 Kubelet 频繁重启 |
DockerStart |
否 | Docker 启动,频繁出现意味 Docker 频繁重启 |
ContainerdStart |
否 | Containerd 启动,频繁出现意味 Containerd 频繁重启 |
CorruptDockerImage |
否 | Docker registry 使用的目录不为空 |
DockerContainerStartupFailure |
否 | Docker 无法启动 |
ConntrackFull |
否 | 网络连接跟踪数满,将影响 NAT、防火墙等网络功能 |
NTPIsDown |
否 | NTP时间同步异常 |