3. 单集群Prometheus部署与配置:二进制与容器化部署、配置文件详解
3.1 部署方式对比:二进制 vs 容器化
在生产环境中,Prometheus 的部署方式直接影响运维效率与故障排查路径。二进制部署适合对系统资源有精细控制需求的场景,而容器化部署则更适合与 Kubernetes 生态深度整合的集群。下表从关键维度对比两种方式:
| 对比维度 | 二进制部署 | 容器化部署(Docker/K8s) |
|---|---|---|
| 启动速度 | 直接执行二进制文件,毫秒级启动 | 需拉取镜像、创建容器,秒级启动 |
| 配置管理 | 本地文件系统挂载,热加载需手动触发 | ConfigMap/Volume 挂载,支持声明式更新 |
| 资源隔离 | 依赖 OS 进程管理,无内置资源限制 | cgroup 隔离,可精确限制 CPU/内存 |
| 版本升级 | 替换二进制文件,需停机或 systemd 重启 | 滚动更新,零停机升级 |
| 适用场景 | 物理机、VM、边缘节点 | Kubernetes 集群、微服务架构 |
3.2 二进制部署步骤
二进制部署是理解 Prometheus 内部机制的最佳起点。以下为标准的安装与配置流程:
- 下载与解压:从 Prometheus 官方 GitHub Releases 页面获取对应平台的压缩包。
- 创建目录结构:建立
/etc/prometheus(配置文件)、/var/lib/prometheus(数据目录)、/etc/prometheus/rules(告警规则)。 - 编写配置文件:将
prometheus.yml放置于/etc/prometheus/目录。 - 启动服务:使用
systemd或直接执行./prometheus --config.file=/etc/prometheus/prometheus.yml。 - 验证状态:访问
http://<IP>:9090确认 Target 状态与指标查询。
# systemd 服务单元示例
[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/introduction/overview/
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
Restart=always
[Install]
WantedBy=multi-user.target
3.3 容器化部署步骤
容器化部署推荐使用 Docker Compose 或 Kubernetes Deployment。以下为 Docker 单实例部署的核心命令:
# 使用 Docker 运行 Prometheus
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus_data:/prometheus \
prom/prometheus:v2.53.0 \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
prometheus_data)持久化 TSDB 数据,避免容器重启导致历史数据丢失。同时,配置文件的热加载需向容器发送 SIGHUP 信号或使用 POST /-/reload 接口。
3.4 配置文件详解
Prometheus 的配置文件采用 YAML 格式,核心结构包含三大顶级配置块:global、scrape_configs、rule_files。以下为完整配置示例:
# prometheus.yml 核心配置
global:
scrape_interval: 15s # 全局抓取间隔
evaluation_interval: 15s # 规则评估间隔
scrape_timeout: 10s # 全局抓取超时
external_labels:
cluster: 'prod-us-east' # 跨集群标识标签
rule_files:
- "/etc/prometheus/rules/*.yml" # 告警与记录规则文件
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
file_sd_configs:
- files: ['/etc/prometheus/targets/*.json']
refresh_interval: 5m
3.4.1 global 配置块
global 块定义所有抓取任务的默认行为,可被单个 job 的配置覆盖:
| 参数 | 默认值 | 说明 |
|---|---|---|
scrape_interval |
1m | 抓取目标的时间间隔,生产环境常用 15s~30s |
scrape_timeout |
10s | 单次抓取超时时间,必须小于 scrape_interval |
evaluation_interval |
1m | 告警规则与记录规则的评估周期 |
external_labels |
空 | 附加到所有时间序列的标签,用于跨集群标识 |
3.4.2 scrape_configs 配置块
scrape_configs 是配置的核心,定义 Prometheus 从哪些目标抓取指标。每个 job 可独立配置抓取参数与服务发现方式:
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__meta_kubernetes_node_label_kubernetes_io_hostname]
target_label: instance
scrape_interval: 30s
scrape_timeout: 15s
3.4.3 rule_files 配置块
rule_files 指定告警规则与记录规则的文件路径,支持 glob 模式匹配。规则文件独立管理,便于版本控制与 CI/CD 集成:
# /etc/prometheus/rules/node_alerts.yml
groups:
- name: node_alerts
interval: 30s
rules:
- alert: NodeHighCPUUsage
expr: (100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Node {{ $labels.instance }} CPU usage > 80%"
3.5 静态服务发现 vs 动态服务发现
服务发现决定了 Prometheus 如何获取目标列表。静态发现适用于基础设施固定的场景,动态发现则适用于云原生环境。以下为两种方式的对比:
| 特性 | 静态服务发现 | 动态服务发现 |
|---|---|---|
| 配置方式 | static_configs 直接写入 targets |
file_sd_configs、kubernetes_sd_configs 等 |
| 变更响应 | 需手动修改配置文件并 reload | 自动感知目标变化,无需人工干预 |
| 适用规模 | 小规模(<50 个目标) | 大规模、动态变化的集群 |
| 故障排查 | 目标列表固定,易于定位 | 需检查服务发现 API 返回与 relabel 结果 |
3.5.1 静态服务发现配置
scrape_configs:
- job_name: 'static_web'
static_configs:
- targets:
- 'web1.example.com:8080'
- 'web2.example.com:8080'
labels:
group: 'frontend'
- targets:
- 'db1.example.com:9104'
labels:
group: 'database'
3.5.2 动态服务发现:基于文件
文件服务发现(file_sd_configs)是静态与动态之间的折中方案,适合与配置管理工具(如 Ansible、Consul Template)集成:
scrape_configs:
- job_name: 'file_sd_nodes'
file_sd_configs:
- files:
- '/etc/prometheus/targets/nodes/*.json'
- '/etc/prometheus/targets/services/*.yml'
refresh_interval: 5m
# /etc/prometheus/targets/nodes/production.json
[
{
"targets": ["10.0.1.10:9100", "10.0.1.11:9100"],
"labels": {
"env": "production",
"region": "us-east-1"
}
}
]
3.5.3 动态服务发现:基于 Kubernetes
Kubernetes 服务发现是跨集群调度场景的核心能力,支持按 node、pod、service、endpoints 等角色自动发现目标:
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# 只抓取带有 prometheus.io/scrape: "true" 注解的 Pod
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# 重写指标端口
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
/service-discovery 页面,查看每个 job 的发现结果与 relabel 后的最终标签。常见问题包括:标签匹配正则错误、命名空间权限不足、注解拼写错误。
3.6 配置热加载与验证
生产环境中,配置变更需要在不中断服务的前提下生效。Prometheus 提供两种热加载方式:
- HTTP API:发送
POST /-/reload请求(需启用--web.enable-lifecycle参数)。 - 信号触发:向 Prometheus 进程发送
SIGHUP信号。
配置变更前务必使用 promtool 验证语法正确性:
# 验证配置文件
promtool check config /etc/prometheus/prometheus.yml
# 验证规则文件
promtool check rules /etc/prometheus/rules/*.yml
promtool check config 步骤,避免错误配置推送到生产环境。