介绍
本次实验将你的监控范围扩展到外部服务。你将设置 Node Exporter,这是一个用于硬件和操作系统指标的 Prometheus exporter。本次设置将沿用上一个实验中运行的 Prometheus 容器。你将运行一个 Node Exporter 容器,并将其添加为 prometheus.yml 中的一个新目标。完成本次实验后,你将能够在 Prometheus UI 中查询主机级别的系统指标。
本次实验将你的监控范围扩展到外部服务。你将设置 Node Exporter,这是一个用于硬件和操作系统指标的 Prometheus exporter。本次设置将沿用上一个实验中运行的 Prometheus 容器。你将运行一个 Node Exporter 容器,并将其添加为 prometheus.yml 中的一个新目标。完成本次实验后,你将能够在 Prometheus UI 中查询主机级别的系统指标。
在此步骤中,你将下载 Node Exporter 的官方 Docker 镜像。Node Exporter 是一个 Prometheus exporter,它暴露了来自宿主机的各种硬件和内核相关的指标。
要开始,请从 Docker Hub 拉取 prom/node-exporter 镜像。打开终端并运行以下命令:
docker pull prom/node-exporter
此命令会联系 Docker Hub 注册中心,并将 Node Exporter 镜像的最新版本下载到你的本地机器。你将看到显示镜像每个层下载进度的输出。
预期输出:
Using default tag: latest
latest: Pulling from prom/node-exporter
Digest: sha256:a5579e72377a6053359058893b80f4f47c55d761457d685343b8e797859a159b
Status: Image is up to date for prom/node-exporter
docker.io/prom/node-exporter
现在你已经有了镜像,让我们将 Node Exporter 作为一个容器运行。我们将把它的指标暴露在端口 9100 上,这是 Node Exporter 的默认端口。
执行以下命令来启动容器,并将其放置在与 Prometheus 相同的 Docker 网络中:
docker run -d -p 9100:9100 --name node-exporter --network monitoring prom/node-exporter
让我们分解一下这个命令:
-d: 以分离模式(detached mode)运行容器,意味着它在后台运行。-p 9100:9100: 将主机的端口 9100 映射到容器的端口 9100。--name node-exporter: 为容器分配一个易于记忆的名称,方便引用。prom/node-exporter: 用于创建容器的镜像。你可以使用 docker ps 命令来验证容器是否正在运行:
docker ps
你应该在运行的容器列表中看到 node-exporter。你也可以选择性地确认网络连接:
docker inspect node-exporter --format '{{.HostConfig.NetworkMode}}'
输出应该是 monitoring。
预期输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
... prom/node-exporter "/bin/node_exporter" A few seconds ago Up a few seconds 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp node-exporter
... prom/prometheus "/bin/prometheus --c…" About a minute ago Up about a minute 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
在此步骤中,你将配置 Prometheus 以从新运行的 Node Exporter 容器抓取指标。这通过编辑 prometheus.yml 配置文件来添加一个新的抓取作业(scrape job)来完成。
首先,使用 nano 编辑器打开位于你的项目目录中的 prometheus.yml 文件:
nano ~/project/prometheus.yml
现在,在 scrape_configs 部分下为 Node Exporter 添加一个新的作业配置。你的最终文件应该看起来像这样。请确保缩进正确,因为 YAML 对此很敏感。
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["prometheus:9090"]
- job_name: "node_exporter"
static_configs:
- targets: ["node-exporter:9100"]
新的配置块的作用如下:
job_name: 'node_exporter': 为此抓取作业命名,该名称将用于标记收集到的指标。targets: ['node-exporter:9100']: 告诉 Prometheus 在哪里找到 Node Exporter。我们使用容器名称,因为 Docker 在同一网络中的容器之间提供了内部 DNS 解析。localhost 主机名仅限于每个容器内部,因此不能用于访问其他容器。编辑完成后,按 Ctrl+X,然后按 Y,最后按 Enter 来保存文件并退出 nano。
为了让 Prometheus 加载新配置,你需要重启它的容器。我们之前配置的卷挂载(volume mount)确保了容器在重启后能够读取更新的 prometheus.yml 文件。
运行以下命令来重启 Prometheus 容器:
docker restart prometheus
此命令会优雅地停止然后启动名为 prometheus 的容器。几秒钟后,Prometheus 将会以新配置运行。
现在,让我们在 Prometheus UI 中验证这个更改。
+ (New Tab) 按钮,选择 Web Service,然后为端口输入 9090。
你现在应该看到两个目标被列出:prometheus 和 node_exporter。两者都应该处于 "UP" 状态,这表明 Prometheus 正在成功地从自身和 Node Exporter 抓取指标。
最后一步是通过运行查询来确认 Prometheus 是否成功地从 Node Exporter 摄取了指标。
通过点击导航栏中的 "Graph" 链接,导航回 Prometheus UI 中的主 "Graph" 页面。在 "Expression" 输入字段中,输入以下指标名称:
node_cpu_seconds_total
此指标代表 CPU 在各种模式(例如,空闲、用户、系统)下花费的总时间(以秒为单位)。

点击 "Execute" 按钮。如果连接成功,你将在图表下方看到一个结果表。每个结果对应一个不同的 CPU 核心和模式。看到这些结果,就确认了你的整个监控管道都正常工作,从 Node Exporter 的数据收集到 Prometheus 的摄取和存储。
你可以在 "Table" 和 "Graph" 视图之间切换以可视化数据。
恭喜你!你已成功地通过添加一个外部服务来扩展你的监控设置。在这个实验中,你学会了如何在 Docker 容器中运行官方的 Prometheus Node Exporter,配置 Prometheus 实例以抓取来自这个新目标的指标,并通过查询主机级别的指标来验证数据收集。这是构建全面可观测性堆栈(observability stack)的一项基本技能,它能让你深入了解系统的性能和健康状况。