ezra-sullivan
发布于 2025-06-25 / 1 阅读
0
0

04 - Prometheus Exporter -Node Exporter 部署使用

更新时间:2025 年 6 月

版本:node exporter 1.9.1

node exporter 的 GitHub 地址:prometheus/node_exporter: Exporter for machine metrics

简介

Node Exporter 是 Prometheus 官方提供的系统级监控 Exporter,专门用于收集 Unix/Linux 系统的硬件和操作系统指标。它是 Prometheus 生态系统中使用最广泛的 Exporter 之一

主要功能

  • 硬件监控:CPU、内存、磁盘、网络接口等硬件资源使用情况
  • 系统监控:文件系统、负载、内核统计、系统启动时间等
  • 进程监控:系统进程数量、状态等
  • 网络监控:网络接口统计、连接状态等

特点

  • 轻量级:占用系统资源极少
  • 无侵入性:通过读取 /proc/sys 等系统文件系统获取指标,不影响系统性能
  • 高度可配置:支持启用/禁用特定的收集器(collector)
  • 跨平台:支持 Linux、Darwin、FreeBSD、OpenBSD、DragonFly、Solaris 等

部署

方式一:二进制文件(推荐)

部署

基础变量设置

NODE_EXPORTER_VERSION=1.9.1
NODE_EXPORTER_OS=linux
NODE_EXPORTER_ARCH=amd64

NODE_EXPORTER_HOME=/opt/node_exporter
NODE_EXPORTER_CONF=/etc/node_exporter


NODE_EXPORTER_USER=node_exporter
NODE_EXPORTER_USER_GROUP=node_exporter


# 创建目录
mkdir -p ${NODE_EXPORTER_HOME}/bin
mkdir -p ${NODE_EXPORTER_CONF}


# 创建用户和组
groupadd --system ${NODE_EXPORTER_USER}
useradd -s /sbin/nologin --system -g ${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_USER}

下载解压

下载

# 下载
curl -x http://192.168.111.1:10811 \
    -o /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz \
    -L https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz


解压

# 
tar -zxvf /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz \
    -C /usr/local/src/

复制到对应目录

