3. Prometheus Operator 集成:在 Rook 集群中部署 Prometheus Operator 并配置 ServiceMonitor 抓取 Ceph 指标
在生产环境中,手动管理 Prometheus 配置(如 prometheus.yml 中的 scrape_configs)会随着集群规模增长而变得难以维护。Prometheus Operator 通过 Kubernetes 原生声明式 API 解决了这一问题。本章将演示如何在 Rook 集群中部署 Prometheus Operator,并利用 ServiceMonitor 自定义资源自动发现并抓取 Ceph 的监控指标。
3.1 架构概览:Prometheus Operator 与 Rook 的集成模型
在集成方案中,Prometheus Operator 充当控制平面,负责管理 Prometheus 实例的生命周期。Rook 集群则通过暴露标准的 metrics 端口(通常为 9283 或 8080)提供 Ceph 指标。ServiceMonitor 作为桥梁,告诉 Operator 哪些 Service 需要被抓取。
3.2 部署 Prometheus Operator
推荐使用 kube-prometheus-stack Helm Chart 进行部署,该 Chart 集成了 Prometheus Operator、Prometheus、Alertmanager 以及 Grafana。以下是部署步骤:
- 添加 Helm 仓库:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts - 更新仓库:
helm repo update - 创建命名空间:
kubectl create namespace monitoring - 安装 kube-prometheus-stack:
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
serviceMonitorSelectorNilUsesHelmValues=false 允许 Prometheus 实例发现所有命名空间下的 ServiceMonitor,而不仅限于 Helm 标签匹配的。对于跨命名空间监控 Rook 集群至关重要。
3.3 配置 ServiceMonitor 抓取 Ceph 指标
Rook 部署 Ceph 集群后,会在 rook-ceph 命名空间下创建多个 Service。我们需要为 Ceph 的 mgr 服务创建一个 ServiceMonitor,该服务暴露了 Prometheus 格式的指标。
首先,确认 Ceph mgr 服务的名称和标签:
kubectl get svc -n rook-ceph -l app=rook-ceph-mgr
# 输出示例:
# NAME TYPE CLUSTER-IP PORT(S) AGE
# rook-ceph-mgr ClusterIP 10.96.100.50 9283/TCP 2d
然后,创建 ServiceMonitor 资源:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rook-ceph-mgr
namespace: monitoring
labels:
release: prometheus-stack # 必须与 Prometheus 实例的 serviceMonitorSelector 匹配
spec:
selector:
matchLabels:
app: rook-ceph-mgr # 匹配 rook-ceph 命名空间下的 mgr 服务
namespaceSelector:
matchNames:
- rook-ceph # 限定只监控 rook-ceph 命名空间
endpoints:
- port: http-metrics # 端口名称,对应 Service 中的 port name
interval: 15s
path: /metrics
- 标签匹配失败:ServiceMonitor 的
metadata.labels必须包含 Prometheus 实例serviceMonitorSelector中定义的标签(通常是release: prometheus-stack)。 - 端口名称错误:Ceph mgr 的 Service 端口名称可能为
http-metrics或metrics,请使用kubectl describe svc rook-ceph-mgr -n rook-ceph确认。
3.4 验证抓取是否成功
部署完成后,可以通过以下方式验证 Prometheus 是否成功抓取到 Ceph 指标:
| 验证方法 | 命令 / 操作 | 预期结果 |
|---|---|---|
| 检查 Prometheus Target 页面 | kubectl port-forward svc/prometheus-stack-prometheus -n monitoring 9090:9090访问 http://localhost:9090/targets |
看到 rook-ceph-mgr/0 状态为 UP |
| 查询 Ceph 指标 | 在 Prometheus UI 的 Graph 页面输入 ceph_health_status |
返回数值结果(如 1 表示 HEALTH_OK) |
| 查看 ServiceMonitor 状态 | kubectl get servicemonitor -n monitoring rook-ceph-mgr -o yaml |
资源已创建,无错误事件 |
3.5 扩展:抓取所有 Ceph 组件指标
除了 mgr,Rook 还暴露了其他组件的指标。建议为以下组件分别创建 ServiceMonitor:
- rook-ceph-mgr:集群级指标(池状态、PG 数量、健康状态)。
- rook-ceph-mon:Monitor 指标(选举、仲裁状态)。
- rook-ceph-osd:OSD 指标(I/O 延迟、空间使用率)。
以下是一个为 OSD 创建 ServiceMonitor 的示例:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rook-ceph-osd
namespace: monitoring
labels:
release: prometheus-stack
spec:
selector:
matchLabels:
app: rook-ceph-osd
namespaceSelector:
matchNames:
- rook-ceph
endpoints:
- port: metrics
interval: 30s
path: /metrics
使用
namespaceSelector.any: true 可以监控所有命名空间下的匹配服务,但出于安全考虑,建议显式指定 matchNames 以限制监控范围。
3.6 配置总结与检查清单
完成集成后,请对照以下清单确认配置无误:
| 检查项 | 状态 | 验证命令 |
|---|---|---|
| Prometheus Operator Pod 运行中 | ✅ | kubectl get pods -n monitoring -l app.kubernetes.io/name=prometheus-operator |
| Prometheus 实例运行中 | ✅ | kubectl get pods -n monitoring -l app.kubernetes.io/name=prometheus |
| ServiceMonitor 已创建 | ✅ | kubectl get servicemonitor -n monitoring |
| Target 状态为 UP | ✅ | Prometheus UI → Targets |
| Ceph 指标可查询 | ✅ | ceph_health_status 返回数值 |
至此,Prometheus Operator 已成功集成到 Rook 集群中,并开始自动抓取 Ceph 的监控指标。下一阶段将基于这些指标构建 Grafana 仪表盘,并对关键指标进行告警规则配置。