云计算百科
云计算领域专业知识百科平台

没有公网 IP 怎么远程抓取服务器指标?node_exporter + Prometheus + cpolar 实战

没有公网 IP 怎么远程抓取服务器指标?node_exporter + Prometheus + cpolar 实战

前言

做服务器监控时,我最怕的一种情况不是“完全没数据”,而是每一层看起来都像正常:node_exporter 进程在跑、Prometheus 也启动了、公网地址还能打开,可指标就是抓不到。CPU、内存、磁盘和网络这些数据本身并不难采集,真正容易把人绕进去的是采集端、Prometheus 和网络入口混在一起排查。我的习惯是先把本地链路跑通,再去处理远程访问,这样一旦失败,至少知道问题在哪一层。尤其当服务器没有公网 IP 时,很容易把“外面访问不到”直接归因到网络,其实也可能只是 node_exporter 根本没启动,或者 Prometheus 的抓取目标没有配置对。

这次我在 CentOS 7 上部署 node_exporter 1.2.0,注册成 systemd 服务,再把 localhost:9100 加进 Prometheus,并实际验证“端口正常时能抓取、端口没启动时抓不到”这两种状态。确认本地采集没有问题以后,再安装 cpolar,把 9100 通过 HTTP 隧道提供到公网,让另一侧 Prometheus 改用公网地址抓取,最后继续配置固定二级子域名 node1。我更看重的是这套顺序:先证明本地采集成立,再证明跨网络抓取成立。 这样以后真遇到抓取失败,不需要同时怀疑三四个组件,也不会因为公网地址能打开就误以为监控已经完全正常。

1. 先明确这套监控链路

这次真正需要打通的是:

服务器 → node_exporter → Prometheus → 公网访问入口

其中 node_exporter 负责暴露主机指标,Prometheus 负责抓取这些指标,cpolar 只处理网络入口。

这几个角色最好不要混在一起。node_exporter 的 9100 接口能打开,只能说明采集端有响应;Prometheus 能成功抓取,才说明监控链路真正接上了。

当前流程也明确要求:在配置 node_exporter 之前,Prometheus 已经提前部署完成。

2. 在 CentOS 7 上安装 node_exporter

先下载当前使用的 node_exporter 1.2.0:

curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.2.0/node_exporter-1.2.0.linux-amd64.tar.gz

67d94e9bf4d52e5bf630219002f5fee2

下载完成后解压:

tar xvfz node_exporter-1.2.0.linux-amd64.tar.gz

50e525519c2f5818aecc5e3f4364cfd0

然后把目录移动到 /opt,并重命名为:

node_exporter

mv node_exporter-1.2.0.linux-amd64 /opt/node_exporter

93ff7acd392aadd752a4d0ddd8c3ac9b

这样后面的 systemd 配置就可以固定指向:

/opt/node_exporter/node_exporter

3. 把 node_exporter 注册成 systemd 服务

先创建或编辑服务文件:

sudo vi /etc/systemd/system/node_exporter.service

当前服务配置如下:

