2. Prometheus 安装部署:二进制安装、Docker部署、Operator部署、配置文件详解

Prometheus 的部署方式灵活多样,从单机测试到生产级 Kubernetes 集群,均有对应的最佳实践。本章将深入剖析三种主流部署方式:二进制安装(适用于物理机/虚拟机)、Docker 部署(适用于容器化环境)以及 Operator 部署(适用于 Kubernetes 云原生场景),并详细解读核心配置文件 prometheus.yml 的结构与调优参数。

2.1 部署方式对比与选型

在选择部署方式时,需综合考虑运维复杂度、扩展性、与基础设施的集成度等因素。下表列出了三种方式的适用场景与核心差异:

部署方式 适用场景 运维复杂度 扩展性 推荐指数
二进制安装 物理机、虚拟机、传统 IDC 中 手动扩展 ⭐⭐⭐
Docker 部署 容器化环境、CI/CD 测试 低 容器编排扩展 ⭐⭐⭐⭐
Operator 部署 Kubernetes 生产集群 高(自动化后低) 自动水平扩展 ⭐⭐⭐⭐⭐
选型建议: 生产环境若已运行 Kubernetes,优先选择 Operator 部署;若为传统架构,推荐二进制安装以获得最佳性能控制;Docker 部署适合快速验证或边缘节点。

2.2 二进制安装(Linux 环境)

二进制安装是性能最优、依赖最少的部署方式,适合对系统资源有严格要求的场景。以下是标准安装步骤:

  1. 下载并解压:从 Prometheus 官方 GitHub Releases 页面获取最新稳定版。
  2. 配置用户与目录:创建专用的 prometheus 用户及数据、配置目录。
  3. 放置配置文件:将 prometheus.yml 放入 /etc/prometheus/。
  4. 配置 Systemd 服务:实现开机自启与进程守护。
  5. 启动并验证:通过 systemctl 管理服务,访问 http://<IP>:9090。
# 1. 下载并解压
wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
tar -xzf prometheus-2.53.0.linux-amd64.tar.gz -C /opt/
ln -s /opt/prometheus-2.53.0.linux-amd64 /opt/prometheus

# 2. 创建用户与目录
useradd --no-create-home --shell /bin/false prometheus
mkdir -p /etc/prometheus /var/lib/prometheus
chown prometheus:prometheus /etc/prometheus /var/lib/prometheus

# 3. 复制二进制与配置文件
cp /opt/prometheus/prometheus /usr/local/bin/
cp /opt/prometheus/promtool /usr/local/bin/
cp -r /opt/prometheus/consoles /etc/prometheus/
cp -r /opt/prometheus/console_libraries /etc/prometheus/
cp /opt/prometheus/prometheus.yml /etc/prometheus/
chown -R prometheus:prometheus /etc/prometheus /usr/local/bin/prometheus /usr/local/bin/promtool

# 4. 创建 Systemd 服务单元
cat <<EOF > /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring System
Documentation=https://prometheus.io/docs/
After=network.target

