简介

node-export 主要用来做Linux服务器监控,比如服务器的进程数、消耗了多少 CPU、内存,磁盘空间,iops,tcp连接数等资源。

Node Exporter 是用于暴露 *NIX 主机指标的 Exporter,比如采集 CPU、内存、磁盘等信息。采用 Go 编写,不存在任何第三方依赖,所以只需要下载解压即可运行。

Exporter是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为Prometheus支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。

node-exporter用于采集服务器层面的运行指标,包括机器的loadavg、filesystem、meminfo等基础监控,类似于传统主机监控维度的zabbix-agent

安装 / 使用

下载并程序放在/usr/local/bin下且赋权

配置

默认启用的收集器及其对应flag:https://github.com/prometheus/node_exporter?tab=readme-ov-file#include--exclude-flags

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 不带参数,静默启动
☸ ➜ ./node_exporter

# --web.listen-address=":9100" # 监听的端口,默认是9100
# --web.telemetry-path="/metrics" # metrics的路径,默认为/metrics
# --web.disable-exporter-metrics # 是否禁用go、prome默认的metrics
# --web.max-requests=40 # 最大并行请求数,默认40,设置为0时不限制
# --log.level="info" # 日志等级: [debug, info, warn, error, fatal]
# --log.format=logfmt # 置日志打印target和格式: [logfmt, json]
# --version # 版本号
# --collector.{metric-name} # 各个metric对应的参数

# 以使用 --collectors.enabled参数指定node_exporter收集的功能模块,或者用--no-collector指定不需要的模块,如果不指定,将使用默认配置。

配置启动脚本

vim /usr/lib/systemd/system/node_exporter.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=node_exporter
After=network.target
#可以创建相应的用户和组 启动
# User=prometheus
# Group=prometheus
[Service]
ExecStart=/usr/local/bin/node_exporter\
--web.listen-address=:9100
# 服务自拉起
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target

启动 node_exporter

1
2
3
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter

验证监控数据

1
curl http://localhost:9100/metrics

kube-prom operator监听

Service & Endpoints & ServiceMonitor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
apiVersion: v1
kind: Service
metadata:
name: external-node-exporter
namespace: cattle-monitoring-system
labels:
app: external-node-exporter
app.kubernetes.io/name: node-exporter
spec:
type: ClusterIP
ports:
- name: metrics
port: 9100
protocol: TCP
targetPort: 9100
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-node-exporter
namespace: cattle-monitoring-system
labels:
app: external-node-exporter
app.kubernetes.io/name: node-exporter
subsets:
- addresses:
# 此处是对应安装了node_exporter服务器的ip
- ip: xxx1
- ip: xxx2
ports:
- name: metrics
port: 9100
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: external-node-exporter
namespace: cattle-monitoring-system
labels:
app: external-node-exporter
release: prometheus
spec:
selector:
matchLabels: # Service选择器
app: external-node-exporter
namespaceSelector: # Namespace选择器
matchNames:
- cattle-monitoring-system
endpoints:
- port: metrics # 采集节点端口(svc定义)
interval: 1m # 采集频率根据实际需求配置,prometheus默认15s
path: /metrics # 默认地址/metrics
scheme: http

告警规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
groups:
- name: 主机状态-监控告警
rules:
- alert: 主机状态
expr: up == 0
for: 1m
labels:
status: 非常严重
annotations:
summary: "{{$labels.instance}}:服务器宕机"
description: "{{$labels.instance}}:服务器延时超过5分钟"
- alert: CPU使用情况
expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 60
for: 1m
labels:
status: 一般告警
annotations:
summary: "{{$labels.mountpoint}} CPU使用率过高!"
description: "{{$labels.mountpoint }} CPU使用大于60%(目前使用:{{$value}}%)"
- alert: 内存使用
expr: 100 -(node_memory_MemTotal_bytes -node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes ) / node_memory_MemTotal_bytes * 100> 80
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 内存使用率过高!"
description: "{{$labels.mountpoint }} 内存使用大于80%(目前使用:{{$value}}%)"
- alert: IO性能
expr: 100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入磁盘IO使用率过高!"
description: "{{$labels.mountpoint }} 流入磁盘IO大于60%(目前使用:{{$value}})"
- alert: 网络
expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流入网络带宽过高!"
description: "{{$labels.mountpoint }}流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: 网络
expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 流出网络带宽过高!"
description: "{{$labels.mountpoint }}流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"
- alert: TCP会话
expr: node_netstat_Tcp_CurrEstab > 1000
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} TCP_ESTABLISHED过高!"
description: "{{$labels.mountpoint }} TCP_ESTABLISHED大于1000%(目前使用:{{$value}}%)"
- alert: 磁盘容量
expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 80
for: 1m
labels:
status: 严重告警
annotations:
summary: "{{$labels.mountpoint}} 磁盘分区使用率过高!"
description: "{{$labels.mountpoint }} 磁盘分区使用大于80%(目前使用:{{$value}}%)"

写入自定义指标

参考使用:https://github.com/prometheus-community/node-exporter-textfile-collector-scripts

grafana dashboard id【1860】