[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/opt/node_exporter/node_exporter

[Install]
WantedBy=default.target

a52a219f4376276f0b149cb067daae74

这里使用专用的:

  • 用户:node_exporter
  • 用户组:node_exporter
  • 启动程序:/opt/node_exporter/node_exporter

接着创建对应系统用户:

useradd –no-create-home –shell /bin/false node_exporter

984dbbcd4abf705132294920d9afd0c3

这个用户不创建家目录,也不允许登录,只用于运行 node_exporter。

然后让 systemd 重新加载服务配置,并启用 node_exporter:

systemctl daemon-reload
systemctl enable node_exporter

cf4a78285e92a6f1563c4834ca03bc2e

当前操作记录里没有单独给出 systemctl start node_exporter 的命令,只写到“启动后”通过 IP + 9100 访问,因此这里不额外补写没有出现的启动命令。

随后使用:

IP:9100

访问 node_exporter。

1ea5b3008fb70f7dd5e120ddb83d1e55

页面能够打开以后,说明 9100 服务已经可以访问。

4. 让 Prometheus 先在本地抓取 node_exporter

进入 Prometheus 安装目录,编辑:

prometheus.yml

vi prometheus.yml

617b7c63988725ef8a361a4e7afb4b4a

加入当前抓取目标:

– targets: ["localhost:9100"]
labels:
app: "node_exporter"

da4ca969172c78b2545feba4e1b7556d

这里使用的是:

localhost:9100

也就是说,这一步先不碰公网,只验证 Prometheus 能不能从本机抓到 node_exporter。

修改配置以后重启 Prometheus:

systemctl restart prometheus

f69eab54844fe0c568b150191e847712

随后可以看到 Prometheus 已经成功抓取 node_exporter 指标。

image-20250812161557785

5. 端口停掉以后,抓取会发生什么?

当前实操还专门做了一次反向验证:当 node_exporter 对应端口没有启动时,Prometheus 无法成功抓取。

6cd3706ba634cc189d2f4abcbd9f3049

我觉得这一张图反而很重要。

它说明后面如果公网监控失败,不能第一反应就去改 cpolar。先回到本地确认 9100 是否正常、Prometheus 本地能不能抓到,排查会更快。

到这里,本地链路已经有了一个很清楚的基线:

node_exporter 9100 正常 → Prometheus 抓取成功。

6. 本地抓取正常以后,再安装 cpolar

接下来才处理跨网络访问。

执行当前安装命令:

sudo curl https://get.cpolar.sh | sh

6fcd3d90953ab77775b2e3ab5c2a9111

安装完成后检查服务状态:

sudo systemctl status cpolar

22e5adfaf290a17fc3384bb296055259

服务正常以后,通过主机 IP + 9200 进入 cpolar Web 管理页面。

当前示例地址是:

http://192.168.42.101:9200

页面链接目标同时写成:

http://localhost:9200/

实际访问时,以当前设备真正可以打开的地址为准。

8a6698b1bf26d64ba3645827fbfb1c29

7. 给 node_exporter 的 9100 创建随机公网地址

进入【隧道管理 → 创建隧道】,当前配置为:

  • 隧道名称:node_exporter
  • 协议:http
  • 本地地址:9100
  • 域名类型:随机域名
  • 地区:China VIP

06b69ce2ee324e2c65f18f1f03833e01

创建成功以后,进入在线隧道列表查看公网地址。

fe8d3b9415b5bb9e2ff7a87203a9d594

使用生成的公网地址访问。

15c40cc2fb0d0b6fc61f68b1f8f6d204

页面能够打开,说明:

node_exporter 9100 → cpolar HTTP 隧道 → 公网地址

这一层已经打通。

8. 让另一侧 Prometheus 改用公网地址抓取

当前随机公网地址记录为:

6d00d2bf.r8.vip.cpolar.cn

把 Prometheus 中的抓取目标改成:

– targets: ["6d00d2bf.r8.vip.cpolar.cn"]
labels:
app: "node_exporter"

ffb79f333b78cdc9538b78fc6f926146

随后当前测试显示抓取成功。

196cba50e66e222af12a10f8316a9ca8

这一步才真正验证了远程链路:

Prometheus → 6d00d2bf.r8.vip.cpolar.cn → cpolar → node_exporter 9100

能够工作。

也正因为前面已经做过 localhost:9100 的本地抓取验证,所以这里如果失败,就更容易把排查重点放到公网地址和网络链路上。

9. 随机域名适合测试,长期抓取更适合固定地址

随机地址适合先确认“跨网络能不能抓到”。

但 Prometheus 的 targets 是写在配置文件里的。如果公网地址不断变化,就需要跟着修改抓取目标。

所以当前流程继续配置固定二级子域名。

进入预留页面。

bb57af88579d81253d911fe4abd7fe01

选择保留二级子域名。

当前记录为:

  • 地区:china Vip
  • 二级子域名:node1

0da9d8336c189e234028da4552c4fd44

然后回到 cpolar Web UI,进入【隧道管理 → 隧道列表】,找到:

node_exporter

并点击编辑。

5f79253dc7e9f6f14b000b8b2f193591

修改为:

  • 域名类型:二级子域名
  • Sub Domain:填写已经保留的二级子域名
  • 地区:China Vip

点击更新。

f689f71c69033bd9a3e083dc5253d7f4

更新完成以后,在线隧道列表中的地址会变成固定二级子域名形式。

cecc3c1c606214a5d8db73aa343c6d9d

最后继续通过固定地址访问。

84656939b0fad66e63c122c707069691

当前文字说明把这里描述成“访问本地部署的 prometheus 页面”,但前面的隧道实际映射的是 node_exporter 的 9100。这里不替现有记录改成另一个服务,只保留这个差异,并按整篇实际链路理解为 node_exporter 公网入口的固定化。

总结

这次最值得保留的不是“没有公网 IP 也能监控服务器”这句结论,而是整个排查顺序。

实际链路是:

CentOS 7 → node_exporter 1.2.0 → systemd → 9100 → Prometheus 本地抓取 → 停端口验证失败 → cpolar → 随机公网 → Prometheus 远程抓取成功 → 固定二级子域名 node1。

如果以后远程抓取失败,我会按这个顺序查:

先看 node_exporter 是否运行 → 再看 9100 是否可访问 → 再看本地 Prometheus 是否能抓取 → 最后检查 cpolar 公网地址。

这样比一上来同时改 Prometheus、node_exporter 和公网配置要清楚得多。

另外也要分清:node_exporter 提供的是主机指标入口,真正的采集和后续监控分析仍由 Prometheus 负责;cpolar 只补跨网络访问这一层,不改变 node_exporter 和 Prometheus 本身的职责。

赞(0)
未经允许不得转载:网硕互联帮助中心 » 没有公网 IP 怎么远程抓取服务器指标?node_exporter + Prometheus + cpolar 实战
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!