第 15/15 天 — 系列收官篇
经过前 14 天的持续实战,我们已经在 Ceph RBD/FS 持久化存储之上,成功部署了 MySQL、Redis(Cluster + Sentinel)、MinIO、MongoDB、Nacos、Zookeeper、Elasticsearch、Kafka、GitLab、ClickHouse 等十余种核心中间件。然而,”部署只是起点,运维才是关键”——没有统一的全景监控体系,再健壮的集群也如同盲飞。本篇作为系列收官之作,将系统性地在 K8s 上部署 Prometheus + Grafana + Alertmanager 全栈监控,并打通前 14 天所有中间件的指标采集链路,构建一套覆盖”存储层 → K8s 层 → 中间件层”的三维立体监控与巡检体系。

一、设计架构:三维立体监控体系
1.1 整体拓扑
本套监控体系采用业界成熟的 kube-prometheus-stack(原 Prometheus Operator)方案,架构分为三个层次:
| 层级 | 组件 | 职责 | 数据来源 |
|---|---|---|---|
| 存储层 | Ceph CSI + StorageClass | 为 Prometheus/Grafana 提供持久化卷 | Ceph RBD Pool |
| K8s 基础层 | node-exporter、kube-state-metrics | 节点资源 & K8s 对象状态 | DaemonSet / Deployment |
| 中间件层 | 各 Exporter / JMX Agent | 采集 MySQL/Redis/Mongo/Kafka/ES 等指标 | ServiceMonitor |
1.2 数据流向
中间件 Exporter ─┐
node-exporter ───┤──→ Prometheus Server ──→ Alertmanager ──→ 钉钉/邮件
kube-state-metrics┘ │
└──→ Grafana Dashboard(可视化展示)
│
Ceph RBD PVC(持久化 TSDB + Dashboard 配置)
1.3 高可用与存储规划
- Prometheus:双副本 + Thanos 或单副本 + Ceph RBD 持久化(本篇采用单副本 + 30 天数据保留)
- Grafana:单副本 + Ceph RBD 持久化(Dashboard 配置不丢失)
- Alertmanager:双副本集群模式(告警高可用)
- StorageClass:复用第 2 天创建的
ceph-rbd-sc,确保监控数据落盘 Ceph 分布式存储
二、部署实战:kube-prometheus-stack
2.1 添加 Helm 仓库
# 添加 Prometheus Community 官方 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 查看可用版本
helm search repo prometheus-community/kube-prometheus-stack –versions | head -10
2.2 编写 values.yaml 自定义配置
核心要点:将 Prometheus 和 Grafana 的 storageClass 指向 Ceph RBD,确保监控数据持久化。
# monitoring-values.yaml
# === Prometheus 配置 ===
prometheus:
prometheusSpec:
retention: 30d
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: ceph-rbd-sc # 指向第 2 天创建的 Ceph RBD StorageClass
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
# 启用 ServiceMonitor 自动发现,覆盖所有带 monitoring 标签的 Service
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
# === Grafana 配置 ===
grafana:
adminPassword: "Grafana@2026#Secure"
persistence:
enabled: true
storageClassName: ceph-rbd-sc # Grafana Dashboard 持久化到 Ceph
accessModes: ["ReadWriteOnce"]
size: 10Gi
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
# 预装常用 Dashboard
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
– name: 'default'
orgId: 1
folder: 'Middleware'
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboards/default
# === Alertmanager 配置 ===
alertmanager:
alertmanagerSpec:
storage:
volumeClaimTemplate:
spec:
storageClassName: ceph-rbd-sc
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
# === node-exporter ===
nodeExporter:
enabled: true
# === kube-state-metrics ===
kubeStateMetrics:
enabled: true
2.3 Helm Install 部署
# 创建监控命名空间
kubectl create namespace monitoring
# 部署 kube-prometheus-stack
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack
–namespace monitoring
–version 65.x.x
-f monitoring-values.yaml
# 等待所有 Pod 就绪
kubectl get pods -n monitoring -w
2.4 验证 Pod / Service / PVC 状态
# 查看 Pod 状态(全部应为 Running)
kubectl get pods -n monitoring
# 查看 Service
kubectl get svc -n monitoring
# 查看 PVC — 确认已绑定 Ceph RBD 卷
kubectl get pvc -n monitoring
# 预期输出示例:
# NAME STATUS VOLUME CAPACITY STORAGECLASS
# kube-prometheus-stack-grafana Bound pvc-xxxxx-ceph-rbd 10Gi ceph-rbd-sc
# kube-prometheus-stack-prometheus Bound pvc-yyyyy-ceph-rbd 50Gi ceph-rbd-sc
# kube-prometheus-stack-alertmanager Bound pvc-zzzzz-ceph-rbd 5Gi ceph-rbd-sc

