Prometheus
Prometheus 是一个开源的监控和警报系统,主要用于收集和查询时序数据。其架构设计旨在高效地处理大规模的数据,并提供灵活的查询和可视化功能。以下是 Prometheus 的详细架构描述:
- Prometheus 服务器
- 数据收集:Prometheus 服务器负责定期从配置好的目标(Targets)中抓取(Scrape)监控数据。目标是被监控的应用或服务,通常通过 HTTP 端点暴露时间序列数据。
- 数据存储:Prometheus 服务器内置了一个高效的时序数据库(Time Series Database, TSDB),用于存储抓取的数据。数据按时间序列存储,并采用了时间分片的方式来优化存储和查询性能。
- 查询引擎:Prometheus 提供了一个强大的查询语言,PromQL(Prometheus Query Language),用于执行复杂的查询、聚合和数据分析操作。
- 报警管理:Prometheus 内置报警功能,通过定义规则和阈值生成报警。报警信息可以发送到外部报警管理系统(如 Alertmanager)进行处理。
- 数据抓取(Scraping)
- 目标配置:Prometheus 通过配置文件(
prometheus.yml
)指定需要抓取的目标。目标可以是静态的或通过服务发现(Service Discovery)动态发现的。 - Exporters:被监控的服务通过 Exporter 将其内部状态暴露为 Prometheus 能够理解的格式。例如,
node_exporter
用于暴露系统级指标,blackbox_exporter
用于检测外部服务的可用性。
- 数据存储
- 时序数据库:Prometheus 使用自己的时序数据库来存储数据。它采用了高效的压缩算法,并且支持数据的增量存储和查询。
- 数据分片:数据按时间分片存储,使得历史数据的查询和存储变得更加高效。
- 查询和可视化
- PromQL:Prometheus 提供了一种功能强大的查询语言,允许用户从存储的数据中提取和聚合信息。
- Prometheus UI:内置的 Web UI 允许用户执行 PromQL 查询、查看时间序列数据以及管理报警规则。
- Grafana:Prometheus 常与 Grafana 结合使用,Grafana 提供了强大的可视化功能,可以创建丰富的仪表板以展示 Prometheus 收集的数据。
- 报警管理
- Alertmanager:Prometheus 的报警功能通过 Alertmanager 进行管理。Alertmanager 处理来自 Prometheus 的报警,并可以将其路由到不同的接收器(如邮件、Slack、PagerDuty)进行通知。
- 服务发现
- 静态配置:可以在 Prometheus 配置文件中静态配置目标。
- 动态服务发现:Prometheus 支持多种服务发现机制(如 Kubernetes、Consul、AWS),可以自动发现和更新监控目标。
- 集成和扩展
- Exporters:用于将各种应用的指标暴露给 Prometheus。Exporters 可以是官方维护的,也可以是社区提供的。
- Pushgateway:用于推送短期或批处理作业的指标。由于 Prometheus 主要是拉取模式,Pushgateway 提供了一个将指标推送到 Prometheus 的方式,适用于临时或一次性作业。
- Pushgateway:用于推送短期或批处理作业的指标。由于 Prometheus 主要是拉取模式,Pushgateway 提供了一个将指标推送到 Prometheus 的方式,适用于临时或一次性作业。
- 高可用性
- 多实例部署:Prometheus 可以通过多个实例来实现高可用性。这些实例可以配置为互相独立运行,并将数据存储在不同的地方。
- 数据复制:虽然 Prometheus 本身不提供内置的数据复制机制,但可以通过外部工具(如 Thanos、Cortex)来实现数据的跨集群存储和查询功能。
- 安全性
- 身份验证和授权:Prometheus 本身没有内置身份验证和授权机制,通常通过反向代理(如 Nginx、Traefik)来实现。
- 加密:Prometheus 支持通过 HTTPS 加密数据传输,但需要外部配置和设置。
- 存储管理
- 数据保留策略:Prometheus 允许配置数据保留时间,控制数据的存储周期。可以通过配置文件中的
storage.tsdb.retention.time
设置。
通过这些组件和功能,Prometheus 提供了一个全面的监控解决方案,适用于多种规模和复杂度的系统。
监控类型主要分为黑盒监控和白盒监控两种:
- 黑盒监控:关注系统的外部行为和输出,通常不深入了解内部实现。比如,网站的用户体验监控,通过模拟用户操作来测试网站性能和响应。
- 白盒监控:深入了解系统内部状态和实现,通过代码级别的分析来监控。比如,应用程序的性能监控,通过跟踪代码执行来检测瓶颈。
prometheus安装部署
方式一
apt install prometheus -y
方式二
docker-compouse
方式三
二进制安装
tar -zxvf prometheus-2.53.2.linux-amd64.tar.gz -C /usr/local/bin
ln -sv /usr/local/bin/prometheus-2.53.2.linux-amd64/ /usr/local/bin/prometheus
./promtool check config prometheus.yml
cat >/etc/systemd/system/prometheus.service<<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/usr/local/bin/prometheus
ExecStart=/usr/local/bin/prometheus/prometheus --config.file=/usr/local/bin/prometheus/prometheus.yml --web.enable-lifecycle
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now prometheus.service
部署Node-exporter
tar -zxvf node exporter-1.8.2.linux-amd64.tar.gz
ln -sv /usr/local/bin/node exporter-1.8.2.linux-amd64 /usr/local/bin/node_exportercd /usr/local/bin/node_exporter
cat >/etc/systemd/system/node-exporter.service<<E0F
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/bin/node exporter/node exporter
[Install]WantedBy=multi-user.targetEOF
systemctldaemon-reload
systemctl start node-exporter.service
systemctl enable node-exporter.service
#配置prometheus-server节点
vim /usr/local/bin/prometheus/prometheus.yml
# k8s
- job name:"K8S-nodes"
static configs:
-targets:['192.168.240.11:9100','192.168.240.12:9100','192.168.240.13:9100'
systemctl restart prometheus.service
部署Grafana可视化
Grafana :可视化组件,用于接受客户端的请求,到Prometheus服务端获取查询数据,经过自身渲染,再浏览器端显示给终端客户
apt update
apt-get install -y adduser libfontconfig1 musldpkg -i grafana-enterprise 11.1.4 amd64.deb
cat >/etc/grafana/grafana.ini<<E0F
[server]
# Protocol(http,https,socket)
protocol =http# The ip address to bind to, empty will bind to all interfaceshttp addr =0.0.0.0
# The http port to use
http port = 3000
EOF
systemctl restart grafana-server.service
systemctlenable grafana-server.service
systemctl status grafana-server.service
## 寻找模板
https://grafana.com/grafana/dashboards
示例
cat <<EOF>cadvisor-ds.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cadvisor
namespace: monitoring
spec:
selector:
matchLabels:
app: cAdvisor
template:
metadata:
labels:
app: cAdvisor
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
hostNetwork: true
restartPolicy: Always
containers:
- name: cadvisor
image: harbor.hiuiu.com/prometheus/cadvisor:v0.47.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
volumeMounts:
- name: root
mountPath: /rootfs
- name: run
mountPath: /var/run
- name: sys
mountPath: /sys
- name: docker
mountPath: /var/lib/containerd
volumes:
- name: root
hostPath:
path: /
- name: run
hostPath:
path: /var/run
- name: sys
hostPath:
path: /sys
- name: docker
hostPath:
path: /var/lib/containerd
---
EOF
kubectl create ns monitoring
kubectl apply -f cadvisor-ds.yaml
kubectl get pod -n monitoring
vim /usr/local/bin/prometheus/prometheus.yml
- job_name: "container"
static_configs:
- targets: ['192.168.240.12:8080','192.168.240.13:8080']
systemctl restart prometheus