[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 \
  --web.listen-address=0.0.0.0:9090 \
  --web.external-url=

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# 5. 启动服务
systemctl daemon-reload
systemctl enable prometheus
systemctl start prometheus
systemctl status prometheus
注意: 生产环境中务必使用 --storage.tsdb.retention.time 和 --storage.tsdb.retention.size 参数控制数据保留策略,避免磁盘写满。

2.3 Docker 部署

Docker 部署将 Prometheus 及其依赖打包在容器中,实现环境一致性。适用于快速部署、测试或与 Docker Compose 结合使用。

# 拉取官方镜像
docker pull prom/prometheus:v2.53.0

# 创建本地配置与数据目录
mkdir -p /data/prometheus/config /data/prometheus/data
cp prometheus.yml /data/prometheus/config/

# 启动容器
docker run -d \
  --name prometheus \
  --restart=always \
  -p 9090:9090 \
  -v /data/prometheus/config:/etc/prometheus \
  -v /data/prometheus/data:/prometheus \
  prom/prometheus:v2.53.0 \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/prometheus \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.console.templates=/etc/prometheus/consoles
Docker 部署要点: 使用 -v 挂载卷持久化数据与配置;通过 --restart=always 保证容器异常退出后自动恢复;建议使用 Docker Compose 管理多服务(如 Prometheus + Grafana + Alertmanager)。

2.4 Operator 部署(Kubernetes)

Prometheus Operator 是 Kubernetes 原生的部署与管理方案,通过 CRD(Custom Resource Definition)将 Prometheus 的配置、告警规则、服务发现等抽象为 Kubernetes 资源对象,极大简化了运维工作。

下图展示了 Operator 部署的核心架构与组件关系:

Prometheus Operator 部署架构图 Prometheus Operator 部署架构 Kubernetes Cluster Prometheus Operator 管理 CRD 资源 ServiceMonitor 定义抓取目标 Prometheus StatefulSet 自动生成配置 Alertmanager 告警路由与发送 应用 Pod 暴露 /metrics 核心工作流程: 1. 用户创建 ServiceMonitor CRD,定义抓取目标(应用 Pod 标签选择器)。 2. Operator 监听 CRD 变化,自动生成 Prometheus 配置文件并触发热加载。 3. Prometheus 根据配置抓取应用 Pod 的 /metrics 端点。 4. 告警规则触发后,Prometheus 推送告警至 Alertmanager 进行路由与通知。

使用 Helm 安装 Prometheus Operator 是最快捷的方式:

# 添加 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 安装 kube-prometheus-stack(包含 Operator、Prometheus、Alertmanager、Grafana)
helm install monitoring prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --set grafana.enabled=true \
  --set prometheus.prometheusSpec.retention=15d

# 验证部署
kubectl get pods -n monitoring
kubectl get servicemonitors -n monitoring
kubectl get prometheuses -n monitoring
Operator 核心优势:
  • 声明式配置:通过 ServiceMonitor、PodMonitor 等 CRD 定义抓取目标,无需手动修改 prometheus.yml。
  • 自动发现:基于 Kubernetes 标签自动发现新服务,实现零配置扩缩容。
  • 高可用:支持 Prometheus 实例的 StatefulSet 部署,结合 Thanos 可实现长期存储与全局视图。
  • 安全集成:自动注入 ServiceAccount、RBAC 权限,支持 TLS 与 Basic Auth。

2.5 配置文件详解

prometheus.yml 是 Prometheus 的核心配置文件,控制数据抓取、告警规则加载、服务发现等行为。以下是一个生产级配置示例及关键字段解析:

# 全局配置
global:
  scrape_interval: 15s      # 默认抓取间隔
  evaluation_interval: 15s  # 告警规则评估间隔
  scrape_timeout: 10s       # 抓取超时时间

# 告警管理
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - localhost:9093   # Alertmanager 地址

# 告警规则文件
rule_files:
  - "rules/*.yml"           # 加载 rules 目录下所有告警规则

# 抓取配置
scrape_configs:
  # 1. Prometheus 自身监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # 2. 基于文件的服务发现(适用于传统架构)
  - job_name: 'node_exporter'
    file_sd_configs:
      - files:
        - 'targets/node_exporter/*.json'
        refresh_interval: 5m

  # 3. 基于 Kubernetes 的服务发现(适用于容器环境)
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__

下表对核心配置段进行详细说明:

配置段 关键参数 说明 调优建议
global scrape_interval, evaluation_interval, scrape_timeout 全局默认抓取与评估间隔 生产环境建议 15s-30s;若指标量极大可放宽至 60s
alerting alertmanagers.targets 指定 Alertmanager 实例地址 高可用场景配置多个 Alertmanager 地址
rule_files 规则文件路径 支持 glob 模式加载多个规则文件 按业务模块拆分规则文件,便于管理
scrape_configs job_name, static_configs, file_sd_configs, kubernetes_sd_configs, relabel_configs 定义抓取任务与目标发现方式 优先使用服务发现(file_sd 或 kubernetes_sd),避免硬编码
relabel_configs source_labels, action, regex, target_label 在抓取前对标签进行重写、过滤、替换 用于动态设置 metrics_path、address 等,减少重复配置
配置文件热加载: 修改 prometheus.yml 后,无需重启进程。向 Prometheus 进程发送 SIGHUP 信号或访问 POST /-/reload 端点(需启用 --web.enable-lifecycle)即可动态加载配置。

2.6 启动参数与性能调优

Prometheus 提供了丰富的命令行启动参数,用于控制存储、查询、网络等行为。以下是生产环境中常用的调优参数:

参数 默认值 说明 调优场景
--storage.tsdb.retention.time 15d 数据保留时长 根据磁盘容量与合规要求调整,如 30d 或 90d
--storage.tsdb.retention.size 0(无限制) 数据保留大小(如 50GB) 与 retention.time 配合使用,避免磁盘写满
--storage.tsdb.wal-compression false 启用 WAL 压缩 高写入量场景建议开启,减少磁盘 I/O
--query.max-concurrency 20 最大并发查询数 高并发查询场景适当提高,如 50
--query.timeout 2m 查询超时时间 复杂聚合查询可适当延长,如 5m
--web.enable-lifecycle false 启用 HTTP 热加载与关闭 生产环境建议开启,便于动态管理

下图展示了 Prometheus 启动时各模块的初始化流程与参数加载顺序:

Prometheus 启动流程与参数加载 Prometheus 启动流程与参数加载 命令行参数解析 --config.file 等 加载 prometheus.yml 全局配置 + 抓取配置 TSDB 初始化 retention 参数生效 HTTP API & Web UI --web.listen-address 抓取循环启动 scrape_interval 生效 注意:命令行参数优先级高于配置文件中的全局设置。例如 --storage.tsdb.retention.time=30d 会覆盖 prometheus.yml 中的默认值。
性能调优黄金法则:
  • 减少抓取目标:只抓取必要的指标,使用 metric_relabel_configs 丢弃无用指标。
  • 合理设置间隔:对于变化缓慢的指标(如磁盘容量),可设置 60s 抓取间隔。
  • 启用 WAL 压缩:高写入量场景下,可减少 50% 以上的磁盘 I/O。
  • 监控 Prometheus 自身:通过 prometheus_tsdb_* 和 prometheus_target_* 指标观察性能瓶颈。