当前位置:首页 > 技术 > 正文内容

Prometheus 概述与部署方法详解

访客 技术 2026年6月20日 1

一、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 Architecture

四、部署方案对比与实践

根据运行环境的不同,可选用多种方式部署 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。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。