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 需要被抓取。

Prometheus Operator 与 Rook Ceph 集成架构 Kubernetes 集群 Prometheus Operator 管理 Prometheus 实例 Prometheus 实例 抓取 / 存储 / 告警 ServiceMonitor 声明式抓取配置 创建/管理 发现目标 Rook Operator 管理 Ceph 集群 Ceph 监控端点 端口 9283 / 8080 Ceph 服务 mgr / mon / osd 说明:ServiceMonitor 通过 labelSelector 匹配 Ceph 相关 Service,Prometheus Operator 自动生成抓取配置。 无需手动编辑 Prometheus 配置文件,实现“配置即代码”。

3.2 部署 Prometheus Operator

推荐使用 kube-prometheus-stack Helm Chart 进行部署,该 Chart 集成了 Prometheus Operator、Prometheus、Alertmanager 以及 Grafana。以下是部署步骤:

  1. 添加 Helm 仓库:helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  2. 更新仓库:helm repo update
  3. 创建命名空间:kubectl create namespace monitoring
  4. 安装 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 以限制监控范围。
ServiceMonitor 与 Ceph 组件匹配关系 ServiceMonitor matchLabels: app: rook-ceph-mgr matchLabels: app: rook-ceph-osd matchLabels: app: rook-ceph-mon rook-ceph-mgr 端口 9283 rook-ceph-osd 端口 8080 rook-ceph-mon 端口 8080 匹配逻辑 1. ServiceMonitor 定义 标签选择器 2. 在指定命名空间 内查找匹配 Service 3. 自动生成抓取目标 4. 无需手动配置

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 仪表盘,并对关键指标进行告警规则配置。