Prometheus 概述与部署方法详解
一、Prometheus 核心概念
Prometheus 是一款使用 Go 语言开发的开源监控系统,集数据采集、存储、查询和告警功能于一体。最初由 SoundCloud 构建,后于 2016 年加入云原生计算基金会(CNCF),并在 2018 年成为继 Kubernetes 后第二个正式毕业的 CNCF 项目。它在现代容器化环境尤其是 Kubernetes 生态中被广泛采用,具备以下关键特性:
- 采用多标签键值对模型组织时间序列数据,支持从多个维度分析指标
- 内置高效的时间序列数据库 TSDB(Time Series Database),优化了写入与查询性能
- 提供强大的查询语言 PromQL,可进行复杂的时序数据分析和数学运算
- 支持静态配置与动态服务发现机制(如基于 Consul、Kubernetes API 等)
- 模块化设计,各组件可独立部署与扩展
- 支持本地持久化存储,也兼容远程读写接口
- 单个样本平均仅占用约 3.5 字节空间,具备高吞吐处理能力,能应对百万级指标每秒
- 可通过 Pushgateway 接收短生命周期任务推送的数据
- 拥有丰富的可视化生态,常与 Grafana 集成展示图表
- 社区活跃,提供大量官方及第三方 Exporter 用于采集各类系统和服务指标
二、为何选择 Prometheus?
传统监控工具如 Zabbix 在面对动态变化的微服务架构时存在局限性。例如,在 Kubernetes 中,Pod 可能频繁创建销毁,IP 地址不断变更。Zabbix 要求预先配置主机并安装 Agent,难以自动感知新实例或及时清理已终止的目标。
Prometheus 则通过主动拉取(pull-based)模式结合服务发现机制,能够自动识别新增或移除的服务端点,实现真正的自动化监控。这种适应性强、无需手动注册节点的方式,使其非常适合云原生场景下的可观测性需求。
三、系统架构解析
Prometheus 整体架构包含多个核心组件:
- Prometheus Server:主控组件,负责抓取目标、存储数据、执行查询以及触发规则告警
- Targets:被监控的服务端点,可通过静态配置或服务发现动态获取
- Service Discovery:支持多种发现方式(如 DNS、文件、Kubernetes、Consul 等),自动更新监控目标列表
- Alertmanager:接收来自 Prometheus 的告警事件,处理去重、分组、静默等逻辑,并通过邮件、Webhook 等方式通知
- Pushgateway:为批处理作业等短期任务提供数据暂存入口,允许其将指标推送到网关后再由 Prometheus 抓取
- Data Visualization:通常集成 Grafana 实现高级图形展示;也可通过自带 UI 进行简单查询
四、部署方案对比与实践
根据运行环境的不同,可选用多种方式部署 Prometheus。尽管部署手段多样,但最终的使用体验一致。以下介绍四种主流部署方式:
1. 使用 Docker Compose 快速搭建
适合本地测试或轻量级环境,一键启动 Prometheus 与 Grafana:
mkdir prom-env && cd prom-env
cat <<EOF > .env
ADMIN_USER=admin
ADMIN_PASSWORD=admin
EOF
git clone https://github.com/Einsteinish/Docker-Compose-Prometheus-and-Grafana.git .
docker-compose up -d
# 启动后访问 http://localhost:9090 查看 Prometheus
2. 基于 Operator 在 Kubernetes 中部署
利用 Prometheus Operator 实现对 Prometheus、Alertmanager、Grafana 和各类 Exporter 的声明式管理:
git clone -b v0.10.0 https://github.com/prometheus-operator/kubeprometheus.git
cd kubeprometheus
# 修改 Service 类型为 NodePort 以便外部访问
sed -i 's/type: ClusterIP/type: NodePort/' manifests/prometheus-service.yaml
kubectl apply --server-side -f manifests/setup
kubectl apply -f manifests/
# 等待所有 Pod 正常运行
kubectl get pods -n monitoring
# 访问 Prometheus:http://<node-ip>:<prometheus-svc-nodeport>
3. 使用 Helm 安装 Prometheus Operator
Helm 提供更灵活的参数配置能力,适用于生产环境快速部署:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
kubectl create namespace monitoring
helm install prometheus-operator \
--namespace monitoring \
--set rbacEnable=true \
--wait \
prometheus-community/prometheus-operator
# 将 Grafana 和 Prometheus 的 Service 改为 NodePort
kubectl -n monitoring patch svc prometheus-operator-grafana -p '{"spec":{"type":"NodePort"}}'
kubectl -n monitoring patch svc prometheus-operator-prometheus -p '{"spec":{"type":"NodePort"}}'
# 获取 Grafana admin 密码
kubectl -n monitoring get secret $(kubectl -n monitoring get secrets | grep grafana-admin | awk '{print $1}') -o jsonpath='{.data.admin-password}' | base64 -d && echo
4. 二进制方式手动安装
适用于对系统有完全控制权的物理机或虚拟机环境,便于深入理解内部结构:
wget https://github.com/prometheus/prometheus/releases/download/v2.36.0/prometheus-2.36.0.linux-amd64.tar.gz
tar -xf prometheus-2.36.0.linux-amd64.tar.gz -C /usr/local/
cd /usr/local && ln -s prometheus-2.36.0.linux-amd64 prometheus
# 创建 systemd 服务文件
cat <<EOF > /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \\
--config.file=/usr/local/prometheus/prometheus.yml \\
--storage.tsdb.path=/data/prometheus \\
--web.enable-lifecycle
ExecReload=/bin/kill -HUP \$MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=655360
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=prometheus
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now prometheus
systemctl start prometheus
# 检查状态与端口
systemctl status prometheus
ss -tlnp | grep 9090
安装完成后,可通过浏览器访问 http://<your-server-ip>:9090 查看 Prometheus Web UI。