Ceph+K8s 中间件实战 | 第 15 天:K8s 中间件统一监控与运维巡检总结(Prometheus + Grafana 全景)

第 15/15 天 — 系列收官篇

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

K8s Logo

一、设计架构:三维立体监控体系

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

K8s Logo

三、中间件指标接入: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-stack Helm 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 中间件平台”运维体系。感谢每一位坚持跟读到这里的读者,希望本系列能为您的云原生中间件运维实践提供切实可用的参考。

十、系列目录

K8s Logo

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容