三、中间件指标接入:ServiceMonitor 全景对接
kube-prometheus-stack 默认已采集 K8s 节点和集群指标。接下来需要把前 14 天部署的各中间件指标接入 Prometheus。核心机制是 ServiceMonitor CRD——只要定义 ServiceMonitor,Prometheus Operator 会自动发现并开始抓取。
3.1 中间件 Exporter 接入清单
| 中间件 | 系列天数 | 指标端点 | 采集方式 |
|---|---|---|---|
| MySQL | 第 4 天 | mysqld-exporter:9104/metrics | ServiceMonitor |
| Redis Cluster | 第 5 天 | redis-exporter:9121/metrics | ServiceMonitor |
| Redis Sentinel | 第 6 天 | redis-exporter:9121/metrics | ServiceMonitor |
| MinIO | 第 7 天 | minio:9000/minio/v2/metrics | 内置 Prometheus 格式 |
| MongoDB | 第 8 天 | mongodb-exporter:9216/metrics | ServiceMonitor |
| Nacos | 第 9 天 | nacos:8848/nacos/actuator/prometheus | Spring Boot Actuator |
| Zookeeper | 第 10 天 | zookeeper-metrics:9141/metrics | ServiceMonitor |
| Elasticsearch | 第 11 天 | es-exporter:9114/metrics | ServiceMonitor |
| Kafka | 第 12 天 | kafka-jmx-exporter:5556/metrics | JMX Exporter |
| GitLab | 第 13 天 | gitlab-webservice:8080/metrics | 内置 |
| ClickHouse | 第 14 天 | clickhouse:9362/metrics | 内置 Prometheus 端点 |
3.2 示例:MySQL ServiceMonitor
# mysql-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mysql-monitor
namespace: database
labels:
release: kube-prometheus-stack # 必须匹配 Helm release 名称
spec:
selector:
matchLabels:
app.kubernetes.io/name: mysql
endpoints:
– port: metrics # MySQL exporter 暴露的端口名
interval: 30s
scrapeTimeout: 10s
path: /metrics
3.3 示例:ClickHouse ServiceMonitor(内置指标端点)
ClickHouse 原生支持 Prometheus 格式指标,无需额外部署 Exporter:
# clickhouse-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: clickhouse-monitor
namespace: database
labels:
release: kube-prometheus-stack
spec:
selector:
matchLabels:
app.kubernetes.io/name: clickhouse
endpoints:
– port: http
interval: 15s
path: /metrics
# ClickHouse Prometheus 端点默认在 9362 端口
# 如使用 HTTPS 则需要配置 scheme: https + tlsConfig
3.4 批量应用所有 ServiceMonitor
# 应用所有中间件的 ServiceMonitor(假设已提前编写到统一目录)
kubectl apply -f ./servicemonitors/
# 验证 ServiceMonitor 已被 Prometheus 识别
kubectl get servicemonitor -A
# 查看 Prometheus 采集目标
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090 &
curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | grep '"health"'
四、Grafana Dashboard 配置
4.1 访问 Grafana
# 端口转发访问 Grafana
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80 &
# 浏览器访问 http://localhost:3000
# 用户名: admin
# 密码: Grafana@2026#Secure(在 values.yaml 中设置的)
4.2 导入社区 Dashboard
Grafana 社区有大量现成的中间件 Dashboard 模板,直接导入即可使用:
| Dashboard 模板 ID | 适用中间件 | 说明 |
|---|---|---|
| 7362 | MySQL | MySQL Overview |
| 763 | Redis | Redis Dashboard |
| 12039 | MongoDB | MongoDB Metrics |
| 7352 | Elasticsearch | ES Cluster |
| 11962 | Kafka | Kafka Topics |
| 13562 | ClickHouse | ClickHouse Metrics |
| 11378 | MinIO | MinIO Dashboard |
| 315 | Node Exporter | 节点资源全景 |
在 Grafana 界面中:Dashboards → Import → 输入模板 ID → Load → 选择 Prometheus 数据源 → Import
4.3 Ceph 存储层监控
Ceph 集群自身也需纳入监控。通过 Ceph Manager 内置的 Prometheus 模块对外暴露指标:
# 在 Ceph 管理节点启用 Prometheus 模块
ceph mgr module enable prometheus
# 验证指标端点(默认 9283 端口)
curl -s http://<ceph-mgr-ip>:9283/metrics | head -20
# 在 Grafana 中导入 Ceph Dashboard(模板 ID: 2842 / 7330)
五、登录验证
5.1 Prometheus 查询验证
# 端口转发到 Prometheus
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090 &
# 验证所有 Target 健康状态
curl -s http://localhost:9090/api/v1/targets |
python3 -c "
import sys, json
data = json.load(sys.stdin)
up = sum(1 for t in data['data']['activeTargets'] if t['health']=='up')
total = len(data['data']['activeTargets'])
print(f'Active Targets: {up}/{total} UP')
for t in data['data']['activeTargets']:
status = '✅' if t['health']=='up' else '❌'
print(f'{status} {t["labels"].get("job","unknown")} → {t["scrapeUrl"]}')
"
# 常用 PromQL 查询示例
# 查询 Pod CPU 使用率
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod)' | python3 -m json.tool
5.2 Grafana 验证
# 检查 Grafana Pod 状态
kubectl get pod -n monitoring -l app.kubernetes.io/name=grafana
# 检查 Grafana 数据源配置
kubectl exec -n monitoring deployment/kube-prometheus-stack-grafana —
curl -s -u admin:'Grafana@2026#Secure' http://localhost:3000/api/datasources | python3 -m json.tool
# 检查 PVC 持久化是否生效(Grafana Dashboard 存储在 Ceph RBD 上)
kubectl get pvc -n monitoring -l app.kubernetes.io/name=grafana
六、日常巡检命令
6.1 监控组件健康巡检
# === 每日巡检脚本 monitoring-daily-check.sh ===
#!/bin/bash
NS=monitoring
echo "===== K8s 中间件监控每日巡检 ====="
echo "[$(date)] 巡检开始"
echo ""
echo "— 1. 监控命名空间 Pod 状态 —"
kubectl get pods -n $NS –no-headers |
awk '{print $1, $3, $4}' | column -t
echo ""
echo "— 2. PVC 绑定状态(Ceph RBD 持久化) —"
kubectl get pvc -n $NS –no-headers |
awk '{print $1, $2, $4}' | column -t
echo ""
echo "— 3. Prometheus 采集目标统计 —"
kubectl exec -n $NS prometheus-kube-prometheus-stack-prometheus-0 —
curl -s http://localhost:9090/api/v1/targets |
python3 -c "
import sys, json
data = json.load(sys.stdin)
targets = data['data']['activeTargets']
up = [t for t in targets if t['health']=='up']
down = [t for t in targets if t['health']!='up']
print(f'UP: {len(up)}/{len(targets)}')
if down:
print('DOWN targets:')
for t in down:
print(f' ❌ {t["labels"].get("job")}: {t["lastError"]}')
"
echo ""
echo "— 4. Alertmanager 告警统计 —"
kubectl exec -n $NS alertmanager-kube-prometheus-stack-alertmanager-0 —
amtool –alertmanager.url=http://localhost:9093 alert query 2>/dev/null | head -20
echo ""
echo "— 5. Ceph 存储池容量 —"
kubectl exec -n $NS prometheus-kube-prometheus-stack-prometheus-0 —
curl -s 'http://localhost:9090/api/v1/query?query=ceph_cluster_available_bytes' |
python3 -m json.tool 2>/dev/null || echo "Ceph 指标未接入"
echo ""
echo "[$(date)] 巡检结束"
6.2 中间件指标巡检
# 查询各中间件关键指标(通过 PromQL)
# MySQL 连接数
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=mysql_global_status_threads_connected'
# Redis 内存使用
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=redis_memory_used_bytes'
# MongoDB 连接数
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=mongodb_connections'
# Kafka 消息滞后
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=kafka_consumergroup_lag'
# ClickHouse 查询数
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=clickhouse_query_count'
# Elasticsearch 集群健康状态
curl -s -G http://localhost:9090/api/v1/query
–data-urlencode 'query=elasticsearch_cluster_health_status'
6.3 告警规则巡检
# 查看已配置的告警规则
kubectl exec -n $NS prometheus-kube-prometheus-stack-prometheus-0 —
curl -s http://localhost:9090/api/v1/rules |
python3 -c "
import sys, json
data = json.load(sys.stdin)
groups = data['data']['groups']
total = 0
firing = 0
for g in groups:
for r in g['rules']:
total += 1
if r.get('state') == 'firing':
firing += 1
print(f'🔥 FIRING: {r["name"]}')
print(f'nTotal rules: {total}, Firing: {firing}')
"
七、常见问题
Q1: ServiceMonitor 已创建但 Prometheus 不抓取怎么办?
A: 排查步骤:①确认 ServiceMonitor 的 labels.release 与 Helm release 名称一致(默认 kube-prometheus-stack);②确认对应的 Service 存在且端口名称与 ServiceMonitor 中 port 字段匹配;③检查 prometheusSpec.serviceMonitorSelectorNilUsesHelmValues 是否设为 false(否则只匹配带特定标签的 ServiceMonitor);④查看 Prometheus Pod 日志中的报错信息。
Q2: Grafana 重启后 Dashboard 丢失?
A: 根因是 Grafana 未启用持久化或 PVC 未绑定到 Ceph RBD。检查 values.yaml 中 grafana.persistence.enabled: true 且 storageClassName: ceph-rbd-sc。可通过 kubectl get pvc -n monitoring -l app.kubernetes.io/name=grafana 确认 PVC 状态为 Bound。如果 Dashboard 通过 UI 手动创建,建议同时通过 dashboardProviders ConfigMap 以代码方式管理,实现 GitOps 版本化。
Q3: Prometheus 存储空间快速增长怎么办?
A: 三管齐下:①调整 retention 策略(如从 30d 降到 15d);②增大 scrapeInterval(非关键指标从 15s 调到 60s);③对高基数指标使用 metric_relabel_configs 进行过滤丢弃。长期方案可引入 Thanos 或 VictoriaMetrics 实现长期存储和降采样。
八、总结
作为「Ceph+K8s 中间件实战」系列的收官之作,本篇完成了从”单点部署”到”全景运维”的最后一块拼图:
- 部署层面:通过
kube-prometheus-stackHelm Chart 一键部署 Prometheus + Grafana + Alertmanager 全栈,所有持久化数据落盘 Ceph RBD - 接入层面:通过 ServiceMonitor CRD 统一对接前 14 天所有中间件的指标采集,实现零代码侵入式监控
- 可视化层面:通过 Grafana 社区 Dashboard 模板快速构建中间件可视化看板
- 巡检层面:提供每日巡检脚本 + PromQL 查询命令,覆盖组件健康、采集状态、告警触发、存储容量四大维度
至此,”Ceph 分布式存储 → K8s 存储体系 → 中间件部署 → 统一监控”的完整闭环已经打通。
九、系列完结致辞
15 天的系列之旅到此圆满结束。从第 1 天的 Ceph 存储体系回顾,到第 2-3 天的 RBD/CephFS 接入 K8s,再到第 4-14 天的十余种中间件逐一部署实战,最后到今天的统一监控收口——我们构建了一套完整的”Ceph + K8s 中间件平台”运维体系。感谢每一位坚持跟读到这里的读者,希望本系列能为您的云原生中间件运维实践提供切实可用的参考。
十、系列目录
- ✅ 第 1 天:Ceph 分布式存储回顾与 K8s 存储体系概述
- ✅ 第 2 天:K8s 接入 Ceph RBD 块存储(CSI Driver + StorageClass 配置实战)
- ✅ 第 3 天:K8s 接入 CephFS 共享文件存储(多读场景与性能调优)
- ✅ 第 4 天:K8s 部署 MySQL 高可用集群(Ceph RBD 持久化 + 架构设计 + 登录巡检)
- ✅ 第 5 天:K8s 部署 Redis Cluster 集群(Ceph RBD + 架构设计 + 巡检命令)
- ✅ 第 6 天:K8s 部署 Redis Sentinel 哨兵模式(高可用架构 + 登录验证)
- ✅ 第 7 天:K8s 部署 MinIO 对象存储集群(分布式架构 + 运维巡检)
- ✅ 第 8 天:K8s 部署 MongoDB 副本集集群(Ceph RBD + 架构设计 + 登录)
- ✅ 第 9 天:K8s 部署 Nacos 注册配置中心(集群架构 + 登录巡检)
- ✅ 第 10 天:K8s 部署 Zookeeper 集群(分布式协调架构 + 运维命令)
- ✅ 第 11 天:K8s 部署 Elasticsearch 集群(Ceph RBD + 架构设计 + 巡检)
- ✅ 第 12 天:K8s 部署 Kafka 集群(Ceph RBD + 消息队列架构 + 运维)
- ✅ 第 13 天:K8s 部署 GitLab 代码托管平台(Ceph RBD 持久化 + 架构 + 巡检)
- ✅ 第 14 天:K8s 部署 ClickHouse 列式数据库集群(Ceph RBD + 架构设计)
- 📌 第 15 天:K8s 中间件统一监控与运维巡检总结(Prometheus + Grafana 全景) ← 本文(系列完结)


















暂无评论内容