3. 单集群Prometheus部署与配置:二进制与容器化部署、配置文件详解

3.1 部署方式对比:二进制 vs 容器化

在生产环境中,Prometheus 的部署方式直接影响运维效率与故障排查路径。二进制部署适合对系统资源有精细控制需求的场景,而容器化部署则更适合与 Kubernetes 生态深度整合的集群。下表从关键维度对比两种方式:

对比维度 二进制部署 容器化部署(Docker/K8s)
启动速度 直接执行二进制文件,毫秒级启动 需拉取镜像、创建容器,秒级启动
配置管理 本地文件系统挂载,热加载需手动触发 ConfigMap/Volume 挂载,支持声明式更新
资源隔离 依赖 OS 进程管理,无内置资源限制 cgroup 隔离,可精确限制 CPU/内存
版本升级 替换二进制文件,需停机或 systemd 重启 滚动更新,零停机升级
适用场景 物理机、VM、边缘节点 Kubernetes 集群、微服务架构
工程建议:在跨集群调度场景中,建议中心集群使用容器化部署以利用 K8s 的自动恢复能力,边缘集群使用二进制部署以减少依赖。两种方式均支持相同的配置文件结构,迁移成本较低。

3.2 二进制部署步骤

二进制部署是理解 Prometheus 内部机制的最佳起点。以下为标准的安装与配置流程:

  1. 下载与解压:从 Prometheus 官方 GitHub Releases 页面获取对应平台的压缩包。
  2. 创建目录结构:建立 /etc/prometheus(配置文件)、/var/lib/prometheus(数据目录)、/etc/prometheus/rules(告警规则)。
  3. 编写配置文件:将 prometheus.yml 放置于 /etc/prometheus/ 目录。
  4. 启动服务:使用 systemd 或直接执行 ./prometheus --config.file=/etc/prometheus/prometheus.yml。
  5. 验证状态:访问 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__
故障排查要点:当动态服务发现未按预期抓取目标时,优先检查 Prometheus 的 /service-discovery 页面,查看每个 job 的发现结果与 relabel 后的最终标签。常见问题包括:标签匹配正则错误、命名空间权限不足、注解拼写错误。
Prometheus 配置文件结构与服务发现流程 prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s rule_files: - /rules/*.yml scrape_configs: 服务发现方式 1. static_configs 2. file_sd_configs 3. kubernetes_sd_configs 4. consul_sd_configs 5. dns_sd_configs 目标列表 + 标签 target: 10.0.1.10:9100 labels: env=prod target: web1:8080 labels: group=frontend target: pod-xyz:9090 labels: app=nginx 流程说明: 1. Prometheus 加载 prometheus.yml → 2. 根据 scrape_configs 选择服务发现方式 → 3. 动态/静态获取目标列表与标签 → 4. 执行指标抓取 relabel_configs 在服务发现后的作用 • keep/drop:根据标签值过滤目标 • replace:修改或新增标签(如将 __meta_* 标签映射为业务标签) • labelmap:将匹配的标签名映射为新标签 • 典型场景:将 Pod 注解 prometheus.io/scrape 转换为抓取决策

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
常见陷阱:YAML 缩进错误是配置加载失败的首要原因。Prometheus 要求严格的两空格缩进,禁止使用 Tab。建议在 CI 流水线中加入 promtool check config 步骤,避免错误配置推送到生产环境。
配置热加载与故障排查流程 修改 prometheus.yml 或规则文件 promtool check 语法与语义验证 通过 通过 热加载配置 POST /-/reload 验证 Targets 验证失败 检查错误输出 失败 故障排查步骤 1. 检查 Prometheus 日志 2. 查看 /targets 页面状态 3. 确认服务发现 API 返回 4. 验证 relabel 后标签 5. 检查网络连通性 6. 确认指标端点可访问 7. 使用 promtool debug

3.7 本章小结