前言:
Prometheus (普罗米修斯)是一款开源的系统监控与告警工具,最初由 SoundCloud 开发,后捐赠给 Cloud Native Computing Foundation(CNCF)并成为毕业项目,广泛用于云原生、容器化环境及传统基础设施的监控。它以时序数据存储、灵活的查询语言、主动式告警和高扩展性为核心特点,是监控领域的主流解决方案之一。
一、核心特性
时序数据模型Prometheus 存储的是带标签(Label)的时序数据,每条数据由指标名称、键值对标签和数值组成,标签可灵活区分不同实例(如不同服务器的 CPU 使用率),支持多维数据查询。示例指标:
cpu_usage{host="server01", core="0"} 25.5(server01 的 0 号核心 CPU 使用率为 25.5%)。PromQL 查询语言内置强大的 PromQL(Prometheus Query Language),支持对时序数据进行聚合、过滤、计算和预测,可实时查询监控指标,也能作为告警规则和可视化面板的数据源。示例查询:
- 计算过去 5 分钟内 server01 的平均 CPU 使用率:
avg(cpu_usage{host="server01"})[5m] - 筛选内存使用率超过 80% 的实例:
memory_usage{job="app"} > 80。
- 计算过去 5 分钟内 server01 的平均 CPU 使用率:
主动拉取(Pull)模式Prometheus 采用 “拉取” 方式采集数据:通过 HTTP 定期从被监控目标(Exporter 或应用程序暴露的 /metrics 端点)拉取指标,无需依赖外部消息队列,架构简单且易于故障排查;也支持 “推送” 模式(通过 PushGateway)适配短生命周期任务(如定时任务、容器 Job)。
内置告警管理结合 AlertManager 组件实现告警规则配置、分组、静默和路由:
- 在 Prometheus 中定义告警规则(如 CPU 使用率持续 5 分钟超过 90%);
- 触发后推送给 AlertManager,由其负责去重、分组,并发送至邮箱、Slack、PagerDuty 等渠道。
高可用与扩展性
- 支持多实例部署(联邦集群 Federation),实现监控数据的分片与聚合;
- 可通过远程存储集成(如 Thanos、VictoriaMetrics)解决本地存储的容量限制,实现长期数据留存。
丰富的 Exporter 生态Exporter 是采集第三方系统指标的组件,Prometheus 社区提供了大量官方 / 第三方 Exporter,覆盖常见场景:
- 系统监控:node_exporter(服务器 CPU、内存、磁盘);
- 容器监控:cadvisor(Docker 容器)、kube-state-metrics(Kubernetes 资源);
- 应用监控:mysql_exporter(MySQL)、redis_exporter(Redis)、blackbox_exporter(HTTP/ICMP 探测)。
二、核心组件
Prometheus Server核心组件,负责:
- 从目标拉取指标数据并存储;
- 处理 PromQL 查询;
- 评估告警规则并触发告警。
Exporters采集第三方系统指标并转换为 Prometheus 格式,暴露 /metrics 端点供 Server 拉取。
PushGateway接收短生命周期任务的指标推送,暂存后供 Prometheus Server 拉取(适用于无法被主动拉取的场景)。
AlertManager处理 Prometheus 发送的告警,负责告警的分组、静默、路由和通知。
可视化工具
- Prometheus Web UI:内置简单的查询与可视化界面;
- Grafana:主流的监控可视化工具,支持与 Prometheus 深度集成,可制作自定义仪表盘。
三、典型应用场景
- 云原生监控:监控 Kubernetes 集群、容器、微服务(如通过 Spring Boot Actuator 暴露指标);
- 基础设施监控:监控物理机、虚拟机的系统资源(CPU、内存、磁盘、网络);
- 应用性能监控(APM):监控应用的接口响应时间、错误率、QPS;
- 业务监控:自定义指标监控业务数据(如订单量、支付成功率)。
四、优势与局限性
优势:
- 轻量级、易部署,无需依赖复杂的分布式存储;
- PromQL 灵活强大,支持复杂的指标分析与计算;
- 原生适配云原生环境,与 Kubernetes 深度集成;
- 社区活跃,Exporter 生态丰富,文档完善。
局限性:
- 本地存储基于时序数据库(TSDB),默认仅保留 15 天数据,长期存储需依赖第三方工具;
- 拉取模式对网络可达性要求高,跨网络监控需额外配置(如反向代理);
- 不适合存储高频、高基数的指标(如单指标标签维度过多),可能导致性能下降。
操作实例
前提准备:
- 三台centos系统
- 全部安装K8S,安装环境可以基于本作者以往所写的k8s安装博客
三台主机名称分为:
k8s-master:192.168.180.110
k8s-node1:192.168.180.120
k8s-node2:192.168.180.130https://blog.csdn.net/m0_68472908/article/details/146534195?spm=1001.2014.3001.5501https://blog.csdn.net/m0_68472908/article/details/146534195?spm=1001.2014.3001.5501
部署开始:(下述所说的所有节点包含master)
k8s-master下执行(所有操作以master下为先,若有需要别在其他节点上操作,会提示):
1. 在master上导入yaml文件,并修改IP(文件放在资源绑定,可自行获取)
因为源文件内的IP不对,要修改为实际IP
sed -i s/192.168.9.208/192.168.180.130/g alertmanager-pvc.yaml sed -i s/192.168.9.208/192.168.180.130/g grafana.yaml sed -i s/192.168.9.208/192.168.180.130/g prometheus-*.yaml sed -i s/192.168.9.207/192.168.180.120/g prometheus-*.yaml #可查看一番是否修改完成 grep 192.168. *.yaml2. 应用prometheus RBAC授权
vim prometheus-rbac.yaml #将rbac.authorization.k8s.io/v1beta1 替换成rbac.authorization.k8s.io/v1,有两处 #修改完成后退出,更新资源 kubectl apply -f prometheus-rbac.yaml3. 通过configmap创建prometheus主配置文件
kubectl apply -f prometheus-configmap.yaml4. 部署NFS(仅k8s-node02执行)
yum install -y epel-release yum install -y nfs-utils rpcbind mkdir -p /data/file/prometheus-data vim /etc/exports /data/file 192.168.180.0/24(rw,sync,insecure,no_subtree_check,no_root_squash) #编写完成后,启用NFS systemctl enable rpcbind && systemctl restart rpcbind systemctl enable nfs && systemctl restart nfs5. 所有节点安装NFS
yum install -y nfs-utils systemctl enable nfs && systemctl restart nfs mkdir -p /data/file mount 192.168.180.130:/data/file /data/file6. 部署prometheus以及services
#所有节点执行 docker pull prom/prometheus:latest docker pull jimmidyson/configmap-reload:latest docker pull prom/alertmanager:latest docker tag prom/alertmanager:latest prom/alertmanager:v0.14.0 docker tag prom/prometheus:latest prom/prometheus:v2.2.1 docker tag jimmidyson/configmap-reload:latest jimmidyson/configmap-reload:v0.1 #仅master执行: kubectl apply -f prometheus-statefulset.yaml kubectl get statefulset.apps -n kube-system kubectl describe pod prometheus-0 -n kube-system kubectl apply -f prometheus-service.yaml kubectl get pod,svc -n kube-system #验证是否部署成功 iptables -P FORWARD ACCEPT echo 1 > /proc/sys/net/ipv4/ip_forward7. 部署grafana
#三个节点均需创建 mkdir -p /data/file/grafana-data #三个节点均需创建 chmod -R 777 /data/file/grafana-data/ --- kubectl apply -f grafana.yaml kubectl get pod,svc -n kube-system8. 监控k8s node节点
部署Prometheus Agent代理
cd /root/prometheus #两台node节点地址 scp -r node 192.168.180.120:/root/ scp -r node 192.168.180.130s:/root/9. 执行安装(两台node执行)
cd /root/node sh node_exporter.sh sh node_exporter.sh netstat -anplt | grep node_export10. web界面操作
登录:192.168.180.110:3000
需要输入的照着以下图片进行
11. 部署Alertmanager报警
kubectl apply -f prometheus-configmap.yaml12. 部署Alertmanager
vim alertmanager-configmap.yaml data: alertmanager.yml: | global: resolve_timeout: 5m smtp_smarthost: 'smtp.126.com:25' smtp_from: 'xxxxx@126.com' //修改为实际发送邮箱 smtp_auth_username: 'xxxxx@126.com' //发送用户 smtp_auth_password: 'MRGECFAAIPYEQRSS' //修改为实际密码 receivers: - name: default-receiver email_configs: - to: "xxxxx@qq.com" //修改为实际接收者邮箱 #node1上执行 mkdir /data/file/alertmanager-data/ chmod -R 777 /data/file/alertmanager-data/ #切换master上执行 kubectl apply -f alertmanager-configmap.yaml kubectl apply -f alertmanager-pvc.yaml kubectl apply -f alertmanager-deployment.yaml kubectl apply -f alertmanager-service.yaml vim prometheus-statefulset.yaml volumeMounts - name: prometheus-rules mountPath: /etc/config/rules volumes: - name: prometheus-rules configMap: name: prometheus-rules #保存退出执行 kubectl apply -f prometheus-rules.yaml kubectl apply -f prometheus-statefulset.yaml sudo journalctl -xe | grep cni13. 关闭节点测试邮件发送,测试成功
systemctl stop node_exporter