Node Exporter网络隔离环境:离线部署与内部镜像方案
引言:企业级监控的离线挑战
在企业级IT环境中,网络隔离是常见的安全要求。生产环境往往部署在严格的内网环境中,无法直接访问外部互联网资源。这种情况下,如何部署和维护Prometheus Node Exporter成为一个技术挑战。
传统在线部署方式在隔离网络中完全失效,您无法直接从公共镜像仓库或Quay.io拉取镜像,也无法使用包管理工具在线安装依赖。本文将为您提供一套完整的Node Exporter离线部署解决方案,涵盖从源码编译、依赖管理到内部镜像仓库建设的全流程。
离线部署架构设计
整体架构图
核心组件说明
| 组件 | 职责 | 部署位置 |
|---|---|---|
| 内部镜像仓库 | 存储Docker镜像,替代公共镜像仓库 | 隔离网络内部 |
| 源码编译环境 | 编译Node Exporter二进制文件 | 开发/构建服务器 |
| 二进制包仓库 | 存储编译好的二进制文件和RPM/DEB包 | 文件服务器 |
| 配置管理 | 管理启动参数和配置文件 | 配置服务器 |
离线部署详细方案
方案一:源码编译部署
环境准备
在可访问互联网的环境中准备编译工具链:
# 安装Go语言环境
wget https://golang.org/dl/go1.23.0.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> /etc/profile
source /etc/profile
# 安装编译依赖
yum install -y make gcc glibc-static # CentOS/RHEL
# 或
apt-get install -y make gcc libc6-dev # Ubuntu/Debian
源码编译过程
# 克隆源码(在可联网环境)
git clone https://gitcode.com/GitHub_Trending/no/node_exporter.git
cd node_exporter
# 编译二进制文件
make build
# 验证编译结果
./node_exporter --version
# 打包编译产物
tar czf node_exporter-1.8.0-offline.tar.gz \
node_exporter \
examples/systemd/node_exporter.service \
examples/systemd/sysconfig.node_exporter \
LICENSE NOTICE
离线安装脚本
创建安装脚本 install_node_exporter.sh:
#!/bin/bash
set -e
NODE_EXPORTER_VERSION="1.8.0"
INSTALL_DIR="/usr/local/bin"
CONFIG_DIR="/etc/sysconfig"
SYSTEMD_DIR="/etc/systemd/system"
TEXTFILE_DIR="/var/lib/node_exporter/textfile_collector"
# 创建用户和目录
useradd --system --no-create-home --shell /sbin/nologin node_exporter
mkdir -p $TEXTFILE_DIR
chown node_exporter:node_exporter $TEXTFILE_DIR
# 安装二进制文件
cp node_exporter $INSTALL_DIR/
chmod +x $INSTALL_DIR/node_exporter
# 安装配置文件
cp sysconfig.node_exporter $CONFIG_DIR/node_exporter
# 安装systemd服务
cp node_exporter.service $SYSTEMD_DIR/
cp node_exporter.socket $SYSTEMD_DIR/
# 重载systemd配置
systemctl daemon-reload
systemctl enable node_exporter.socket
systemctl enable node_exporter.service
echo "Node Exporter $NODE_EXPORTER_VERSION 安装完成"
方案二:Docker镜像离线部署
构建自定义Docker镜像
创建 Dockerfile.offline:
FROM alpine:3.18
ARG VERSION=1.8.0
# 添加编译好的二进制文件
COPY node_exporter /bin/node_exporter
# 创建非root用户
RUN adduser -D -u 1000 node_exporter
# 创建数据目录
RUN mkdir -p /host && chown node_exporter:node_exporter /host
USER node_exporter
EXPOSE 9100
ENTRYPOINT ["/bin/node_exporter"]
CMD ["--path.rootfs=/host"]
镜像构建和导出
# 构建镜像
docker build -f Dockerfile.offline -t internal-registry:5000/node-exporter:1.8.0-offline .
# 导出镜像
docker save internal-registry:5000/node-exporter:1.8.0-offline > node-exporter-1.8.0-offline.tar
# 在离线环境中导入镜像
docker load < node-exporter-1.8.0-offline.tar
Docker Compose离线部署配置
创建 docker-compose-offline.yml:
version: '3.8'
services:
node_exporter:
image: internal-registry:5000/node-exporter:1.8.0-offline
container_name: node_exporter
command:
- '--path.rootfs=/host'
- '--collector.textfile.directory=/textfile'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
- '/var/lib/node_exporter/textfile_collector:/textfile:ro'
environment:
- TZ=Asia/Shanghai
方案三:包管理方式部署
制作RPM包
创建 node_exporter.spec:
Name: node_exporter
Version: 1.8.0
Release: 1%{?dist}
Summary: Prometheus Node Exporter
License: Apache-2.0
URL: https://github.com/prometheus/node_exporter
%description
Prometheus exporter for hardware and OS metrics exposed by *NIX kernels.
%prep
# 此处放置源码准备步骤
%build
make build
%install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_sysconfdir}/sysconfig
mkdir -p %{buildroot}%{_unitdir}
mkdir -p %{buildroot}/var/lib/node_exporter/textfile_collector
install -m 755 node_exporter %{buildroot}%{_bindir}/node_exporter
install -m 644 examples/systemd/sysconfig.node_exporter %{buildroot}%{_sysconfdir}/sysconfig/node_exporter
install -m 644 examples/systemd/node_exporter.service %{buildroot}%{_unitdir}/
install -m 644 examples/systemd/node_exporter.socket %{buildroot}%{_unitdir}/
%files
%{_bindir}/node_exporter
%{_sysconfdir}/sysconfig/node_exporter
%{_unitdir}/node_exporter.service
%{_unitdir}/node_exporter.socket
/var/lib/node_exporter/textfile_collector
%post
useradd --system --no-create-home --shell /sbin/nologin node_exporter || true
chown node_exporter:node_exporter /var/lib/node_exporter/textfile_collector
systemctl daemon-reload >/dev/null 2>&1 || true
%preun
systemctl stop node_exporter.service >/dev/null 2>&1 || true
systemctl stop node_exporter.socket >/dev/null 2>&1 || true
%postun
systemctl daemon-reload >/dev/null 2>&1 || true
内部镜像仓库建设
使用Harbor搭建私有仓库
# 下载Harbor离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz
# 解压并配置
tar xzf harbor-offline-installer-v2.8.0.tgz
cd harbor
cp harbor.yml.tmpl harbor.yml
# 编辑配置文件
vim harbor.yml
# 安装Harbor
./install.sh
镜像同步策略
手动同步方案
# 在联网环境拉取官方镜像
docker pull quay.io/prometheus/node-exporter:latest
# 重新打标签
docker tag quay.io/prometheus/node-exporter:latest internal-registry:5000/node-exporter:latest
# 推送到内部仓库
docker push internal-registry:5000/node-exporter:latest
# 导出镜像备份
docker save internal-registry:5000/node-exporter:latest > node-exporter-backup.tar
自动同步方案
使用Harbor的复制功能实现自动同步:
- 在Harbor管理界面创建复制规则
- 配置源 registry 为公共镜像仓库或Quay.io
- 设置目标项目为 node-exporter
- 配置触发模式为定时同步
配置管理和优化
离线环境配置模板
创建 node_exporter_offline.yml:
# Node Exporter 离线部署配置
version: 1.8.0
deployment:
method: binary # 可选: binary, docker, package
architecture: amd64
checksum: sha256:abc123...
collectors:
enabled_by_default:
- cpu
- meminfo
- diskstats
- filesystem
- netdev
- loadavg
disabled:
- perf # 离线环境建议禁用高性能消耗收集器
flags:
web:
listen-address: ":9100"
path:
rootfs: "/host" # Docker部署时使用
textfile:
directory: "/var/lib/node_exporter/textfile_collector"
systemd:
service_template: "examples/systemd/node_exporter.service"
socket_template: "examples/systemd/node_exporter.socket"
sysconfig_template: "examples/systemd/sysconfig.node_exporter"
monitoring:
scrape_interval: "1m"
scrape_timeout: "10s"
性能优化配置
# 优化启动参数
--web.max-requests=40 \
--collector.disable-defaults \
--collector.cpu \
--collector.meminfo \
--collector.diskstats \
--collector.filesystem \
--collector.netdev \
--collector.loadavg \
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector
验证和监控
健康检查脚本
创建 health_check.sh:
#!/bin/bash
set -e
NODE_EXPORTER_URL="http://localhost:9100"
HEALTH_CHECK_TIMEOUT=10
# 检查进程是否存在
if ! pgrep -x "node_exporter" > /dev/null; then
echo "ERROR: Node Exporter process not found"
exit 1
fi
# 检查端口监听
if ! ss -tln | grep -q ":9100"; then
echo "ERROR: Node Exporter not listening on port 9100"
exit 1
fi
# 检查HTTP端点
if ! curl -s --max-time $HEALTH_CHECK_TIMEOUT "$NODE_EXPORTER_URL/metrics" | grep -q "node_"; then
echo "ERROR: Node Exporter metrics endpoint not responding correctly"
exit 1
fi
echo "SUCCESS: Node Exporter is healthy"
exit 0
监控指标说明
| 指标名称 | 类型 | 描述 | 告警阈值 |
|---|---|---|---|
| node_exporter_build_info | Gauge | 版本构建信息 | - |
| node_scrape_collector_duration_seconds | Summary | 收集器执行时间 | > 10s |
| node_scrape_collector_success | Gauge | 收集器执行状态 | 0 |
| process_cpu_seconds_total | Counter | CPU使用时间 | - |
| process_resident_memory_bytes | Gauge | 内存使用量 | > 512MB |
故障排除和维护
常见问题解决
日志分析指南
# 查看实时日志
journalctl -u node_exporter -f
# 查看错误日志
journalctl -u node_exporter --since "1 hour ago" | grep -i error
# 性能分析
journalctl -u node_exporter --since "1 hour ago" | grep "duration_seconds"
安全加固措施
网络隔离配置
# 防火墙规则示例
firewall:
rules:
- direction: INGRESS
port: 9100
source: ["10.0.0.0/8"] # 只允许内网访问
action: ALLOW
- direction: INGRESS
port: 9100
source: ["0.0.0.0/0"]
action: DROP
权限最小化
# 创建专用用户
useradd --system --no-create-home --shell /sbin/nologin node_exporter
# 设置文件权限
chown root:node_exporter /usr/local/bin/node_exporter
chmod 750 /usr/local/bin/node_exporter
# 设置Capabilities(如果需要)
setcap cap_sys_time+ep /usr/local/bin/node_exporter
版本更新策略
离线更新流程
总结
Node Exporter在离线环境的部署需要综合考虑源码编译、依赖管理、镜像仓库建设等多个方面。通过本文提供的方案,您可以在完全隔离的网络环境中建立稳定可靠的监控数据采集体系。
关键成功因素包括:
- 完善的准备工作:在联网环境完成所有依赖下载和编译工作
- 可靠的内部仓库:建设稳定的镜像和包管理仓库
- 严格的验证流程:确保每个版本在部署前经过充分测试
- 自动化运维:通过脚本和工具减少人工操作错误
通过实施这些方案,您的企业可以在保持网络隔离安全要求的同时,享受Prometheus生态带来的强大监控能力。
提示:在实际部署前,建议在测试环境充分验证所有步骤,确保离线部署流程的可靠性和稳定性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