cp /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}/*    \
    ${NODE_EXPORTER_HOME}/bin

授权

chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER_GROUP}  ${NODE_EXPORTER_HOME}
chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER_GROUP}  ${NODE_EXPORTER_CONF}

配置

配置环境变量

cat > /etc/profile.d/node_exporter.sh << EOF

export NODE_EXPORTER_VERSION=${NODE_EXPORTER_VERSION}

export NODE_EXPORTER_HOME=${NODE_EXPORTER_HOME}
export NODE_EXPORTER_CONF=${NODE_EXPORTER_CONF}

export NODE_EXPORTER_USER=${NODE_EXPORTER_USER}
export NODE_EXPORTER_USER_GROUP=${NODE_EXPORTER_USER_GROUP}

export PATH=\${PATH}:\${NODE_EXPORTER_HOME}/bin

EOF

source /etc/profile

配置程序

通过环境文件导入 systemd 启动变量

$ sudo -u ${NODE_EXPORTER_USER} vim ${NODE_EXPORTER_CONF}/env.conf

# 排除挂载点(正则)
MOUNT_POINTS_EXCLUDE="^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)($|/)"

# 监听端口
LISTEN_ADDRESS=":9100"

# 
PROCFS="/proc"

SYSFS="/sys"


# 额外的 collector
EXTRA_COLLECTORS="--collector.systemd --collector.processes"

配置启动脚本

$ sudo -u ${NODE_EXPORTER_USER} vim ${NODE_EXPORTER_HOME}/start.sh

#!/bin/bash
set -eu

# 加载环境变量
# 也可以在 systemd 的 service 中引入
# source /etc/node_exporter/env.conf

exec /opt/node_exporter/bin/node_exporter \
  $EXTRA_COLLECTORS \
  --web.listen-address="$LISTEN_ADDRESS" \
  --path.procfs="$PROCFS" \
  --path.sysfs="$SYSFS" \
  --collector.filesystem.mount-points-exclude="$MOUNT_POINTS_EXCLUDE"

授权

sudo -u ${NODE_EXPORTER_USER} chmod 700 ${NODE_EXPORTER_HOME}/start.sh

配置 systemd 管理

创建服务文件

cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=${NODE_EXPORTER_USER}
Group=${NODE_EXPORTER_USER_GROUP}
Type=simple
EnvironmentFile=${NODE_EXPORTER_CONF}/env.conf
ExecStart=${NODE_EXPORTER_HOME}/start.sh

# CPU 和内存限制(以 systemd 单位)
# CPU 利用率限制为 10%(1 核为 100%)
CPUAccounting=yes
CPUQuota=10%
# 内存限制 50MB
MemoryMax=50M


Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

EOF

启动

# 重新加载 systemd
systemctl daemon-reload


# 启动并设置开机自启
systemctl enable --now node_exporter

验证

curl localhost:9100/metrics

防火墙配置

firewall-cmd --permanent --new-service=node-exporter

firewall-cmd --permanent --service=node-exporter --add-port=9100/tcp

firewall-cmd --permanent --zone=public --add-service=node-exporter


firewall-cmd --reload 


方式二:Docker

参考:node_exporter/README.md

Node Exporter 旨在监控主机系统,在容器中部署时需要格外小心,以避免监控容器本身而非宿主机

dockerhub 地址:prom/node-exporter - Docker Image | Docker Hub

基础变量设置

NODE_EXPORTER_VERSION=1.9.1

NODE_EXPORTER_USER=node-exporter
NODE_EXPORTER_USER_GROUP=node-exporter


# 创建用户和组
groupadd --system ${NODE_EXPORTER_USER}
useradd -s /sbin/nologin --system -g ${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_USER}

配置环境变量

cat > /etc/profile.d/node_exporter.sh << EOF

export NODE_EXPORTER_VERSION=${NODE_EXPORTER_VERSION}

export NODE_EXPORTER_USER=${NODE_EXPORTER_USER}
export NODE_EXPORTER_USER_GROUP=${NODE_EXPORTER_USER_GROUP}

EOF

source /etc/profile

基本命令

docker run -d --name node-exporter --restart=always \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  --cpus 0.1 \
  --memory 50M \
  prom/node-exporter:v${NODE_EXPORTER_VERSION} \
  --path.rootfs=/host \
  --path.procfs=/host/proc \
  --path.sysfs=/host/sys \
  --collector.filesystem.mount-points-exclude='^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)($|/)'
  
  

使用 Docker Compose

基础变量设置

NODE_EXPORTER_HOME=/opt/node_exporter


mkdir -p ${NODE_EXPORTER_HOME}

编写 compose.yaml

cat > ${NODE_EXPORTER_HOME}/compose.yaml << EOF
---
services:
  node_exporter:
    image: prom/node-exporter:v${NODE_EXPORTER_VERSION} 
    container_name: node_exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)(\$|/)'
    ports:
      - 9100:9100
    network_mode: host
EOF

docker compose 运行

cd ${NODE_EXPORTER_HOME} && docker compose up -d

验证

curl localhost:9100/metrics

重要参数说明

  • --net="host":使用主机网络模式
  • --pid="host":使用主机 PID 命名空间
  • --path.rootfs=/host:指定主机根文件系统挂载路径
  • --path.procfs=/host/proc:指定 proc 文件系统路径
  • --path.sysfs=/host/sys:指定 sys 文件系统路径

方式三:Kubernetes 中部署(尚未测试)

DaemonSet 部署

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true
      hostPID: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:latest
        args:
          - '--path.procfs=/host/proc'
          - '--path.rootfs=/rootfs'
          - '--path.sysfs=/host/sys'
          - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
        ports:
        - containerPort: 9100
          name: metrics
        volumeMounts:
        - name: proc
          mountPath: /host/proc
          readOnly: true
        - name: sys
          mountPath: /host/sys
          readOnly: true
        - name: rootfs
          mountPath: /rootfs
          readOnly: true
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: sys
        hostPath:
          path: /sys
      - name: rootfs
        hostPath:
          path: /
      tolerations:
      - effect: NoSchedule
        operator: Exists
      - effect: NoExecute
        operator: Exists

常用指标

CPU 相关

  • node_cpu_seconds_total:CPU 时间统计(按模式分类:user, system, idle, iowait 等)
  • node_load1node_load5node_load15:系统负载(1分钟、5分钟、15分钟平均)

内存相关

  • node_memory_MemTotal_bytes:总内存大小
  • node_memory_MemFree_bytes:空闲内存
  • node_memory_MemAvailable_bytes:可用内存
  • node_memory_Buffers_bytes:缓冲区内存
  • node_memory_Cached_bytes:缓存内存
  • node_memory_SwapTotal_bytesnode_memory_SwapFree_bytes:交换分区信息

磁盘相关

  • node_filesystem_size_bytes:文件系统总大小
  • node_filesystem_free_bytes:文件系统剩余空间
  • node_filesystem_avail_bytes:文件系统可用空间
  • node_disk_io_time_seconds_total:磁盘 I/O 时间
  • node_disk_read_bytes_totalnode_disk_written_bytes_total:磁盘读写字节数

网络相关

  • node_network_receive_bytes_total:网络接收字节数
  • node_network_transmit_bytes_total:网络发送字节数
  • node_network_receive_packets_total:网络接收包数
  • node_network_transmit_packets_total:网络发送包数

系统相关

  • node_boot_time_seconds:系统启动时间戳
  • node_time_seconds:当前系统时间戳
  • node_procs_running:正在运行的进程数
  • node_procs_blocked:被阻塞的进程数

Prometheus 配置

通用配置

在 Prometheus 配置文件 prometheus.yml 中添加 Node Exporter 的抓取配置:

$ vim ${PROMETHEUS_CONF}/prometheus.yml

scrape_configs:
......
# 增加以下信息
  - job_name: 'demo_node_exporter'
    static_configs:
      - targets: 
          - '192.168.111.199:9100'
        labels:
          level: "system"
    scrape_interval: 15s
    metrics_path: /metrics
    scrape_timeout: 10s

刷新配置

curl -X POST http://localhost:9090/-/reload

服务发现(尚未测试)

使用 Kubernetes 服务发现:

scrape_configs:
  - job_name: 'kubernetes-node-exporter'
    kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
            - monitoring
    relabel_configs:
      - source_labels: [__meta_kubernetes_endpoints_name]
        action: keep
        regex: node-exporter
      - source_labels: [__meta_kubernetes_endpoint_address_target_name]
        target_label: node

收集器管理

Node Exporter 使用收集器(collector)来收集不同类型的指标。可以通过命令行参数控制启用或禁用特定的收集器。

查看所有可用收集器

node_exporter --help | grep collector

常用收集器控制参数

# 禁用特定收集器
--no-collector.wifi
--no-collector.hwmon

# 启用默认未启用的收集器
--collector.systemd
--collector.processes

启动命令示例

node_exporter \
  --web.listen-address=:9100 \
  --path.procfs=/proc \
  --path.sysfs=/sys \
  --collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' \
  --collector.systemd \
  --collector.processes \
  --no-collector.wifi \
  --no-collector.hwmon

监控验证

检查指标端点

curl http://localhost:9100/metrics

检查特定指标

# 查看 CPU 使用率
curl -s http://localhost:9100/metrics | grep node_cpu_seconds_total

# 查看内存使用情况
curl -s http://localhost:9100/metrics | grep node_memory

在 Prometheus Web UI 中验证

访问 Prometheus Web UI:

  • Status -> Targets 页面检查 node_exporter 目标状态
  • Graph 页面查询指标,例如:
# CPU 使用率
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# 磁盘使用率
(1 - (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"})) * 100

注意事项

Docker 部署

网络模式选择

必须使用 host 网络模式

# 正确 - 使用 host 网络
docker run --net="host" prom/node-exporter

# 错误 - 使用桥接网络会导致网络指标不准确
docker run -p 9100:9100 prom/node-exporter

使用桥接网络会导致:

  • 网络接口指标显示容器网络而非主机网络
  • 无法正确监控主机网络流量
  • 网络连接统计不准确

文件系统挂载

正确的挂载方式

# 完整挂载方式
docker run -d \
  -v "/proc:/host/proc:ro" \
  -v "/sys:/host/sys:ro" \
  -v "/:/rootfs:ro" \
  --path.procfs=/host/proc \
  --path.rootfs=/rootfs \
  --path.sysfs=/host/sys \
  prom/node-exporter

常见错误

  • 不挂载 /proc/sys 导致系统指标缺失
  • 挂载路径不一致导致指标错误
  • 缺少 ro(只读)权限可能导致安全风险

PID 命名空间

必须使用主机 PID 命名空间

# 正确
docker run --pid="host" prom/node-exporter

# 错误 - 会导致进程统计不准确
docker run prom/node-exporter

不使用主机 PID 命名空间会导致:

  • 进程数量统计错误
  • 无法监控主机进程状态
  • 负载统计可能不准确

容器权限

避免使用特权模式

# 尽量避免 - 除非必要
docker run --privileged prom/node-exporter

# 推荐 - 使用最小权限
docker run --cap-add=SYS_TIME prom/node-exporter

文件系统过滤

正确配置文件系统过滤

# 正确配置 - 排除容器相关文件系统
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'

不正确的过滤会导致:

  • 监控到大量无用的容器文件系统
  • 指标数据冗余
  • 性能影响

一般部署

端口冲突

  • 默认端口 9100:确保端口未被占用
  • 防火墙配置:确保 Prometheus 服务器能访问该端口
  • 多实例部署:使用不同端口避免冲突
# 检查端口占用
netstat -tlnp | grep 9100
# 或者
ss -tlnp | grep 9100

用户权限

创建专用用户

# 避免使用 root 用户运行
sudo useradd --no-create-home --shell /bin/false node_exporter

文件权限

# 确保二进制文件权限正确
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo chmod +x /usr/local/bin/node_exporter

系统兼容性

检查系统支持

  • 确认操作系统支持所需的收集器
  • 验证 /proc/sys 文件系统可用
  • 检查内核版本兼容性

收集器兼容性

# 检查可用收集器
node_exporter --help | grep collector

# 测试特定收集器
node_exporter --collector.systemd --dry-run

资源消耗

监控资源使用

  • Node Exporter 本身也会消耗 CPU 和内存
  • 定期检查其资源使用情况
  • 根据需要调整收集器配置

资源限制

# Docker 中限制资源
docker run --memory=100m --cpus="0.5" prom/node-exporter

# systemd 中限制资源
[Service]
MemoryMax=100M
CPUQuota=50%

日志管理

配置适当的日志级别

# 生产环境建议使用 info 级别
node_exporter --log.level=info

# 调试时使用 debug 级别
node_exporter --log.level=debug

日志轮转

# systemd 自动处理日志轮转
journalctl -u node_exporter --since "1 day ago"

# Docker 容器日志大小限制
docker run --log-opt max-size=10m --log-opt max-file=3 prom/node-exporter

Kubernetes 部署

节点选择器

# 确保在所有节点上运行
nodeSelector:
  kubernetes.io/os: linux

# 或者使用节点亲和性
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/os
          operator: In
          values:
          - linux

容忍度配置

# 确保能在所有节点上运行,包括 master 节点
tolerations:
- effect: NoSchedule
  operator: Exists
- effect: NoExecute
  operator: Exists
- key: node-role.kubernetes.io/master
  effect: NoSchedule

安全上下文

# 使用适当的安全上下文
securityContext:
  runAsNonRoot: true
  runAsUser: 65534
  readOnlyRootFilesystem: true

资源请求和限制

# 设置合理的资源请求和限制
resources:
  requests:
    memory: "64Mi"
    cpu: "50m"
  limits:
    memory: "128Mi"
    cpu: "200m"

监控数据质量

1时间同步

确保时间同步

  • Node Exporter 和 Prometheus 服务器时间必须同步
  • 使用 NTP 服务保持时间准确性
  • 监控时间偏差指标

指标一致性

标签一致性

  • 确保所有节点使用相同的标签
  • 避免标签值中包含特殊字符
  • 使用有意义的实例标识

数据完整性

定期检查

# 检查指标输出
curl -s http://localhost:9100/metrics | wc -l

# 验证关键指标存在
curl -s http://localhost:9100/metrics | grep -c "node_cpu_seconds_total"

故障排查

常见问题

指标不完整或错误

  • 检查挂载点配置,确保正确映射主机文件系统
  • 验证容器权限,确保有读取 /proc/sys 的权限

容器化部署中指标异常

  • 使用 --path.rootfs=/host 参数
  • 确保使用 --net=host--pid=host

某些收集器不工作

  • 检查系统是否支持特定的功能(如 systemd、hwmon)
  • 查看日志确认是否有权限问题

调试命令

# 查看 Node Exporter 日志
journalctl -u node_exporter -f

# 检查端口监听
netstat -tlnp | grep 9100

# 测试指标输出
curl -s http://localhost:9100/metrics | head -20

性能优化

收集器优化

# 禁用不需要的收集器以减少资源消耗
--no-collector.wifi
--no-collector.hwmon
--no-collector.nfs
--no-collector.nfsd

文件系统过滤

# 排除不需要监控的文件系统挂载点
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'

抓取频率调整

在 Prometheus 配置中根据需要调整抓取间隔:

scrape_configs:
  - job_name: 'node_exporter'
    scrape_interval: 30s  # 适当增加间隔减少负载

安全考虑

网络安全

  • 使用防火墙限制对 9100 端口的访问
  • 在生产环境中避免将指标端点暴露到公网

认证和授权

Node Exporter 本身不提供认证功能,可以通过以下方式增强安全性:

  • 使用反向代理(如 Nginx)添加基本认证
  • 在 Kubernetes 中使用 Network Policy 限制访问
  • 配置 TLS 加密(通过反向代理)

最小权限原则

# 创建专用用户运行 Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter

总结

Node Exporter 是 Prometheus 监控体系中不可或缺的组件,为系统级监控提供了全面、可靠的指标收集能力。通过合理的部署和配置,可以实现对主机系统的全方位监控,为运维管理提供重要的数据支撑。

在实际使用中,建议:

  • 根据实际需求选择合适的收集器
  • 合理配置抓取频率和数据保留策略
  • 定期更新 Node Exporter 版本以获得最新功能和安全修复
  • 结合 Grafana 等可视化工具构建完整的监控仪表板

评论