Prometheus 是什么?为什么要用它?
在深入 Prometheus 之前,我们需要先理解运维中的两个核心概念:监控与告警。
监控是什么?
在运维领域,监控是指通过某种手段持续观察服务器、应用或系统的运行状态,将其行为(如 CPU 使用率、请求延迟、错误率等)以数据形式采集并可视化,从而帮助我们发现性能瓶颈、异常行为或潜在风险。
告警是什么?
告警是监控的延伸。当监控系统检测到指标超出预设阈值(如磁盘使用率 > 90%、服务不可用等),会通过邮件、短信、企业微信、钉钉、Webhook 等方式主动通知相关人员,以便及时响应和处理。
简单来讲,Prometheus就是图中的监控系统。它的优点如下:
- 本⾝是开源的,更新速度快,bug修复快,插件(exporter、pushgateway)丰富
- 精确到秒级的时间细粒度采集精度,极快的部署速度
- 本⾝基于数学计算模型开发,自带⼤量的实⽤函数,可以实现很复杂规则的业务监控逻辑(例如QPS的曲率、定积分值、函数极限等概念)
- 图形界面很美观(主要是指跟Grafana的结合)
Prometheus的整体框架图
从架构图可以看出,Prometheus 的工作流程可分为以下五个关键步骤:
- 安装与配置
- 服务发现(Service Discovery)
- 指标采集(Metrics Collection via Pull/Push)
- 数据展示(Visualization)
- 告警(Alerting)
下面我们逐一展开。
Prometheus作为监控系统,其原本是作为一个服务直接部署在服务器上的,但是随着集群技术的发展,它已经能作为集群中的一个服务监控整个集群。因此 Prometheus 的安装也分为安装到服务器上。和集群中,下面的部署是原生的安装到服务器上。
0. 安装
这部分的安装是安装到服务器的,集群化部署参考 Kubernetes Prometheus 监控部署方案。 Prometheus 的安装无需依赖数据库或复杂中间件。
- 访问Prometheus官方下载页
- 根据操作系统选择对应版本(Linux / Windows / macOS)
- 下载后解压到任意目录,即完成安装
- 主要配置文件为
prometheus.yml,位于根目录下
示例配置如下:
# my global config
global:
scrape_interval: 15s # 默认抓取间隔为1分钟,这里设为15秒
evaluation_interval: 15s # 规则评估间隔
# 告警管理器配置(需单独部署 Alertmanager)
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 加载告警规则文件
rule_files:
# - "rules/alerts.yml"
# 抓取任务配置
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
labels:
app: "prometheus"
启动命令(Linux/macOS):
./prometheus --config.file=prometheus.yml
Windows:
.\prometheus.exe --config.file=prometheus.yml
启动后访问 http://localhost:9090 即可进入 Web UI。
1.服务发现
在静态环境中,我们可以用 static_configs 手动指定监控目标(如 192.168.1.10:9100)。 但在 Kubernetes、Docker Swarm 等大规模服务器集群中,目标 IP 和端口是动态变化的(Pod 重建、扩缩容、滚动更新等)。
如果每次变动都手动修改配置,显然不现实。
为此,Prometheus 提供了多种服务发现机制,能自动从基础设施中获取最新目标列表:
| 服务发现类型 | 适用场景 |
|---|---|
kubernetes_sd_configs | Kubernetes 集群(自动发现 Node、Pod、Service、Endpoints) |
consul_sd_configs | Consul 服务注册中心 |
dns_sd_configs | 基于 DNS SRV 记录 |
file_sd_configs | 通过外部脚本生成 JSON/YAML 文件(适用于自定义 CMDB) |
重点:kubernetes_sd_configs 在 Kubernetes 中,最常用的是 kubernetes_sd_configs。它通过连接 Kubernetes API Server,自动发现以下资源:
- role: node → 发现所有节点(用于监控主机资源)
- role: pod → 发现所有 Pod(用于监控应用指标)
- role: endpoints → 发现 Service 的后端 Endpoints(推荐方式)
- role: service / ingress → 辅助发现
关键时间点: 服务发现同步:默认每 30 秒查询一次 Kubernetes API,获取最新目标列表 指标抓取:根据 scrape_interval 配置(默认 15 秒)拉取指标 目标下线:连续多次抓取失败后,目标标记为 DOWN
例如,要自动发现所有节点并监控其系统指标,可配置如下:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
action: replace
target_label: __address__
replacement: '$1:9100' # node_exporter 默认端口
- source_labels: [__meta_kubernetes_node_name]
target_label: instance
✅ 这段配置将自动把每个 Node 的 IP 拼接成 IP:9100,作为抓取目标。
2.通过pull方法获得metrics
Prometheus 默认采用 Pull 模型:通过关键组件 Exporter 主动从目标拉取指标。
由于大多数系统(如 MySQL、Redis、Node)本身不暴露 Prometheus 格式的指标,我们需要 Exporter 作为“翻译器”。
node_exporter 是一个官方提供的 Exporter,用于采集 Linux 主机的系统级指标(CPU、内存、磁盘、网络等)。
部署方式(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
containers:
- name: node-exporter
image: prom/node-exporter:v1.10.2
ports:
- containerPort: 9100
hostPort: 9100
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/docker/.+)($|/)
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
说明: hostNetwork: true + hostPort 使 node_exporter 绑定到 Node 的 9100 端口; 挂载 /proc 和 /sys 获取主机信息; 每个 Node 上运行一个实例。
Prometheus 抓取配置(配合 kubernetes_sd_configs):
- job_name: 'node-exporter'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):.*'
replacement: '${1}:9100'
target_label: __address__
- source_labels: [__meta_kubernetes_node_name]
target_label: instance
这样,Prometheus 就能自动发现所有节点,并从 http://:9100/metrics 拉取指标。
3.展示数据
Prometheus 自带 Web UI 可查询指标,但可视化能力有限。
Grafana 是业界标准的时序数据可视化工具,与 Prometheus 无缝集成。
集成步骤: 部署 Grafana
添加 Prometheus 为数据源 URL: http://prometheus:9090
导入仪表盘。官方提供大量模板,如: Node Exporter Full(ID: 1860)→ 监控主机资源 Kubernetes Cluster Monitoring(ID: 315)→ 监控集群状态
4.告警
企业级的告警已经转移到 Grafana 中,暂不探讨