目录
[一、基于 Kubernetes 的 Prometheus 监控方案概述](#一、基于 Kubernetes 的 Prometheus 监控方案概述)
[1. 核心组件及功能](#1. 核心组件及功能)
[2. 监控流程详解](#2. 监控流程详解)
[3. 关键监控指标说明](#3. 关键监控指标说明)
[二、Prometheus 与相关组件部署](#二、Prometheus 与相关组件部署)
[1. 克隆项目代码](#1. 克隆项目代码)
[2. 安装 Prometheus Operator](#2. 安装 Prometheus Operator)
[3. 安装 Prometheus Stack](#3. 安装 Prometheus Stack)
[4. 查看容器运行状态](#4. 查看容器运行状态)
[三、ServiceMonitor 配置与应用](#三、ServiceMonitor 配置与应用)
[1. ServiceMonitor 作用与查看](#1. ServiceMonitor 作用与查看)
[2. ServiceMonitor 工作原理](#2. ServiceMonitor 工作原理)
[四、Grafana 配置与访问](#四、Grafana 配置与访问)
[1. 修改 Grafana Service 类型](#1. 修改 Grafana Service 类型)
[2. 访问 Grafana 并配置数据源](#2. 访问 Grafana 并配置数据源)
[3. 导入监控模板](#3. 导入监控模板)
[五、Prometheus 访问配置](#五、Prometheus 访问配置)
[1. 修改 Prometheus Service 类型](#1. 修改 Prometheus Service 类型)
[2. 访问 Prometheus 并查看监控目标](#2. 访问 Prometheus 并查看监控目标)
[六、监控 MySQL 数据库](#六、监控 MySQL 数据库)
[1. 部署 MySQL](#1. 部署 MySQL)
[2. 部署 MySQL Exporter](#2. 部署 MySQL Exporter)
[3. 配置 ServiceMonitor 监控 MySQL](#3. 配置 ServiceMonitor 监控 MySQL)
[4. 在 Grafana 中添加 MySQL 监控模板](#4. 在 Grafana 中添加 MySQL 监控模板)
[1. 部署 DingTalk 组件](#1. 部署 DingTalk 组件)
[2. 修改 DingTalk 配置文件](#2. 修改 DingTalk 配置文件)
[3. 启动 DingTalk 服务](#3. 启动 DingTalk 服务)
[4. 配置 Alertmanager 对接 DingTalk](#4. 配置 Alertmanager 对接 DingTalk)
[5. 测试钉钉报警](#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 - exporter
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
k8s - app: mysql - exporter
template:
metadata:
labels:
k8s - app: mysql - exporter
spec:
containers:
- name: mysql - exporter
image: registry.cn - beijing.aliyuncs.com/dotbalo/mysqld - exporter
env:
- name: DATA_SOURCE_NAME
value: "exporter:exporter@(mysql.default:3306)/" # 数据库连接信息,格式为用户名:密码@(服务名:端口)/
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9104 # exporter暴露指标的端口
---
apiVersion: v1
kind: Service
metadata:
name: mysql - exporter
namespace: monitoring
labels:
k8s - app: mysql - exporter
spec:
type: ClusterIP
selector:
k8s - app: mysql - exporter
ports:
- name: api
port: 9104
protocol: 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 - exporter
namespace: monitoring
labels:
k8s - app: mysql - exporter
spec:
jobLabel: k8s - app
endpoints:
- port: api # 对应Service中定义的端口名
interval: 30s # 抓取间隔
scheme: http
selector:
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_token
secret: 你的机器人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: 5m
inhibit_rules:
- equal:
- namespace
- alertname
source_matchers:
- severity = critical
target_matchers:
- severity =~ info
- equal:
- namespace
- alertname
source_matchers:
- severity = info
target_matchers:
- severity = info
receivers:
- name: webhook
webhook_configs:
- url: http://192.168.207.137:8060/dingtalk/webhook2/send # DingTalk服务地址
send_resolved: true
route:
group_by:
- namespace
group_interval: 50s
group_wait: 30s
receiver: webhook
repeat_interval: 1h
routes:
- matchers:
- alertname = Watchdog
receiver: webhook
- matchers:
- severity = critical
receiver: webhook
- matchers:
- alertname = TargetDown
receiver: 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 集群及应用的运行状态,及时发现并预警潜在问题,为云原生应用的稳定运行提供有力保障。在实际应用中,可根据具体需求调整监控指标和报警阈值,进一步优化监控策略。