Prometheus监控平台部署与应用
Prometheus监控平台部署与应用
- 一、Prometheus 的架构介绍
- 1、起源
- 2、什么是 Prometheus
- 3、Prometheus 的运行原理
- 4、Prometheus 组件构成
- 5、Prometheus 的特性
- 6、Prometheus 的工作流程
- 7、Grafana 介绍
- 二、Prometheus安装
- 1、资源清单
- 2、基础环境
- 三、部署 node_exporter
- 1、被监控端安装node_exporter
- 2、配置Prometheus
- 四、Grafana的部署与应用
- 1、安装Grafana
- 2、启动服务并查看监听
- 3、访问Grafana
- 4、导入grafana的监控模板
- 五、Prometheus告警
- 1、安装告警组件alertmanager
- 2、添加媒介
- 3、测试
一、Prometheus 的架构介绍
1、起源
Prometheus 起源于 SoundCloud ,因为微服务迅速发展,导致实例数量以几何倍数递增,不得不考虑设计一个符合以下几个功能的监控系统:
多维数据模型,可以按照实例,服务,端点和方法之类的维度随意对数据进行切片和切块。
操作简单,可以随时随地部署监控服务,甚至在本地工作站上,而无需设置分布式存储后端或重新配置环境。
可扩展的数据收集和分散的架构,以便于可以可靠的监控服务的许多实例,独立团队可以部署独立的监控服务。
转化为一种查询语言,可以利用数据模型进行有效的警报和图形展示。
但是,当时的情况是,以上的功能都分散在各个系统之中,直到 2012 年 SoundCloud 某位大神启动了一个孵化项目, SoundCloud 才把所有功能集合到一起, 这时也就有了 Prometheus。 Prometheus 是用 Go 语言编写,从一开始就是开源的。尽管一直很低调,一开始还是获得了很多粉丝与贡献者;2016 年 Prometheus 成为继 Kubernetes 之后,成为 CNCF (Cloud Native Computing Foundation) 第二个成员。
2、什么是 Prometheus
Prometheus 具有足够的通用性,可以监控各个级别的实例:你自己的应用程序、第三方服务、主机或网络设备等等。此外 Prometheus 特别适用于监控动态云环境和 Kubernetes 云原生环境。
但是也需要注意的是 Prometheus 并不是万能的,目前并没有解决下面的一些问题:
日志和追踪(Prometheus 只处理指标,也称为时间序列)
基于机器学习或 AI 的异常检测
水平扩展、集群化的存储
3、Prometheus 的运行原理
通过 Http 协议周期性抓取被监控组件的状态。输出被监控组件信息的 Http 接口称为 exporter。 常用组件大部分都有 exporter 可以直接使用,比如 haproxy,Nginx,MySQL,Linux 系统信息(磁盘、内存、CPU、网络等)
4、Prometheus 组件构成
Prometheus 生态系统由多个组件构成,其架构如下图所示:
(1) Prometheus server
服务核心组件,采用 pull 方式收集数据,通过 http 协议传输。并存储时间序列数据
(2) Exporters/Jobs
负责收集不支持 Instrumentation 的目标对象的性能数据,并通过 HTTP 接口供 Prometheus Server 获取。
(3) Node-Exporter
用于收集各 node 节点的物理指标状态数据,如平均负载、CPU、内存、磁盘、网络等资源信息的指标数据,需要部署到所有运算节点。
(4) Kube-State-Metrics
为 Prometheus 采集 k8s 资源数据的 exporter,通过监听 API Server 收集 kubernetes 集群内资源对象的状态指标数据,例如 pod、deployment、service 等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。需要注意的是 kube-state-metrics 只是简单的提供一个 metrics 数据,并不会存储这些指标数据,所以可以使用 Prometheus 来抓取这些数据然后存储,主要关注的是业务相关的一些元数据,比如 Deployment、Pod、副本状态等;调度了多少个 replicas?现在可用的有几个?多少个 Pod 是 running/stopped/terminated 状态?Pod 重启了多少次?有多少 Job 在运行中。
(5) cadvisor
用来监控容器内部使用资源的信息,比如 CPU、内存、网络 I/O、磁盘 I/O。
(6) blackbox-exporter
监控业务容器存活性。
(7) Service Discovery
服务发现,Prometheus 支持多种服务发现机制:文件,DNS,Consul,Kubernetes,OpenStack,EC2 等等。基于服务发现的过程并不复杂,通过第三方提供的接口,Prometheus 查询到需要监控的 Target 列表,然后轮训这些 Target 获取监控数据。
(8) Alertmanager
是一个独立的告警模块,从 Prometheus server 端接收到 alerts 后,会进行去重、分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉等。
(9) Pushgateway
类似一个中转站,Prometheus 的 server 端只会使用 pull 方式拉取数据,但是某些节点因为某些原因只能使用 push 方式推送数据,那么它就是用来接收 push 而来的数据并暴露给 Prometheus 的 server 拉取的中转站。可以理解成目标主机可以上报短期任务的数据到 Pushgateway,然后 Prometheus server 统一从 Pushgateway 拉取数据
(10) Grafana
是一个跨平台的开源的度量分析和可视化工具,可以将采集的数据可视化的展示,并及时通知给告警接收方。其官方库中具有丰富的仪表盘插件。
5、Prometheus 的特性
(1)提供多维度数据模型和灵活的查询语言:通过将监控指标关联多个 Tag,来将监控数据进行任意维度的组合;提供 HTTP 查询接口;可以很方便的结合 Grafana 等组件展示数据。
(2)支持服务器节点的本地存储,通过 prometheus 自带的时序数据库,可以完成每秒千万级的数据存储。不仅如此,在保存大量历史数据的场景中,prometheus 还可以对接第三方时序数据库如 OpenTSDB 等。
(3)定义了开放指标数据标准,以基于 HTTP 的 Pull 方式采集时序数据,只有实现了 prometheus 监控数据格式的监控数据才可以被 prometheus 采集;并支持以 Push 方式向中间网关推送时序数据,能更灵活地应对各种监控场景。
(4)支持通过静态文件配置和动态发现机制发现监控对象,自动完成数据采集。prometheus 目前已经支持 Kubernetes、Consul 等多种服务发现机制,可以减少运维人员的手动配置环节。
(5)支持多种多样的图表和界面展示,比如 Grafana 等。
6、Prometheus 的工作流程
7、Grafana 介绍
Grafana 是一款用 Go 语言开发的开源数据可视化工具,可以做数据监控和说几句统计,带有告警功能。
二、Prometheus安装
1、资源清单
操作系统 | 配置 | 主机名 | IP | 角色 |
---|---|---|---|---|
openeuler 24.03 | 2C4G | prometheus | 192.168.10.108 | prometheus服务端 |
openeuler 24.03 | 2C4G | grafana | 192.168.10.107 | grafana |
openeuler 24.03 | 2C4G | server01 | 192.168.10.101 | 被监控节点 |
window10 | 2C4G | —— | 192.168.10.10 | 被监控节点 |
2、基础环境
(1) 关闭防火墙及内核保护
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config
(2) 时间同步
mount linux.iso /mnt
cd /mnt
cp VMwareTools-10.3.26-22085142.tar.gz /root
cd
tar zxf VMwareTools-10.3.26-22085142.tar.gz
cd vmware-tools-distrib/
./vmware-install.pl
(3) 修改主机名
192.168.10.101
hostnamectl set-hostname server01
bash
192.168.10.107
hostnamectl set-hostname grafana
bash
192.168.10.108
hostnamectl set-hostname prometheus
bash
(4) 解压二进制包
tar zxf prometheus-2.48.0.linux-amd64.tar.gz
(5) 移动到合适位置
mv prometheus-2.48.0.linux-amd64 /usr/local/prometheus
(6) 优化路径
ln -s /usr/local/prometheus/prometheus /usr/local/bin/
ln -s /usr/local/prometheus/promtool /usr/local/bin/
(7) 加入守护进程
vim /lib/systemd/system/prometheus.service
[Unit]
Description=prometheus[Service]
Restart=on-failure
ExecStart=/usr/local/bin/prometheus --config.file=/usr/local/prometheus/prometheus.yml --web.listen-address=:9090[Install]
WantedBy=multi-user.target
(8) 重载守护进程后启动并查看监听
systemctl start prometheus
netstat -anpt | grep prometheus
(9) 访问测试
三、部署 node_exporter
Exporter 是 Prometheus 的指标数据收集组件。它负责从目标 Jobs 收集数据,并把收集到的数据转换为 Prometheus 支持的时序数据格式。和传统的指标数据收集组件不同的是,他只负责收集,并不向 Server 端发送数据,而是等待 Prometheus Server 主动抓取,node-exporter 默认的抓取 url 地址:http://ip:9100/metrics
1、被监控端安装node_exporter
192.168.10.101
(1) 解压源码包并放到合适目录下
tar zxf node_exporter-1.7.0.linux-amd64.tar.gz
mv node_exporter-1.7.0.linux-amd64 /usr/local/node_export
(2) 加入守护进程
cat<<EOF>/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
ExecStart=/usr/local/node_export/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
(3) 重载守护进程后启动并查看监听
systemctl daemon-reload
systemctl start node_exporter
netstat -anpt | grep node_exporter
(4) Windows 安装 node_exporter
上传 windows_exporter - 0.20.0 - amd64.msi 文件
注意:可以把 Windows 的防火墙关闭了
双击该文件即可
若对提取结果有格式等进一步需求,可补充说明 。
192.168.10.10
2、配置Prometheus
192.168.10.108
(1) 在配置文件中添加目标(target)
cat<<EOF>>/usr/local/prometheus/prometheus.yml- job_name: 'agent'static_configs:- targets: ["192.168.10.101:9100","192.168.10.10:9182"]
EOF
(2) 重启服务
systemctl restart prometheus
(3) 查看目标是否添加成功
四、Grafana的部署与应用
192.168.10.107
1、安装Grafana
dnf -y install grafana-enterprise-10.2.2-1.x86_64.rpm
2、启动服务并查看监听
systemctl start grafana-server
systemctl status grafana-server
netstat -anpt | grep grafana
3、访问Grafana
(1) 登录
http://192.168.10.107:3000
默认端口:3000
初始账密:admin
(2) 设置数据源
点击DATA SOURCE添加
(3) 设置Prometheus为数据源
(4) 填写连接信息
URL:填写自己的Prometheus的地址
下拉点击保存并测试
4、导入grafana的监控模板
(1) 在home页面点击DASHBOARD
(2) 选择导入模板的方法
(3) 指定模板 ID
模板 ID 可以从 Grafana 官网获得,Grafana 为用户提供了大量的模板,简化了用户的管理难度。本案例中使用的模板 ID 为 12633,填写好 ID 后点击 “Load” 按钮。
https://grafana.com/grafana/dashboards/
注意:
12633:针对 Linux 的节点进行监控的模板
14694:针对 Windows 的节点进行监控的模板
用户也可以选择其他对应的模板进行创建。
(4) 选择数据源Prometheus并导入
(5) 查看
保存
五、Prometheus告警
1、安装告警组件alertmanager
192.168.10.108
(1) 安装altermanager
tar zxf alertmanager-0.26.0.linux-amd64.tar.gz
mv alertmanager-0.26.0.linux-amd64 /usr/local/alertmanager
(2) 添加alertmanager服务到守护进程
属性解析:web.listen-address 是与 prometheus 交互的端口
cat <<EOF>/usr/lib/systemd/system/alertmanager.service
[Unit]
Description=rxdtcfygvhbjkn
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --web.listen-address=0.0.0.0:9093
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
(3) 重载守护进程后启动服务并查看监听
systemctl daemon-reload
systemctl start alertmanager
systemctl enable alertmanager
netstat -anpt | grep 9093
(4) 访问alertmanager的web界面
alertmanager 的 web 界面使用 9093 的端口,登录的 url 如下
http://192.168.10.108:9093
(5) 将alertmanager增加到Prometheus
vim /usr/local/prometheus/prometheus.yml
(6) 创建规则文件
mkdir /usr/local/prometheus/rulesvim /usr/local/prometheus/rules/hoststats-alert.rules
groups:
- name: node1_alertsrules:- alert: HighNodeCpuexpr: instance:node_cpu:avg_rate1m > 10for: 1mlabels:severity: warningannotations:summary: Hgih Node CPU for 1 hourconsole: This is a Test- alert: HostOutOfMemoryexpr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10for: 2mlabels:severity: warningannotations:summary: Host out of memory (instance {{ $labels.instance }})description: "Node memory is filling up (< 10% left)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"- alert: InstanceDownexpr: up == 0for: 10slabels:severity: criticalannotations:summary: Host {{ $labels.instance }} of {{ $labels.job }} is Down!
该规则文件总共添加了三条规则,第一个规则是检测 CPU 负载,第二个是内存利用率的检测,第三个是主机 down 的检测。
(7) 修改Prometheus配置文件添加规则
vim /usr/local/prometheus/prometheus.yml
(8) 重启服务、查看监听、检查语法
systemctl restart prometheus
netstat -anpt | grep prometheus
promtool check config /usr/local/prometheus/prometheus.yml
2、添加媒介
(1) 编辑配置文件
cat <<EOF>/usr/local/alertmanager/alertmanager.yml
global:resolve_timeout: 5msmtp_smarthost: 'smtp.qq.com:587'smtp_from: '2675318058@qq.com'smtp_auth_username: '2675318058@qq.com'smtp_auth_password: 'usummzumlqvhebed'smtp_hello: 'qq.com'smtp_require_tls: true
# 路由配置
route:group_by: ['alertname', 'cluster']group_wait: 10sgroup_interval: 10srepeat_interval: 10sreceiver: 'email'
# 收信人员
receivers:
- name: 'email'email_configs:- to: '386192155@qq.com'send_resolved: true
# 规则主动失效措施,如果不想用的话可以取消掉
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
EOFglobal:resolve_timeout: 5m # 告警解决状态的超时时间,5分钟。若告警恢复,超过此时间未再触发,标记为已解决smtp_smarthost: 'smtp.qq.com:587' # 发送邮件的 SMTP 服务器及端口,这里是 QQ 邮箱的 SMTP 地址smtp_from: '2675318058@qq.com' # 发件人邮箱,用 QQ 邮箱发送告警邮件smtp_auth_username: '2675318058@qq.com' # SMTP 认证的用户名,即发件人邮箱smtp_auth_password: 'usummzumqlvhebed' # SMTP 认证密码(QQ 邮箱需开启 SMTP 服务并设置授权码,这里填的应是授权码 )smtp_hello: 'qq.com' # HELO 命令中使用的域名,与邮箱域名对应smtp_require_tls: true # 是否要求使用 TLS 加密连接发送邮件,保障邮件传输安全route:group_by: ['alertname', 'cluster'] # 按告警名称、集群维度分组,相同组的告警会合并处理group_wait: 10s # 等待 10 秒,收集同组告警,再一起发送通知,避免频繁告警group_interval: 10s # 同组告警,两次通知的时间间隔,10 秒repeat_interval: 10s # 重复告警通知的间隔,10 秒,若告警持续触发,到间隔时间会再次发通知receiver: 'email' # 指定接收告警的接收器,这里关联下面定义的名为 email 的接收器receivers:
- name: 'email' # 接收器名称为 emailemail_configs: # 邮件通知配置- to: '386192155@qq.com' # 收件人邮箱,接收告警邮件send_resolved: true # 告警恢复(解决)时,是否发送恢复通知邮件inhibit_rules:
- source_match: # 源匹配条件,满足条件的告警会触发抑制severity: 'critical' # 源告警的 severity(严重程度)为 critical(严重)target_match: # 目标匹配条件,被抑制的告警需满足severity: 'warning' # 目标告警的 severity 为 warning(警告)equal: ['alertname', 'dev', 'instance'] # 当源和目标告警在这些标签(alertname、dev、instance )上值相等时,触发抑制,即严重告警触发后,同标签的警告告警不再重复通知
(2) 重启服务并查看监听
systemctl restart alertmanager
netstat -anpt | grep alertmanager
3、测试
(1) 挂起虚拟机
最初为绿色
接着黄色挂起
最后红色停止
恢复虚拟机后