文章目录
- 前言
- 理论部分
- 实验部分
- 结语
前言
监控系统是运维人员的"眼睛"和"24小时值班保安",本笔记系统化整理了 Prometheus 监控系统的核心概念、部署流程与实用技巧。通过理论阐述和实验操作,掌握从基础架构到高级服务发现的全链路监控能力。内容涵盖 Prometheus 核心原理、组件协作、实战部署(包括服务器、数据库、Nginx 监控)、服务发现机制及可视化展示。
- Prometheus是什么
- 为什么用Prometheus
- 实验环境
- 部署Prometheus_Server
- 部署Node_Exporter
- 监控MySQL
- 监控Nginx
- 部署Grafana
- 服务发现机制
- Prometheus的局限
理论部分
1_Prometheus_是什么
Prometheus 是一个开源的服务监控系统和时序数据库,提供通用数据模型和快捷数据采集、存储与查询接口。
1.1_核心概念
数据流向原理:
Exporter
cadivor
Pushgateway
告警规则
被监控目标
Prometheus Server
TSDB存储
PromQL查询
Grafana可视化
Alertmanager
告警接收方

1.2_核心特点
| 特点 | 含义 | 比喻 |
|---|---|---|
| Pull模式 | Prometheus主动拉取数据 | 你去快递柜取件 |
| 多维数据模型 | 同指标可打多个标签 | 电商筛选商品 |
| PromQL | 强大的查询语言 | Excel公式 |
| 服务发现 | 自动发现监控目标 | 云端通讯录 |
Pull vs Push 模式对比
| 模式 | 说明 | 特点 | 适用场景 |
|---|---|---|---|
| Pull | Prometheus主动拉取 | 周期性拉取,频率可控。 | 服务器/数据库等长期服务 |
| Push | 通过Pushgateway中转推送 | 随时推送,频率不可控。 | 短期任务/批处理 |
1.3_生态组件
① 组件汇总表
| 组件 | 位置 | 主要作用 | 默认端口 | 访问地址 |
|---|---|---|---|---|
| Prometheus Server | 中心 | 数据拉取/存储/查询/告警触发 | 9090 | http://IP:9090 |
| ├── Retrieval | Server内部 | 通过HTTP拉取指标 | - | - |
| ├── TSDB | Server内部 | 时序数据库存储指标 | - | - |
| ├── PromQL | Server内部 | 查询语言分析数据 | - | - |
| ├── Alerting | Server内部 | 基于规则生成告警 | - | - |
| Alertmanager | Server外部 | 告警去重/分组/路由 | 9093 | http://IP:9093 |
| Grafana | 最上层 | 指标可视化仪表盘 | 3000 | http://IP:3000 |
| Exporter | 被监控目标旁 | 转换指标为Prometheus格式 | 不同类型各异 | http://IP:端口/metrics |
| Pushgateway | 底部 | 接收推送指标的中转站 | 9101 | http://IP:9091 |
| Counsul | 服务发现 | 动态发现监控目标 | 8500 | http://IP:8500 |
| 组件详细介绍: | ||||
| Prometheus Server:核心组件,由三部分构成 |
- Retrieval:在活跃的 target 主机上抓取监控指标数据
- Storage:将采集数据存储到磁盘(默认保留15天)
- PromQL:查询语言模块,用于数据分析和告警判断
Client Library:为应用程序提供原生监控能力的开发库
Exporters:
- Node-Exporter:收集服务器物理指标(指标详情:https://github.com/prometheus/node_exporter)
- mysqld-exporter:监控MySQL数据库
- nginx-exporter:监控Nginx服务
- Kube-State-Metrics:采集Kubernetes资源状态(不存储数据,只提供metrics)
- cAdvisor:监控容器资源使用(CPU/内存/网络I/O/磁盘I/O)
- blackbox-exporter:监控业务容器存活性
- kafka-exporter:监控Kafka指标
Service Discovery:支持多种发现机制(文件/DNS/Consul/Kubernetes)
Alertmanager:负责告警去重/分组/路由,从Prometheus接收告警指示后发送通知
Pushgateway:接收短期任务推送数据的中转站
Grafana:跨平台数据可视化工具,提供丰富仪表盘插件
②_端口汇总表
| 组件 | 端口 | 访问地址 |
|---|---|---|
| Prometheus | 9090 | http://IP:9090 |
| Node Exporter | 9100 | http://IP:9100/metrics |
| MySQL Exporter | 9104 | http://IP:9104/metrics |
| Nginx Exporter | 9913 | http://IP:9913/metrics |
| Grafana | 3000 | http://IP:3000 |
| Consul | 8500 | http://IP:8500 |
| redis_exporterRedis | 9121 | 指标 |
| kafka_exporterKafka | 9308 | 指标 |
| blackbox_exporter | 9115 | 探测(HTTP/TCP/ICMP) |
③_整套流程
Exporter / Pushgateway → Prometheus拉取 → TSDB存储 → PromQL查询 → Grafana展示 → Alertmanager告警通知
Exporter 和 Pushgateway 的区别
| 特性 | Exporter | Pushgateway |
|---|---|---|
| 数据流 | Prometheus → 拉取 → Exporter | 任务 → 推送 → Pushgateway → Prometheus 拉取 |
| 适用场景 | 长期运行的服务(Node、MySQL等) | 短生命周期任务(批处理、CronJob等) |
工作流程详细步骤:
- Prometheus Server 从监控目标通过 pull 方式拉取指标数据,或通过 Pushgateway 间接采集数据
- 采集到的指标数据通过 TSDB 存储到本地 HDD/SSD 中
- Prometheus 采集的监控指标数据按时间序列存储,通过配置报警规则,把触发的告警通知发送到 Alertmanager
- Alertmanager 通过配置报警接收方,发送报警到邮件、钉钉或者企业微信等
- Prometheus 自带的 Web UI 界面提供 PromQL 查询语言,可查询监控数据
- Grafana 可接入 Prometheus 数据源,把监控数据以图形化形式展示出
2_为什么用_Prometheus
2.1_监控数据特点
- 写多读少:不断产生,很少查历史 → 银行流水(写入频繁,查询不多)
- 按时间顺序:每条数据带时间戳 → 体温记录(按时间排序)
- 很少修改:数据写入后不变 → 考勤记录(写完就固定)
- 批量删除:删除整段时间数据 → 手机相册(批量删除旧照片)
2.2_TSDB_vs_普通数据库
TSDB 作为 Prometheus 的存储引擎完美契合监控数据应用场景:
- 存储的数据量级十分庞大
- 大部分时间都是写入操作
- 写入操作几乎是顺序添加,大多数时候数据都以时间排序
- 很少更新数据,大多数情况在数据被采集到数秒或者数分钟后就会被写入数据库
- 删除操作一般为区块删除,选定开始的历史时间并指定后续的区块。很少单独删除某个时间或者分开的随机时间的数据
- 基本数据大,一般超过内存大小。一般选取的只是其一小部分且没有规律,缓存几乎不起任何作用
- 读操作是十分典型的升序或者降序的顺序读
- 高并发的读操作十分常见
对比:
plaintext
普通数据库:
┌──────────────────┐
│ CPU:45% 9:00 │
│ CPU:46% 9:00 │ → 需要索引,随机读写(慢)
│ CPU:47% 9:01 │
└──────────────────┘
TSDB:
┌──────────────────┐
│ 9:00 │
│ CPU:45% │ → 按时间顺序连续读写(快!)
│ CPU:46% │
│ 9:01 │
│ CPU:47% │
└──────────────────┘
2.3_Prometheus核心优势
| 优势 | 说明 |
|---|---|
| 云原生标配 | K8s 官方监控方案 |
| 部署简单 | 单个二进制文件,无依赖 |
| 查询强大 | PromQL 满足各种查询需求 |
| 生态丰富 | Grafana/Alertmanager 无缝集成 |
| 自动发现 | 不用手动配置成百上千台服务器 |
3_服务发现机制
3.1_基于文件
- 基于文件的服务发现是仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,因而也是最为简单和通用的实现方式。
- Prometheus Server 会定期从文件中加载 Target 信息,文件可使用 YAML 和 JSON 格式,它含有定义的 Target 列表,以及可选的标签信息。
3.2_基于consul
- Consul是一款基于golang开发的服务注册和发现的开源工具;
- 主要面向分布式,常用于微服务架构;
- 它提供了一个Web界面,可以方便地查看和管理注册的服务;
- 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。

3.3_基于K8s_API
在 Kubernetes 环境中,Prometheus 可以直接对接 Kubernetes API 来发现需要监控的资源,包括
Pod、Service、Endpoint、Node、Ingress 等。这种方式是最符合云原生架构的。

3.4_服务发现方式对比
| 方式 | 适用场景 | 复杂度 | 优点 | 缺点 | 配置区别 |
|---|---|---|---|---|---|
| 静态配置 | 10台以内服务器 | 低 | 简单 | 不灵活 | static_configs: |
| 文件服务发现 | 几十台服务器 | 低 | 通用 | 需手动维护文件 | file_sd_configs: |
| Consul注册中心 | 微服务架构 | 中 | 功能丰富 | 需要部署 Consul | consul_sd_configs: |
| K8s原生API | K8s 集群 | 中 | 原生支持 | 依赖 K8s 环境 | kubernetes_sd_configs: |
| DNS | 有 DNS 基础设施 | 简单、无额外组件 | 功能有限 |
3.5_为什么需要服务发现
静态配置的痛点 :
❌ 服务器 1000 台?配置写到手断
❌ 每次增减服务器都要改配置
❌ K8s Pod 动态变化,根本没法手动配
服务发现的解决方案 :
✅ 自动感知目标变化
✅ 不用手动维护配置
✅ K8s 环境原生支持
4_Prometheus的局限
Prometheus 不擅长什么?
| 场景 | 合适? | 解决思路 |
|---|---|---|
| 日志监控 | ❌ | 用 ELK/Loki(云原生日志收集) |
| 长期存储 | ❌ | 需导出到外部存储 InfluxDB 或 OpenTSDB |
| 高可用 | ❌ | 需要 Thanos/Cortex |
| 总结: | ||
| ✅ 适合:指标监控、趋势展示、云原生环境 | ||
| ❌ 不适合:日志分析、长期归档、复杂事件 |
5_故障排查思路
告警没收到?
│
├── Prometheus 采集成功吗?
│ └── 查看 Targets 状态
│
├── Alertmanager 收到告警吗?
│ └── 查看 Alertmanager 日志
│
└── 通知渠道配置对吗?
└── 测试邮件/钉钉发送
数据采集中断?
│
├── 被监控目标 Exporter 挂了?
│ └── systemctl status xxx_exporter
│
├── 网络不通?
│ └── telnet IP 端口
│
└── 防火墙阻止?
└── firewall-cmd --list-all
实验部分
1_实验环境
1.1_主机配置表
| 节点 | 主机名 | IP | 角色 | 安装组件 |
|---|---|---|---|---|
| node17 | prometheus-server | 192.168.100.17 | 监控中心 | Prometheus + Grafana |
| node18 | nginx-exporter | 192.168.100.18 | 被监控 | Node Exporter + Nginx Exporter |
| node19 | mysql-exporter | 192.168.100.19 | 被监控 | Node Exporter + MySQL Exporter |
| node20 | node-exporter | 192.168.100.20 | 被监控 | Node Exporter |
1.2_实验环境拓扑图
plaintext
┌────────────────────────────────────────────────────────┐
│ prometheus-server (192.168.100.17) │
│ ┌────────────────────────────────────┐ │
│ │ Prometheus Server (:9090) │ │
│ │ Grafana (:3000) │ │
│ └────────────────────────────────────┘ │
│ │ 拉取数据 │
│ ▼ │
│ ┌──────────────┬──────────────┬──────────────┐ │
│ │nginx-exporter│mysql-exporter│node-exporter │ │
│ │192.168.100.18│192.168.100.19│192.168.100.20│ │
│ ├──────────────┼──────────────┼──────────────┤ │
│ │:9100 Node │:9100 Node │:9100 Node │ │
│ │:9913 Nginx │:9104 MySQL │ │ │
│ └──────────────┴──────────────┴──────────────┘ │
└────────────────────────────────────────────────────────┘
2_部署PrometheusServer
node17
2.1_安装步骤
- 关闭防火墙
shell
systemctl stop firewalld
setenforce 0
setenforce 0:临时禁用SELinux
- 解压安装包
shell
cd /opt/
tar -xf prometheus-2.35.0.linux-amd64.tar.gz
mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus
tar xf:解压压缩包
mv:移动目录到安装位置
- 配置系统服务
shell
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
--storage.tsdb.retention=15d:设置数据保留15天
--web.enable-lifecycle:启用热加载配置
- 启动服务
shell
systemctl daemon-reload
systemctl enable --now prometheus.service
systemctl status prometheus.service
2.2_验证安装
- 检查端口
shell
ss -antlp | grep 9090
grep :9090:过滤9090端口
- 访问Web UI
shell
firefox http://192.168.100.17:9090
Web界面地址:默认端口9090
2.3_配置文件说明
shell
cat /usr/local/prometheus/prometheus.yml
yaml
global:
scrape_interval: 15s # 采集间隔(默认15秒)
evaluation_interval: 15s # 告警计算间隔
scrape_timeout: 10s # 超时时间
alerting:
alertmanagers:
- static_configs:
- targets: []
rule_files:
- "first_rules.yml"
scrape_configs:
- job_name: "prometheus"
metrics_path: '/metrics'
static_configs:
- targets: ["localhost:9090"]
scrape_configs:定义监控目标
job_name:任务名称标识,自动生成job=xxx标签
static_configs:静态配置目标主机
2.4_验证监控目标
浏览器访问 → Status → Targets → 确认prometheus状态为UP ✅
3_部署_Node_Exporter
3.1_安装步骤
node18、19、20
- 解压安装包
shell
cd /opt/
tar -xf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/
- 配置系统服务
shell
cat > /usr/lib/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
--collector.ntp:收集NTP时间同步指标
--collector.mountstats:收集磁盘挂载统计
- 启动服务
shell
systemctl daemon-reload
systemctl enable --now node_exporter.service
systemctl status node_exporter.service
3.2_验证NodeExporter
- 检查端口
shell
ss -antlp | grep 9100
- 查看指标数据
plaintext
firefox http://192.168.100.18:9100/metrics
指标含义:
node_cpu_seconds_total:CPU使用时间
node_memory_MemTotal_bytes:总内存
node_filesystem_size_bytes:文件系统大小
3.3_在Prometheus添加监控
node17
- 编辑Prometheus配置
shell
cd /usr/local/prometheus/
cp prometheus.yml prometheus.yml_bak
vim /usr/local/prometheus/prometheus.yml
yaml
- job_name: nodes
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.100.18:9100
- 192.168.100.19:9100
- 192.168.100.20:9100
labels:
app: node-exporter
metrics_path:默认/metrics,保持与Exporter一致
labels:自定义额外标签
- 重载配置
shell
curl -X POST http://192.168.100.17:9090/-/reload
或
systemctl reload prometheus,但需要systemctl status prometheus.service查看报错。
3.4_验证
浏览器访问 → Status → Targets → 3个nodes状态为UP ✅
4_监控MySQL
4.1_安装mysqld_exporter
- 解压安装包
shell
cd /opt/
tar -xvf mysqld_exporter-0.14.0.linux-amd64.tar.gz
mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/
- 配置MySQL连接
shell
vim /etc/my.cnf
ini
[client]
host=localhost
user=exporter
password=abc123
指向监控用户凭证
- 创建监控用户
mysql
mysql -uroot -pabc123
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';
GRANT:赋予权限,需PROCESS/REPLICATION CLIENT权限
- 配置服务
shell
cat > /usr/lib/systemd/system/mysqld_exporter.service <<'EOF'
[Unit]
Description=mysqld_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
--config.my-cnf:指定MySQL配置文件路径
- 启动服务
shell
systemctl daemon-reload
systemctl enable --now mysqld_exporter.service
systemctl status mysqld_exporter.service
4.2_在Prometheus添加监控
- 编辑配置文件
yaml
- job_name: mysqld
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.100.19:9104
labels:
service: mysqld
- 重载配置
shell
curl -X POST http://192.168.100.17:9090/-/reload
4.3_关键监控指标
| 指标 | 含义 | 告警建议 |
|---|---|---|
| mysql_global_status_threads_connected | 当前连接数 | >80%最大连接时告警 |
| mysql_global_status_slow_queries | 慢查询数 | >5个/分钟告警 |
| mysql_global_status_innodb_buffer_pool_bytes_data | 缓冲池使用量 | >90%时告警 |
5_监控Nginx
5.1_安装NginxVTS模块
- 解压VTS模块
shell
cd /opt
tar xf nginx-module-vts-0.1.18.tar.gz
mv nginx-module-vts-0.1.18 /usr/local/nginx-module-vts
- 编译安装Nginx
shell
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar xf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=/usr/local/nginx-module-vts
make && make install
--add-module:添加VTS模块路径
5.2_配置Nginx
- 配置文件修改
nginx
http {
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on; # 按host统计流量
server {
vhost_traffic_status off; # 禁用不需监控的server,这里不需要禁用。
listen 8080;
allow 127.0.0.1;
allow 192.168.100.17; # Prometheus服务器IP
location /nginx-status {
stub_status on;
access_log off;
}
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format json;
}
}
}
vhost_traffic_status_filter_by_host:按域名区分流量统计
vhost_traffic_status off:禁用不需监控的server,只有不需要监控的虚拟主机需要配。
allow 192.168.100.17:仅允许Prometheus访问
- 启动Nginx
shell
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
nginx -t
cat > /lib/systemd/system/nginx.service <<'EOF'
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now nginx
systemctl status nginx
5.3_安装nginx-vts-exporter
- 安装服务
shell
cd /opt/
tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz
mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/
- 配置服务
shell
cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[Unit]
Description=nginx-exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter --nginx.scrape_uri=http://localhost:8080/status/format/json
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
-nginx.scrape_uri:指定Nginx VTS状态接口地址
localhost:8080:Nginx监听端口,与配置文件一致
- 启动服务
shell
systemctl enable --now nginx-exporter
systemctl status nginx-exporter
- 验证端口
shell
ss -antlp | grep :9913
默认端口9913,可查看指标数据:http://nginx-exporter:9913/metrics
5.4_在_Prometheus_添加监控
- 编辑Prometheus配置
yaml
- job_name: nginx
metrics_path: "/metrics"
static_configs:
- targets:
- 192.168.100.18:9913
labels:
service: nginx
targets:指定nginx-exporter的IP和端口
- 重载配置
shell
curl -X POST http://192.168.100.17:9090/-/reload
5.5_关键监控指标
| 指标 | 含义 |
|---|---|
| nginx_server_requests | 请求数 |
| nginx_server_bytes | 流量统计 |
| nginx_vts_info | VTS模块信息 |
5_部署_Grafana
5.1_安装
- 安装Grafana
shell
yum install -y grafana-7.4.0-1.x86_64.rpm
下载地址:
- 启动服务
shell
systemctl enable --now grafana-server
systemctl status grafana-server
5.2_访问
plaintext
http://192.168.100.17:3000
默认账号:admin
默认密码:admin
5.3_配置数据源
- Configuration → Data Sources → Add data source
- 选择Prometheus
- URL: http://192.168.100.17:9090
- Save & Test ✅
5.4_导入仪表盘
- 访问 https://grafana.com/grafana/dashboards
- 搜索 "Node Exporter Full"
- 记住ID: 12486
- Grafana → + → Import
- 输入12486 → Load → 选择Prometheus → Import
导入后可查看系统CPU、内存、磁盘等可视化指标
6_服务发现机制
node17
6.1_基于文件
- 创建配置文件
shell
cd /usr/local/prometheus
mkdir targets
vim targets/node-exporter.yaml
yaml
- targets:
- 192.168.100.19:9100
- 192.168.100.20:9100
labels:
app: node-exporter
job: node
labels:添加通用标签便于查询
- 修改Prometheus配置
shell
vim /usr/local/prometheus/prometheus.yml
yaml
scrape_configs:
- job_name: file_sd
file_sd_configs:
- files:
- targets/node*.yaml
refresh_interval: 2m
refresh_interval:2分钟自动重新加载配置
- 重载配置
shell
systemctl reload prometheus
6.2_基于Consul
- 部署Consul
shell
cd /opt/
unzip consul_1.9.2_linux_amd64.zip
mv consul /usr/local/bin/
mkdir /var/lib/consul-data /etc/consul/
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-config-dir=/etc/consul/ \
-bind=192.168.100.17 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
-server:表示以服务器模式运行
-bootstrap:表示这是第一个节点
-ui:启用Web界面,访问http://prometheus-server:8500
-data-dir:指定数据目录
-bind=:绑定地址
-client=:允许所有客户端地址访问
-node=:节点,用于三主三从,这里只演示一个。
- 在Consul注册服务
shell
vim /etc/consul/nodes.json
json
{
"services": [
{
"id": "nginx_exporter-node18",
"name": "nginx-node18",
"address": "192.168.100.18",
"port": 9913,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.100.18:9913/metrics",
"interval": "5s"
}]
}
{
"id": "mysql_exporter-node19",
"name": "mysql-node19",
"address": "192.168.100.19",
"port": 9104,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.100.19:9104/metrics",
"interval": "5s"
}]
}
{
"id": "node_exporter-node20",
"name": "node20",
"address": "192.168.100.20",
"port": 9100,
"tags": ["nodes"],
"checks": [{
"http": "http://192.168.100.20:9100/metrics",
"interval": "5s"
}]
}
]
}
checks:Health检查配置,5秒检查一次
- 重载Consul配置
shell
consul reload
- Prometheus配置
yaml
- job_name: consul
consul_sd_configs:
- server: 192.168.100.17:8500
tags:
- nodes
refresh_interval: 2m
tags:过滤只监控带"nodes"标签的服务
- 访问 Consul Web 界面
shell
firefox http://192.168.100.17:8500
可以看到已注册的服务列表
- 服务注销和重新注册
shell
# 注销服务
consul services deregister -id="node_exporter-node02"
# 重新注册
consul services register /etc/consul/nodes.json
6.3_基于K8s_API
- 典型配置示例
yaml
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
role:可选值包括pod、service、node、endpoints、ingress。Prometheus 会持续监听 API Server,当有新的资源创建或旧资源删除时,会自动更新监控目标。需配置RBAC权限
结语
Prometheus 通过 Pull 模式构建了轻量级但功能强大的监控体系,结合多维数据模型、PromQL 和服务发现机制,成为云原生监控的事实标准。成功部署需注意:Exporter 与 Prometheus 的正确集成、服务发现机制的选择及配置文件的热加载应用。
Prometheus 官网 :https://prometheus.io
Prometheus GitHub:https://github.com/prometheus
Prometheus 工作流程 :Exporter / Pushgateway → Prometheus拉取 → TSDB存储 → PromQL查询 → Grafana展示 → Alertmanager告警通知
服务发现方式对比 :静态配置(目标固定)、文件发现(变化不频繁)、Consul(微服务架构)、K8s API(云原生环境)
告警机制:Prometheus仅生成告警指示,由Alertmanager完成去重/分组/路由
!question\] Prometheus 为什么使用 Pull 模式? Pull 模式更简单可靠,便于控制数据采集频率,便于防火墙策略管理,且能检测目标是否存活;额外数据推送通过 Pushgateway 支持短期任务需求。 \[!question\] TSDB 与普通数据库相比有什么优势? TSDB 专门针对监控数据设计:写多读少、按时间排序、很少修改、批量删除。按时间连续存储使数据读取更高效,相比普通数据库的随机读写性能大幅提升。 \[!question\] 服务发现解决了什么痛点? 当服务器规模达到上百台时,手动维护监控目标不可能。服务发现实现:自动感知目标变化、无需手动维护配置、支持动态环境(如K8s Pod快速变化)。 \[!question\] Prometheus 适合监控什么场景? 指标监控、趋势展示、云原生环境;不适合日志分析、长期归档或处理复杂事件(需结合专有工具如ELK/Loki)。 \[!question\] 告警通知为何需要 Alertmanager? Alertmanager 专门处理告警:接收告警、去重、分组、路由到正确接收人,还支持静默时段、抑制规则等高级功能,使告警更加精准有效。