Prometheus 监控平台部署 (云原生环境)
目录
简介
一、基于 Kubernetes 的 Prometheus 监控方案概述
1. 核心组件及功能
2. 监控流程详解
3. 关键监控指标说明
二、Prometheus 与相关组件部署
1. 克隆项目代码
2. 安装 Prometheus Operator
3. 安装 Prometheus Stack
4. 查看容器运行状态
三、ServiceMonitor 配置与应用
1. ServiceMonitor 作用与查看
2. ServiceMonitor 工作原理
四、Grafana 配置与访问
1. 修改 Grafana Service 类型
2. 访问 Grafana 并配置数据源
3. 导入监控模板
五、Prometheus 访问配置
1. 修改 Prometheus Service 类型
2. 访问 Prometheus 并查看监控目标
六、监控 MySQL 数据库
1. 部署 MySQL
2. 部署 MySQL Exporter
3. 配置 ServiceMonitor 监控 MySQL
4. 在 Grafana 中添加 MySQL 监控模板
七、对接钉钉报警
1. 部署 DingTalk 组件
2. 修改 DingTalk 配置文件
3. 启动 DingTalk 服务
4. 配置 Alertmanager 对接 DingTalk
5. 测试钉钉报警
总结
简介
在传统架构中,Zabbix、Nagios 等监控工具占据主流,但面对 Kubernetes 这类云原生平台,它们在容器集群监控方面显得力不从心。本文将介绍基于 Kubernetes 的 Prometheus 监控方案,从环境部署到实际应用,带您一步步搭建完整的企业级监控体系,包括 Prometheus 与 Grafana 部署、服务监控配置、MySQL 监控集成以及钉钉报警对接等核心功能。
一、基于 Kubernetes 的 Prometheus 监控方案概述
1. 核心组件及功能
在 Kubernetes 监控中,node - exporter + Prometheus + Grafana 组成的组合被广泛采用,各组件功能如下:
- node - exporter:节点级指标导出工具,可采集节点的 CPU、内存、磁盘、网络等关键指标,并通过 Metrics 接口暴露数据,为监控提供基础数据来源。
- Prometheus:集时间序列数据库与监控报警功能于一身,能够主动抓取 Cadvisor 和 node - exporter 暴露的 Metrics 接口数据,将容器和节点的时序数据存储起来,同时提供强大的 PromQL 查询语言用于监控分析和报警设置。
- Grafana:专业的图表和 Dashboard 工具,可将 Prometheus 作为数据源,通过编写 PromQL 查询语句,以直观的图表形式展示 K8S 集群的 CPU 使用率、内存使用率、网络流量等监控指标。
2. 监控流程详解
Kubernetes 集群的监控流程清晰且有序,主要分为以下步骤:
- 数据采集层部署:在 Kubernetes 集群的每个节点上安装 Cadvisor 和 node - exporter,其中 Cadvisor 负责容器级指标采集,node - exporter 负责节点级指标采集。
- 数据存储与处理:部署 Prometheus,通过配置使其能够抓取 Cadvisor 和 node - exporter 的 Metrics 接口数据,将容器(containers)和节点(nodes)的时序数据妥善存储。
- 可视化展示:利用 Grafana 构建监控仪表盘,选择 Prometheus 作为数据源,通过编写 PromQL 查询语句,直观展示 K8S 集群的各类监控指标。
- 报警机制设置:根据监控需求设置 Prometheus 报警规则,当监控指标超过设定阈值时,及时发送报警信息,保障集群稳定运行。
在实际部署中,node - exporter 以 DaemonSet 形式运行,确保每个节点都能被监控;Prometheus 通过部署 Prometheus Operator 以 Deployment 形式运行,实现 Metrics 抓取和报警功能;Grafana 则通过部署 Grafana Operator 实现仪表盘展示。
3. 关键监控指标说明
Kubernetes 集群的监控指标众多,涵盖集群运行状态的各个方面,主要包括:
- 资源利用率指标:CPU 利用率(节点、Pod、容器级别)、内存利用率(节点、Pod、容器级别)、网络流量(节点、Pod、容器的收发包大小和带宽利用率)、磁盘使用率(节点磁盘空间使用情况)。
- 组件状态指标:Pod 状态(Running、Waiting、Succeeded、Failed 等状态数量)、节点状态(Ready、NotReady 和 Unreachable 状态数量)、容器重启次数(单个容器或 Pod 内所有容器的重启次数)。
- 核心组件性能指标:API 服务指标(Kubernetes API Server 的请求 LATENCY、请求 QPS、错误码数量等)、集群组件指标(etcd、kubelet、kube - proxy 等组件的运行指标)。
基于这些指标可设置相应报警规则,例如 CPU 利用率超过 80% 报警、内存利用率超过 90% 报警、Pod / 节点 NotReady 状态超过 10% 报警、API Server 请求 LATENCY 超过 200ms 报警等,具体阈值需根据集群大小和服务负载评估确定。
二、Prometheus 与相关组件部署
1. 克隆项目代码
首先需要从 Github 克隆 kube - prometheus 项目的指定分支,命令如下:
[root@k8s - master ~]# git clone -b release - 0.10 https://github.com/prometheus - operator/kube - prometheus.git
命令解释:git clone
用于克隆远程仓库代码,-b release - 0.10
指定克隆的分支为 release - 0.10,该分支包含了适配当前部署需求的稳定版本代码。
2. 安装 Prometheus Operator
Prometheus Operator 是 CoreOS 开源项目,提供了 Kubernetes 原生方式运行和管理 Prometheus 的能力,能自动创建、配置和管理 Prometheus 实例,并与 Kubernetes 服务发现机制集成,大幅简化部署工作量。
安装命令如下:
[root@k8s - master ~]# cd kube - prometheus/
[root@k8s - master kube - prometheus]# kubectl apply --server - side -f manifests/setup
命令解释:cd kube - prometheus/
进入克隆下来的项目目录;kubectl apply
用于应用 Kubernetes 资源配置,--server - side
特性将配置逻辑从 kubectl 移至 API 服务器,解决所有权冲突问题,-f manifests/setup
指定应用 setup 目录下的配置文件,完成 Prometheus Operator 的基础环境部署。
若需删除 Prometheus Operator,可执行以下命令:
kubectl delete --ignore - not - found=true -f manifests/setup
命令解释:kubectl delete
用于删除 Kubernetes 资源,--ignore - not - found=true
表示忽略未找到资源的错误,-f manifests/setup
指定删除 setup 目录下配置文件对应的资源。
3. 安装 Prometheus Stack
待 Operator 容器启动后,安装 Prometheus Stack,命令如下:
[root@k8s - master kube - prometheus]# kubectl apply --server - side -f manifests/
命令解释:-f manifests/
指定应用 manifests 目录下的所有配置文件,该目录包含了 Prometheus、Alertmanager、Grafana 等全套监控告警组件的配置,即 kube - prometheus - stack 全家桶。
删除 Prometheus Stack 的命令为:
kubectl delete --ignore - not - found=true -f manifests/ -f manifests/setup
4. 查看容器运行状态
安装完成后,查看监控命名空间下的 Pod 状态,确认组件是否正常运行:
[root@k8s - master ~]# kubectl get pod -n monitoring
正常情况下,会显示 alertmanager、blackbox - exporter、grafana、kube - state - metrics、node - exporter、prometheus 等组件的 Pod 处于 Running 状态,如下所示(部分示例):
NAME READY STATUS RESTARTS AGE
alertmanager - main - 0 2/2 Running 0 79m
grafana - 5fc7f9f55d - x4gv4 1/1 Running 0 87m
prometheus - k8s - 0 2/2 Running 0 79m
命令解释:kubectl get pod
用于获取 Pod 列表,-n monitoring
指定查看 monitoring 命名空间下的 Pod,通过 STATUS 列可确认 Pod 是否正常运行。
三、ServiceMonitor 配置与应用
1. ServiceMonitor 作用与查看
ServiceMonitor 用于定义如何监控一组动态服务,通过标签选择器确定需要监控的 Service,实现服务的自动发现和监控配置,无需手动重新配置。
查看已有的 ServiceMonitor:
[root@k8s - master ~]# kubectl get servicemonitors -A
执行后会列出 monitoring 命名空间下的各类 ServiceMonitor,如 alertmanager - main、coredns、grafana、kube - apiserver 等,示例如下:
NAMESPACE NAME AGE
monitoring alertmanager - main 2m9s
monitoring coredns 2m6s
monitoring grafana 2m7s
命令解释:kubectl get servicemonitors
用于获取 ServiceMonitor 列表,-A
表示查看所有命名空间下的 ServiceMonitor。
2. ServiceMonitor 工作原理
为使 Prometheus 监控 Kubernetes 内的应用,需存在 Endpoints 对象(本质是 IP 地址列表),通常由 Service 对象通过标签选择器匹配 Pod 自动填充。Prometheus Operator 的 ServiceMonitor 会发现这些 Endpoints 对象,并配置 Prometheus 监控对应的 Pod,其 spec.endpoints 部分用于配置需要抓取指标的端口。
四、Grafana 配置与访问
1. 修改 Grafana Service 类型
默认 Grafana 的 Service 类型为 ClusterIP,仅集群内部可访问,需修改为 NodePort 类型以便外部访问:
[root@k8s - master ~]# kubectl edit svc grafana -n monitoring
命令解释:kubectl edit svc
用于编辑 Service 配置,grafana
为 Service 名称,-n monitoring
指定命名空间。
在编辑界面中,将type: ClusterIP
修改为type: NodePort
,并可指定 nodePort(如 32082),修改后保存退出。
查看修改后的 Grafana Service 信息:
[root@k8s - master ~]# kubectl get svc grafana -n monitoring
输出如下:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
grafana NodePort 10.99.26.98 <none> 3000:32082/TCP 28m
命令解释:kubectl get svc
用于获取 Service 信息,可看到 TYPE 已变为 NodePort,以及映射的节点端口 32082。
2. 访问 Grafana 并配置数据源
通过以下 URL 访问 Grafana:http://<K8S集群任意节点的IP>:32082
。
默认登录账号密码为 admin/admin,首次登录会提示修改密码,可选择跳过。
Grafana 默认已配置 Prometheus 数据源,若需手动配置:
- 单击首页左侧的 “Add your first data source”。
- 选择 Prometheus 数据源。
- 在 HTTP 配置项下的 URL 填写 “http://prometheus - k8s:9090”(prometheus - k8s 为 K8s 集群内的 Service 名),点击 “Save & Test” 保存并测试。
3. 导入监控模板
导入 Node 节点监控模板步骤:
- 单击首页左侧 “+” 按钮,选择 “Import”。
- 输入模板 ID:13105,单击 “Load” 加载。
- 最后单击 “Import” 完成导入,即可在 Dashboard 查看 Node 节点监控数据。
其他常用模板可在 Grafana 官网(https://grafana.com/grafana/dashboards/)查找,如 Kubernetes Cluster(7249)、Docker and system monitoring(893)等。
五、Prometheus 访问配置
1. 修改 Prometheus Service 类型
同样将 Prometheus 的 Service 类型修改为 NodePort:
[root@k8s - master ~]# kubectl edit svc prometheus - k8s -n monitoring
在编辑界面中,将type: ClusterIP
修改为type: NodePort
,并指定 nodePort(如 9090 对应 32370)。
查看修改后的 Prometheus Service 信息:
[root@k8s - master ~]# kubectl get svc -n monitoring prometheus - k8s
输出示例:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
prometheus - k8s NodePort 10.105.187.25 <none> 9090:32370/TCP 33m
2. 访问 Prometheus 并查看监控目标
通过 URLhttp://<K8S集群任意节点的IP>:32370
访问 Prometheus。在 Prometheus 界面中,点击 “Status”->“Targets” 可查看所有监控目标的状态,确认各 ServiceMonitor 对应的目标是否正常(up 状态)。
Prometheus 告警规则有三个状态:
- inactive:未被触发。
- pending:已触发但未达到 for 设定时间。
- firing:触发且达到设定时间,会发送告警。
六、监控 MySQL 数据库
1. 部署 MySQL
在 Kubernetes 中部署 MySQL:
[root@k8s - master ~]# kubectl create deploy mysql --image=mysql:5.7.23
命令解释:kubectl create deploy
用于创建 Deployment,mysql
为 Deployment 名称,--image=mysql:5.7.23
指定使用的镜像及版本。
设置 MySQL 密码:
[root@k8s - master ~]# kubectl set env deploy/mysql MYSQL_ROOT_PASSWORD=pd123
命令解释:kubectl set env
为 Deployment 设置环境变量,deploy/mysql
指定 Deployment,MYSQL_ROOT_PASSWORD=pd123
设置 root 用户密码。
查看 MySQL Pod 状态:
[root@k8s - master ~]# kubectl get pod
输出示例:
NAME READY STATUS RESTARTS AGE
mysql - 58dd9c4df4 - 17fgd 1/1 Running 0 2m53s
创建 Service 暴露 MySQL 端口:
[root@k8s - master ~]# kubectl expose deployment mysql --type NodePort --port=3306
命令解释:kubectl expose deployment
为 Deployment 创建 Service,--type NodePort
指定 Service 类型,--port=3306
指定服务端口。
查看 MySQL Service 信息:
[root@k8s - master ~]# kubectl get svc -l app=mysql
输出示例:
NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE
mysql NodePort 10.96.116.184 <none> 3306:31152/TCP 37s
访问测试 MySQL:
[root@k8s - master ~]# dnf -y install mysql # 安装MySQL客户端
[root@k8s - master ~]# mysql -u root -ppwd123 -h 192.168.207.137 -P31152 # 连接测试,IP为K8S节点IP,端口为映射的NodePort
设置 MySQL 访问权限:
[root@k8s - master ~]# grant all on *.* to exporter@'%' identified by 'exporter';
命令解释:创建 exporter 用户并授权,允许其从任意主机(%)访问所有数据库,密码为 exporter,供 exporter 采集数据使用。
2. 部署 MySQL Exporter
创建 mysql - exporter.yaml 配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:name: mysql - exporternamespace: monitoring
spec:replicas: 1selector:matchLabels:k8s - app: mysql - exportertemplate:metadata:labels:k8s - app: mysql - exporterspec:containers:- name: mysql - exporterimage: registry.cn - beijing.aliyuncs.com/dotbalo/mysqld - exporterenv:- name: DATA_SOURCE_NAMEvalue: "exporter:exporter@(mysql.default:3306)/" # 数据库连接信息,格式为用户名:密码@(服务名:端口)/imagePullPolicy: IfNotPresentports:- containerPort: 9104 # exporter暴露指标的端口
---
apiVersion: v1
kind: Service
metadata:name: mysql - exporternamespace: monitoringlabels:k8s - app: mysql - exporter
spec:type: ClusterIPselector:k8s - app: mysql - exporterports:- name: apiport: 9104protocol: TCP
部署 MySQL Exporter:
[root@k8s - master ~]# kubectl create -f mysql - exporter.yaml
命令解释:kubectl create -f
根据配置文件创建 Deployment 和 Service 资源。
查看部署结果:
[root@k8s - master ~]# kubectl get -f mysql - exporter.yaml
测试能否获取 metrics 数据:
[root@k8s - master ~]# curl 10.109.16.46:9104/metrics | tail -n 5 # 10.109.16.46为mysql - exporter Service的ClusterIP
若能获取到指标数据,说明 Exporter 工作正常。
3. 配置 ServiceMonitor 监控 MySQL
创建 mysql - sm.yaml 配置文件:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: mysql - exporternamespace: monitoringlabels:k8s - app: mysql - exporter
spec:jobLabel: k8s - appendpoints:- port: api # 对应Service中定义的端口名interval: 30s # 抓取间隔scheme: httpselector:matchLabels:k8s - app: mysql - exporter # 匹配mysql - exporter Service的标签namespaceSelector:matchNames:- monitoring # 监控的命名空间
创建 ServiceMonitor:
[root@k8s - master ~]# kubectl create -f mysql - sm.yaml
在 Prometheus 的 “Targets” 页面中,可查看 mysql - exporter 的监控目标是否正常(up 状态)。
4. 在 Grafana 中添加 MySQL 监控模板
导入 MySQL 监控模板,模板 ID:6239,步骤同 Node 节点模板导入,完成后即可查看 MySQL 监控数据。
七、对接钉钉报警
1. 部署 DingTalk 组件
下载 Prometheus Webhook DingTalk:
wget https://github.com/timonwong/prometheus - webhook - dingtalk/releases/download/v2.0.0/prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz
解压并部署:
tar -xf prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz
mv prometheus - webhook - dingtalk - 2.0.0.linux - amd64 /usr/local/dingtalk
2. 修改 DingTalk 配置文件
进入配置目录并修改配置:
cd /usr/local/dingtalk
mv config.example.yml config.yml
vi config.yml
配置文件内容示例(关键部分):
targets:webhook1:url: https://oapi.dingtalk.com/robot/send?access_token=你的机器人access_tokensecret: 你的机器人secret(可选)# 可配置多个webhook
配置解释:url
为钉钉机器人的 Webhook 地址,需替换为实际创建的机器人地址;secret
用于签名验证,增强安全性。
3. 启动 DingTalk 服务
创建系统服务配置:
cat > /etc/systemd/system/prometheus - webhook - dingtalk.service << 'EOF'
[Unit]
Description=Prometheus Webhook DingTalk
After=network.target[Service]
User=root
Group=root
WorkingDirectory=/usr/local/dingtalk
ExecStart=/usr/local/dingtalk/prometheus - webhook - dingtalk
Restart=always
RestartSec=5
Environment="CONFIG_FILE=/usr/local/dingtalk/config.yml"[Install]
WantedBy=multi - user.target
EOF
启动服务并设置开机自启:
sudo systemctl daemon - reload
sudo systemctl start prometheus - webhook - dingtalk
sudo systemctl enable prometheus - webhook - dingtalk
查看服务状态:
sudo systemctl status prometheus - webhook - dingtalk
确认服务处于 Running 状态,同时可通过ss -n1pt | grep 8060
查看 8060 端口是否被监听(默认端口)。
4. 配置 Alertmanager 对接 DingTalk
编辑 Alertmanager 配置文件:
cd /root/kube - prometheus/manifests/
vi alertmanager - secret.yaml
修改配置文件中的 receivers 和 route 部分,示例如下:
stringData:alertmanager.yml: |global:resolve_timeout: 5minhibit_rules:- equal:- namespace- alertnamesource_matchers:- severity = criticaltarget_matchers:- severity =~ info- equal:- namespace- alertnamesource_matchers:- severity = infotarget_matchers:- severity = inforeceivers:- name: webhookwebhook_configs:- url: http://192.168.207.137:8060/dingtalk/webhook2/send # DingTalk服务地址send_resolved: trueroute:group_by:- namespacegroup_interval: 50sgroup_wait: 30sreceiver: webhookrepeat_interval: 1hroutes:- matchers:- alertname = Watchdogreceiver: webhook- matchers:- severity = criticalreceiver: webhook- matchers:- alertname = TargetDownreceiver: webhook
配置解释:receivers
定义接收者为 webhook,指定 DingTalk 服务的 URL;route
定义告警路由规则,将各类告警发送到 webhook 接收者。
应用配置:
kubectl replace -f alertmanager - secret.yaml
若配置修改后未生效,可删除后重新创建:
kubectl delete -f alertmanager - secret.yaml
kubectl create -f alertmanager - secret.yaml
修改 Alertmanager 的 Service 类型为 NodePort 以便访问:
kubectl edit svc -n monitoring alertmanager - main
查看 Alertmanager Service 信息:
kubectl get svc -n monitoring alertmanager - main
通过http://<K8S集群任意节点的IP>:<NodePort>
访问 Alertmanager 页面。
5. 测试钉钉报警
停止 MySQL 服务模拟故障:
kubectl scale deployment mysql --replicas=0
命令解释:kubectl scale deployment
用于调整 Deployment 的副本数量,--replicas=0
表示停止所有 MySQL Pod。
等待一段时间后,若报警规则触发,钉钉机器人会发送报警信息,确认报警功能正常后,可恢复 MySQL 服务:
kubectl scale deployment mysql --replicas=1
总结
本文介绍了在 Kubernetes 环境中搭建 Prometheus 企业级监控体系的流程,从核心组件部署、ServiceMonitor 配置、Grafana 可视化展示,到 MySQL 数据库监控集成以及钉钉报警对接。通过这套方案,能够监控 Kubernetes 集群及应用的运行状态,及时发现并预警潜在问题,为云原生应用的稳定运行提供有力保障。在实际应用中,可根据具体需求调整监控指标和报警阈值,进一步优化监控策略。