亲爱的读者们👋
欢迎加入【30天精通Prometheus】专栏!📚 在这里,我们将探索Prometheus的强大功能,并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。🚀
Prometheus是云原生和DevOps的核心监控工具,我们将从基础概念开始,逐步涵盖配置、查询、告警和可视化。💪
在接下来的30天里,我们将解锁Prometheus的实战技巧,通过案例和分享,助你深入理解其工作原理。📆
目标:30天后,你将熟练掌握Prometheus,为未来的项目挑战做好准备!💯
这是一段精彩旅程,期待你的加入!🎉
- 【30天精通Prometheus:一站式监控实战指南】第1天:深入探索Prometheus:30天一站式监控实战指南的开篇之旅
- 【30天精通Prometheus:一站式监控实战指南】第2天:Prometheus从入门到实战:安装、配置详解与生产环境搭建指南
- 【30天精通Prometheus:一站式监控实战指南】第3天:Alertmanager从入门到实战:安装、配置详解与生产环境搭建指南
- 【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第5天:kafka_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第6天:mysqld_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第7天:postgres_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第8天:redis_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第9天:elasticsearch_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第10天:blackbox_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第11天:consul_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第12天:windows_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第13天:graphite_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第14天:jmx_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第15天:ipmi_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第16天:snmp_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第17天:nginx-prometheus-exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第18天:apache_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第19天:haproxy_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第20天:dcgm-exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细
- 【30天精通Prometheus:一站式监控实战指南】第21天:深入解析PromQL(Prometheus Query Language)的高级用法,解锁监控数据的无限可能,释放监控数据潜能
- 【30天精通Prometheus:一站式监控实战指南】第22天:如何将Prometheus与Grafana集成,通过可视化的方式展示监控数据,提高监控效率
- 【30天精通Prometheus:一站式监控实战指南】第23天:如何搭建高可用的Prometheus集群,以应对大规模监控场景和单点故障问题,确保监控服务的稳定性
- 【30天精通Prometheus:一站式监控实战指南】第24天:Prometheus数据存储与性能调优攻略,通过优化存储和查询性能来提升监控系统的整体效率
- 【30天精通Prometheus:一站式监控实战指南】第25天:微服务架构下的Prometheus实战,Kubernetes与Prometheus集成:集群监控实战
- 【30天精通Prometheus:一站式监控实战指南】第26天:构建健壮的高可用Prometheus集群,以应对大规模监控挑战与单点故障风险
- 【30天精通Prometheus:一站式监控实战指南】第27天:Prometheus与第三方工具集成:提升监控能力
- 【30天精通Prometheus:一站式监控实战指南】第28天:故障排查与告警分析实战案例分享
- 【30天精通Prometheus:一站式监控实战指南】第29天:Prometheus监控策略与最佳实践指南
- 【30天精通Prometheus:一站式监控实战指南】第30天:Prometheus监控技术回顾与未来展望
一、Prometheus安装与配置概述📘
安装步骤
1.下载Prometheus:从Prometheus的官方网站下载适合你操作系统的二进制包。
2.解压安装包:将下载的压缩包解压到你想要安装的目录。
3.运行Prometheus:在解压后的目录中,找到prometheus或prometheus.exe(Windows系统)并执行它。这将会启动Prometheus服务器。
配置文件的基本结构
Prometheus的配置文件通常名为prometheus.yml,它定义了Prometheus如何监控目标系统。配置文件的基本结构大致如下:
1.global:全局配置部分,可以设置一些全局的参数,如抓取间隔(scrape_interval)、评估规则间隔(evaluation_interval)等。
2.scrape_configs:抓取配置部分,定义了Prometheus从哪些目标系统抓取数据。每个目标系统可以配置为一个job,包括目标系统的地址(targets)、端口(port)、协议(scheme)等。
3.alerting:告警配置部分(可选),用于定义告警规则。告警规则描述了当监控数据满足某些条件时,Prometheus应该触发告警。
4.remote_write 和 remote_read(可选):分别用于配置Prometheus将数据存储到远程存储系统和从远程存储系统读取数据的设置。
作用和重要性
1.global 部分的全局配置决定了Prometheus的基本行为,如数据抓取的频率和告警规则评估的频率。
2.scrape_configs 部分定义了Prometheus需要监控的目标系统,是配置的核心部分。
3.alerting 部分使得Prometheus能够根据监控数据触发告警,帮助运维人员及时发现和处理问题。
4.remote_write 和 remote_read 部分使得Prometheus能够与其他系统(如远程存储系统)集成,扩展其功能。
二、安装Prometheus 💾
注意事项和常见问题
1.权限问题:确保你有足够的权限来执行安装和启动Prometheus的命令。如果你使用的是Linux系统,可能需要使用sudo命令来获取管理员权限。
2.防火墙设置:Prometheus默认监听在9090端口。如果你的服务器启用了防火墙,请确保9090端口是开放的,以便外部客户端能够访问Prometheus的Web UI。
3.配置文件:Prometheus的配置文件(prometheus.yml)对于其运行至关重要。在安装过程中,请确保配置文件的路径和设置是正确的。如果你修改了配置文件,请务必重新加载或重启Prometheus以使更改生效。
4.日志和错误消息:如果Prometheus无法启动或运行不正常,请检查终端或日志文件中的错误消息。这些消息通常会提供关于问题的详细信息,并帮助你找到解决方案。
5.无法下载资料:如果无法下载资料可跳转到最后一章”相关资料下载地址“,进行离线下载
2.1 访问Prometheus官方网站 🌐
- 打开浏览器,访问Prometheus的官方网站:https://prometheus.io/download/
2.2 选择适合的版本🔍
- 在下载页面,你将看到不同操作系统的Prometheus二进制包。根据你的操作系统选择适合的版本。例如,如果你使用的是Linux 64位系统,就选择prometheus-x.x.x.linux-amd64.tar.gz(其中x.x.x是版本号)
2.3 下载Prometheus ⬇️
- 点击所选版本的下载链接,将Prometheus的二进制包下载到你的本地计算机。
2.4 解压安装包📂
- 将下载的Prometheus压缩包解压到你想要安装的目录。你可以使用命令行工具(如tar)来完成这个步骤。解压后,你将看到一个名为prometheus-x.x.x.linux-amd64的目录,其中包含Prometheus的二进制文件和其他相关文件。
tar -xzf prometheus-x.x.x.linux-amd64.tar.gz
2.5 运行Prometheus 🚀
- 进入解压后的目录,并运行Prometheus服务器。在Linux下,你可以使用如下命令。这样就使用默认的配置文件prometheus.yml启动了Prometheus服务器。如果一切正常,你应该能在终端看到Prometheus的启动日志。
cd prometheus-x.x.x.linux-amd64
./prometheus --config.file=prometheus.yml
如下执行结果示例....
......
level=info component="rule manager" msg="Starting rule manager..."
三、Prometheus配置文件详解📖
3.1 prometheus.yml🔧
global
global部分用于定义全局的配置参数,这些参数可以应用于整个Prometheus实例。
- scrape_interval: 定义Prometheus抓取目标的时间间隔,默认为1分钟。
- evaluation_interval: 定义Prometheus评估告警规则的时间间隔,默认为1分钟。
global:
scrape_interval: 15s # 设置为15秒
evaluation_interval: 15s # 设置为15秒
scrape_configs
scrape_configs部分定义了Prometheus如何抓取目标的数据。每个scrape_config块代表一组抓取目标及其相关的配置
- job_name: 用于标识这组抓取目标的名称。
- static_configs: 静态配置的目标列表。
- targets: 目标地址列表,Prometheus将从这些地址抓取数据。
注意:
为了监控不同的服务和应用,你通常需要为每个服务或应用配置一个或多个scrape_config块。每个块定义了一组具有相同配置参数的目标。例如,你可能有一个用于监控所有数据库实例的scrape_config块,以及另一个用于监控所有Web服务器的块。
示例:监控一个名为“node_exporter”和”pushgateway“的服务
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100'] # 假设node_exporter运行在本地9100端口
- job_name: 'pushgateway'
static_configs:
- targets: ['localhost:9080'] # 假设pushgateway运行在本地9080端口
alerting
alerting部分用于定义告警相关的配置。
- alert_relabel_configs: 用于在发送告警之前重新标记告警的标签。
- alertmanagers: 定义Prometheus将告警发送给哪些Alertmanager实例。
示例:配置Prometheus将告警发送给Alertmanager实例
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093 # 假设Alertmanager运行在本地9093端口
rule_files
虽然你在请求中没有直接提到rule_files,但这是配置告警规则和记录规则的关键部分。
- rule_files: 指定Prometheus加载告警和记录规则的文件列表。
示例:加载告警规则文件(注意:近几个版本才支持)
rule_files:
- "alert_rules.yml" # 假设告警规则定义在alert_rules.yml文件中
3.2 prometheus.service🛠️
基本配置
- –config.file=“prometheus.yml”
Prometheus的配置文件路径。这个文件定义了Prometheus如何发现目标、抓取指标等。
Web服务配置
- –web.listen-address=“0.0.0.0:9090”
Prometheus的UI、API和遥测数据的监听地址和端口。默认情况下,Prometheus在9090端口上监听所有接口。 - –web.config.file=“”
用于指定启用TLS或身份验证的配置文件路径。 - –web.read-timeout=5m
请求读取超时前的最大持续时间,以及空闲连接的关闭时间。 - –web.max-connections=512
最大并发连接数。 - –web.external-url=<URL>
Prometheus对外可达的URL,通常用于反向代理设置。它用于生成指向Prometheus自身的相对和绝对链接。 - –web.route-prefix=<path>
Web端点的内部路由前缀。默认为–web.external-url的路径部分。 - –web.user-assets=<path>
静态资源目录的路径,可通过/user访问。 - –[no-]web.enable-lifecycle
通过HTTP请求启用关闭和重载。 - –[no-]web.enable-admin-api
启用用于管理控制操作的API端点。 - –[no-]web.enable-remote-write-receiver
启用接受远程写入请求的API端点。 - –web.console.templates=“consoles”
控制台模板目录的路径,可通过/consoles访问。 - –web.console.libraries=“console_libraries”
控制台库目录的路径。 - –web.page-title=“Prometheus Time Series Collection and Processing Server”
Prometheus实例的文档标题。 - –web.cors.origin=“.*”
CORS源的正则表达式。用于跨域资源共享配置。
存储配置
- –storage.tsdb.path=“data/”
指标存储的基本路径。仅用于服务器模式。 - –storage.tsdb.retention.time 和 --storage.tsdb.retention.size
分别指定在存储中保留样本的时间长度和最大字节数。 - –[no-]storage.tsdb.no-lockfile
不在数据目录中创建锁文件。 - –storage.tsdb.head-chunks-write-queue-size=0
实验性功能,用于写入头块到磁盘的队列大小。 - –storage.agent.path=“data-agent/”
仅用于代理模式的指标存储基本路径。 - –storage.agent.wal-compression
压缩代理的WAL(写前日志)。 - –storage.agent.retention.min-time 和 --storage.agent.retention.max-time
定义代理WAL截断时样本的最小和最大年龄。
告警通知配置
- —alertmanager.notification-queue-capacity=10000
待处理的Alertmanager通知队列的容量。
查询配置
- –query.lookback-delta=5m
在表达式评估和联邦过程中检索指标的最大回溯持续时间。 - –query.timeout=2m
查询可能执行的最长时间,之后将被中止。 - –query.max-concurrency=20
最大并发查询数。 - –query.max-samples=50000000
单个查询可以加载到内存中的最大样本数。这也限制了查询可以返回的样本数。
日志配置
- –log.level=info
仅记录给定严重程度或以上的日志消息。 - –log.format=logfmt
日志消息的输出格式。
功能标志
- –enable-feature= …
启用特定的功能标志。这可以用于启用实验性或高级功能。
四、实战演练:生产搭建基础监控环境🔨
通过一个实战案例,描述如何搭建一个基础的Prometheus监控环境,这里使用的是非root用户管理prometheus
4.1 创建普通用户管理pormetheus 👤
useradd deploy
4.2 解压prometheus.tar.gz📦
注意
我的是x86,所以使用prometheus-2.47.0.linux-amd64.tar.gz,您可以使用uname -a命令查看系统架构
tar xvf prometheus-2.47.0.linux-amd64.tar.gz -C /home/deploy/
4.3 更改prometheus软件包名称✂️
mv /home/deploy/prometheus-2.47.0.linux-amd64 /home/deploy/prometheus
4.4 编辑prometheus.service文件📝
注意
prometheus相关参数您可参考上述参数详解,根据实际环境需求自行更改
cat > /etc/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Server
After=network.target
Documentation=https://prometheus.io/docs/introduction/overview/
[Service]
Type=simple
User=deploy
Group=deploy
ExecStart=/home/deploy/prometheus/prometheus \
--config.file=/home/deploy/prometheus/prometheus.yml \
--web.listen-address=0.0.0.0:9090 \
--web.read-timeout=5m \
--web.max-connections=4096 \
--storage.tsdb.retention=1d \
--storage.tsdb.min-block-duration=1h \
--storage.tsdb.path=/home/deploy/prometheus/data \
--query.timeout=2m \
--web.enable-lifecycle \
--log.level=info \
--log.format=logfmt
ExecReload=/bin/kill -HUP
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
4.4 启动prometheus.service🔌
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus.service
4.5 查看服务是否正常启动🔍
# 查看service服务是否启动
sudo systemctl status prometheus.service
# 查看端口是否存在
sudo ss -ntulp | grep 9090
五、基于云原生的部署方案 🚀
5.1 使用Docker部署Prometheus 🐳
5.1.1 获取Prometheus Docker镜像 📸
- 从docker-hub下载镜像
docker pull prom/prometheus:v2.52.0
docker tag prom/prometheus:v2.52.0 prometheus:v2.52.0
- 从阿里云下载镜像(如果访问不到docker-hub)
// 如果访问不到docker-hub的可以访问如下地址
docker pull registry.cn-beijing.aliyuncs.com/insights-ops/prometheus:v2.52.0
docker tag registry.cn-beijing.aliyuncs.com/insights-ops/prometheus:v2.52.0 prometheus:v2.52.0
- 从百度网盘下载镜像
docker load -i prometheus-v2.52.0.tar
docker tag prom/prometheus:v2.52.0 prometheus:v2.52.0
5.1.2 准备prometheus数据目录和配置文件
mkdir -p /usr/local/prometheus/prometheus-data
touch /usr/local/prometheus/prometheus.yml
chmod -R 0777 /usr/local/prometheus/
5.1.3 编辑prometheus.yml,添加要监控的指标项
vi /usr/local/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
5.1.4 运行Prometheus Docker容器 🏃
- 开启持久化存储
mkdir /usr/local/prometheus
docker run -itd \
--name prometheus \
-p 9090:9090 \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /usr/local/prometheus/prometheus-data:/prometheus \
prometheus:v2.52.0 \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/prometheus \
--web.console.libraries=/usr/share/prometheus/console_libraries \
--web.console.templates=/usr/share/prometheus/consoles \
--web.enable-lifecycle \
--log.level=debug
5.1.5 如果添加监控项,可直接重新加载配置使其生效
- 我在启动参数中添加了
--web.enable-lifecycle
标志来启用 Prometheus 的生命周期 API。现在,你可以通过发送 POST 请求到 Prometheus 的/-/reload
端点来重新加载配置文件,而无需重启 Prometheus 容器。
curl -X POST http://localhost:9090/-/reload
5.1.6 验证Docker部署 ✅
# 查看容器是否正常启动,Status为Up为正常
docker ps -a | grep prometheus
# 端口监听
ss -ntulp | grep 9090
5.2 利用Docker-Compose简化部署 📘
5.2.1 编写docker-compose.yml配置文件 📜
version: '3'
services:
prometheus:
image: prometheus:v2.52.0
restart: always
container_name: prometheus
volumes:
- /etc/localtime:/etc/localtime:ro
- /usr/local/prometheus/:/etc/prometheus/
- /usr/local/prometheus/prometheus-data:/prometheus-data
command:
--config.file=/etc/prometheus/prometheus.yml
--web.listen-address=0.0.0.0:9090
--web.read-timeout=5m
--web.max-connections=4096
--storage.tsdb.retention="3d"
--storage.tsdb.min-block-duration=1h
--storage.tsdb.path=/prometheus-data
--web.enable-lifecycle
ports:
- 9090:9090
5.2.2 使用Docker-Compose启动服务 🚀
docker-compose up -d
5.2.3 验证Docker部署 ✅
# 查看容器是否正常启动,Status为Up为正常
docker ps -a | grep prometheus
# 端口监听
ss -ntulp | grep 9090
5.3 在Docker Swarm中部署Prometheus 🐝
5.3.1 创建Docker Compose文件
创建一个 docker-compose.yml 文件来定义 Prometheus 服务。以下是一个示例配置文件:
mkdir docker/docker-swarm/prometheus -p
vi docker/docker-swarm/prometheus/docker-compose.yml
version: '3.7'
services:
prometheus:
image: prom/prometheus:v2.54.1
deploy:
replicas: 1
restart_policy:
condition: on-failure
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- monitoring
networks:
monitoring:
driver: overlay
5.3.2 准备配置文件
在docker/docker-swarm/prometheus目录下创建prometheus.yml 文件。
vi docker/docker-swarm/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
5.3.3 部署服务到Docker Swarm
使用 docker stack deploy 命令将服务部署到 Docker Swarm。
docker pull prom/prometheus:v2.54.1
docker stack deploy -c docker/docker-swarm/prometheus/docker-compose.yml monitoring
5.3.4 验证部署
docker service ls
5.4 在Kubernetes(K8s)上部署Prometheus 🚀
5.4.1 使用Prometheus Operator部署
5.4.1.1 版本兼容性
支持以下Kubernetes版本,并在我们在其各自的分支中对这些版本进行测试时正常工作。但请注意,其他版本可能也适用!
kube-prometheus stack | Kubernetes 1.23 | Kubernetes 1.24 | Kubernetes 1.25 | Kubernetes 1.26 | Kubernetes 1.27 | Kubernetes 1.28 | Kubernetes 1.29 | Kubernetes 1.30 | Kubernetes 1.31 |
---|---|---|---|---|---|---|---|---|---|
release-0.11 | √ | √ | × | × | × | × | × | × | × |
release-0.12 | × | √ | √ | × | × | × | × | × | × |
release-0.13 | × | × | × | √ | √ | √ | × | × | × |
release-0.14 | × | × | × | √ | √ | √ | √ | √ | √ |
main | × | × | × | × | √ | √ | √ | √ | √ |
5.4.1.2 下载kube-prometheus
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
# 查看当前有哪些分支
git branch -r
# 切换到自己 Kubernetes 兼容的版本
git checkout release-0.14
# 下载prometheus
rm -rf kube-prometheus
git clone -b release-0.14 https://github.com/prometheus-operator/kube-prometheus.git
5.4.1.3 安装operator和kube-prometheus
# 创建namespace和crd资源
kubectl apply --server-side -f manifests/setup
kubectl wait \
--for condition=Established \
--all CustomResourceDefinition \
--namespace=monitoring
# 创建应用资源
kubectl apply -f manifests/
# 等待所有资源变为Running状态
kubectl -n monitoring get pod
5.4.1.4 将prometheus暴漏出来,访问prometheus ui
- 创建prometheus-nodeport-ns.yaml
cat > k8s/prometheus/prometheus-nodeport-ns.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: prometheus-k8s-ns
namespace: monitoring
spec:
type: NodePort # 将服务类型更改为 NodePort
ports:
- name: web
port: 9090
protocol: TCP
targetPort: web
nodePort: 30090 # 指定 NodePort 端口(可选)
- name: reloader-web
port: 8080
protocol: TCP
targetPort: reloader-web
nodePort: 30080 # 指定 NodePort 端口(可选)
selector:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
EOF
# 应用资源
kubectl create -f k8s/prometheus/prometheus-nodeport-ns.yaml
报错处理:
- 在release-0.11版本之后新增了NetworkPolicy;
- 默认是允许自己访问,如果了解NetworkPolicy可以修改一下默认的规则,可以用kubectl -n monitoring get networkpolicies查看规则;
- 如果不修改,则会影响到修改NodePort类型也无法访问;
- 如果不会Networkpolicy可以直接删除就行,此处我直接删除掉了;
kubectl -n monitoring delete networkpolicies prometheus-k8s
清理kube-prometheus的办法(注意:此步不是卸载的时候无需执行)
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup