使用 Ceph RGW Exporter 监控 Ceph RGW

Alauda Storage Exporter 是一个 Operator,可从 Ceph RGW(RADOS Gateway)Admin Ops API 收集使用情况、存储桶和用户指标,并以 Prometheus 格式公开这些指标。Rook 的内置监控涵盖 Ceph 集群自身的运行状况,但不涵盖对象存储租户:每个用户存储了多少数据、一个存储桶包含多少对象,或配额是否即将耗尽。此 Operator 填补了这一空白。

安装后,Operator 会监视集群中的每个 CephObjectStore,并自动为每个对象存储部署一个 exporter,同时创建一个只读 RGW 用户和一个 ServiceMonitor。无需手动处理任何凭据。

术语

术语描述
CephRGWExporter声明一个 exporter 实例的自定义资源(ceph.alauda.io/v1alpha1)。每个实例面向一个 CephObjectStore。
Exporter查询 RGW Admin Ops API 并提供 /metrics 的 Pod。Operator 与 exporter 共享同一个容器镜像,区别仅在于启动参数不同。
CephObjectStoreUser用于配置 RGW 用户的 Rook 资源。exporter 从 Rook 为该用户创建的 Secret 中读取 RGW 端点、访问密钥和密钥。
Admin Ops APIRGW 管理 REST API(/admin/usage、/admin/bucket、/admin/user)。exporter 发出的所有请求均使用 AWS Signature V4 签名。

前提条件

  • 已安装 Alauda Storage,且至少有一个 CephObjectStore 处于 Ready 阶段。请参阅 Ceph Distributed Storage。
  • Alauda Storage Exporter Operator 软件包已在 OperatorHub 中可用。在 air-gapped 集群上,请先按照 Upload Packages 中的说明上架该软件包。
  • 若要在平台中查看指标,集群上必须安装监控插件(Prometheus 或 VictoriaMetrics)。请参阅 Monitoring Installation。不安装该插件 exporter 也可以正常工作,但不会有任何组件抓取这些指标。

工作原理

  1. Operator 监视 CephObjectStore 资源。对于它创建的每个对象存储 <store>,Operator 会在同一命名空间中创建:
    • 一个名为 rgw-exporter-user-<store> 的 CephObjectStoreUser,具有只读的 bucket、user、metadata 和 usage 功能;
    • 一个名为 rgw-exporter-<store> 的 CephRGWExporter,并添加 ceph.alauda.io/auto-created: "true" 注解。
  2. 对于每个 CephRGWExporter,Operator 会协调一个 Deployment、一个 Service(端口为 9242,名称为 http-metrics)、一个带有命名空间范围 Role 的 ServiceAccount,以及一个 ServiceMonitor,所有资源均使用 CR 的名称。
  3. exporter 启动时会解析所引用的 CephObjectStoreUser,从其 Secret 中读取 Endpoint、AccessKey 和 SecretKey,然后开始轮询 RGW Admin Ops API。Operator 本身不会读取这些密钥。
  4. 删除 CephObjectStore 后,自动创建的 CephRGWExporter 和 CephObjectStoreUser 也会随之删除。手动创建的资源不会受到影响。

操作步骤

安装 Operator

  1. 转到 Administrator。

  2. 在左侧导航栏中,单击 Marketplace > OperatorHub。

  3. 找到 Alauda Storage Exporter,然后单击 Install。选择 alpha channel,将其安装到 rook-ceph 命名空间(Rook-Ceph 运行所在的命名空间),并将升级审批设置为 Manual。有关安装对话框的详细说明,请参阅 Operator。

    或者,也可以在集群的 control plane node 上从命令行应用 Subscription。rook-ceph 命名空间中已包含由 Rook-Ceph 创建的 OperatorGroup,因此无需创建新的资源。

    cat << EOF | kubectl apply -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: ceph-rgw-exporter
      namespace: rook-ceph
    spec:
      channel: alpha
      installPlanApproval: Manual
      name: ceph-rgw-exporter
      source: platform
      sourceNamespace: cpaas-system
    EOF

    审批生成的 InstallPlan:

    ip=$(kubectl -n rook-ceph get subscription ceph-rgw-exporter -o jsonpath='{.status.installPlanRef.name}')
    kubectl -n rook-ceph patch installplan $ip --type=merge -p '{"spec":{"approved":true}}'
  4. 验证 Operator 正在运行。

    kubectl -n rook-ceph get csv | grep ceph-rgw-exporter
    kubectl -n rook-ceph get deploy ceph-rgw-exporter-operator

    预期输出:

    ceph-rgw-exporter.v1.0.3   Alauda Build of Ceph RGW Exporter   1.0.3   Succeeded
    NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
    ceph-rgw-exporter-operator   1/1     1            1           3m

验证自动发现的 exporter

Operator 启动后约一分钟内,每个 CephObjectStore 都会有一个 exporter。

  1. 列出 exporter。

    kubectl -n rook-ceph get cephrgwexporters

    预期输出(此示例中的 ceph-cluster-object 是对象存储名称):

    NAME                               PHASE     READY   ENDPOINT                                                      AGE
    rgw-exporter-ceph-cluster-object   Running   1       http://rook-ceph-rgw-ceph-cluster-object.rook-ceph.svc:7480   2m

    exporter Pod 启动期间,PHASE 为 Pending;Pod 就绪后为 Running;如果无法解析所引用的 CephObjectStoreUser 或其 Secret,则为 Failed。详细信息会记录在 status.conditions 中。

  2. 确认已为 exporter 配置的只读 RGW 用户。

    kubectl -n rook-ceph get cephobjectstoreuser rgw-exporter-user-ceph-cluster-object -o jsonpath='{.spec.capabilities}{"\n"}{.status.phase}{"\n"}'

    预期输出:

    {"bucket":"read","metadata":"read","usage":"read","user":"read"}
    Ready
  3. 确认子资源。

    kubectl -n rook-ceph get deploy,svc,servicemonitor -l app.kubernetes.io/name=ceph-rgw-exporter

验证指标

  1. 将 exporter Service 转发到本地端口,并请求指标端点。

    kubectl -n rook-ceph port-forward svc/rgw-exporter-ceph-cluster-object 9242:9242 &
    curl -s http://localhost:9242/-/ready
    curl -s http://localhost:9242/metrics | grep -v '^#' | head

    预期输出:

    ok
    radosgw_usage_ops_total{bucket="bucket_root",category="list_buckets",owner="anonymous",store="ceph-cluster-object"} 142126
    radosgw_usage_scrape_duration_seconds 0.271208467
    radosgw_usage_user_quota_enabled{store="ceph-cluster-object",user="rgw-exporter-user-ceph-cluster-object"} 0
    radosgw_usage_user_total_bytes{store="ceph-cluster-object",user="rgw-exporter-user-ceph-cluster-object"} 0
    ...

    只有对象存储中至少存在一个存储桶后,存储桶指标(radosgw_usage_bucket_*)才会显示。

  2. 如果已安装监控插件,ServiceMonitor 会被自动发现:它带有 prometheus: kube-prometheus 标签,平台使用该标签选择抓取目标,并且默认每隔 300s 抓取 http-metrics 端口。经过一个抓取间隔后,在平台的监控面板中或通过 PromQL 查询 radosgw_usage_scrape_duration_seconds,以确认数据已被摄取。有关如何使用自定义指标,请参阅 Management of Metrics。

自定义 exporter

自动创建的 CephRGWExporter 使用默认设置。当需要不同的配置时,你可以直接编辑其 spec,也可以创建自己的 CephRGWExporter(使用除 rgw-exporter-<store> 之外的任意名称)。自动发现逻辑绝不会修改或删除手动创建的资源。

cat << EOF | kubectl apply -f -
apiVersion: ceph.alauda.io/v1alpha1
kind: CephRGWExporter
metadata:
  name: <name>
  namespace: rook-ceph
spec:
  cephObjectStoreUserRef:
    name: <cephObjectStoreUser>
    namespace: rook-ceph
  store: <store>
  port: 9242
  timeout: 60
  logLevel: INFO
  tagList:
    - team
  replicas: 1
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 500m
      memory: 512Mi
  serviceMonitor:
    enabled: true
    interval: 300s
EOF

参数

参数说明
cephObjectStoreUserRef必填。exporter 使用其凭证的 CephObjectStoreUser。该用户必须至少对 bucket、user、metadata 和 usage 具有 read 权限;请参阅创建 Ceph 对象存储用户。namespace 默认为 CephRGWExporter 所在的命名空间。当用户位于其他命名空间时,Operator 会创建从该命名空间读取其 Secret 所需的 Role 和 RoleBinding。
store每个指标上的 store 标签值,也是用于 AWS Signature V4 签名的地域。请使用 CephObjectStore 名称。默认为 us-east-1。
adminEntryRGW Admin Ops API 的路径前缀。默认为 admin。仅当已在网关上自定义 rgw_admin_entry 时才需更改。
portexporter 监听的端口。Service 和探针也使用此端口。默认为 9242。
timeout向 RGW 发出的每个请求的超时时间,以秒为单位。默认为 60。对于包含大量用户或存储桶的对象存储,请增大此值。
insecure当 RGW endpoint 使用自签名证书时,跳过 TLS 证书验证。默认为 false。
logLevel可设置为 DEBUG、INFO、WARNING 或 ERROR。默认为 INFO。DEBUG 会记录发送到 RGW 的每个请求 URL。
tagList作为附加标签公开在存储桶指标上的存储桶标签键。缺失的标签会以空字符串形式发出,以确保标签集保持稳定。默认不设置。
replicas, resources, nodeSelector, tolerations, image, imagePullSecretsexporter Deployment 的标准 Pod 模板设置。image 默认为 Operator 自身的镜像。
serviceMonitorenabled(默认为 true)控制是否创建 ServiceMonitor;将其设置为 false 会删除现有资源。interval(默认为 300s)表示抓取间隔。labels 用于向 ServiceMonitor 添加额外标签。

指标参考

所有指标都带有 store 标签。使用情况指标和存储桶指标还带有 bucket 和 owner 标签,并且会为 tagList 中的每个键额外添加一个标签。

指标说明
radosgw_usage_ops_total按所有者、存储桶和类别统计的操作总数。
radosgw_usage_successful_ops_total成功操作的数量。
radosgw_usage_sent_bytes_totalRGW 发送到客户端的字节数。
radosgw_usage_received_bytes_totalRGW 从客户端接收的字节数。
radosgw_usage_bucket_bytes存储桶的大小,以字节为单位。
radosgw_usage_bucket_utilized_bytes存储桶实际使用的字节数。
radosgw_usage_bucket_objects存储桶中的对象数量。
radosgw_usage_bucket_shards存储桶的索引分片数量。
radosgw_usage_bucket_quota_enabled, radosgw_usage_bucket_quota_size, radosgw_usage_bucket_quota_size_bytes, radosgw_usage_bucket_quota_size_objects存储桶配额设置。
radosgw_usage_user_total_objects用户拥有的对象数量。
radosgw_usage_user_total_bytes用户存储的字节数。
radosgw_usage_user_quota_enabled, radosgw_usage_user_quota_size, radosgw_usage_user_quota_size_bytes, radosgw_usage_user_quota_size_objects用户配额设置。
radosgw_usage_user_bucket_quota_enabled, radosgw_usage_user_bucket_quota_size, radosgw_usage_user_bucket_quota_size_bytes, radosgw_usage_user_bucket_quota_size_objects每用户的默认存储桶配额设置。
radosgw_usage_scrape_duration_seconds上次抓取期间从 RGW 收集所有指标所用的时间。

配额大小为 -1 表示配额不受限制。

查询示例:

# Storage used per RGW user
sum by (user) (radosgw_usage_user_total_bytes{store="ceph-cluster-object"})

# Ten largest buckets
topk(10, radosgw_usage_bucket_bytes)

# Request rate by category over the last 5 minutes
sum by (category) (rate(radosgw_usage_ops_total[5m]))

故障排除

症状原因和处理措施
CephRGWExporter 一直为 Pending,且 Pod 日志中显示 must contain Endpoint, AccessKey, and SecretKey引用的 CephObjectStoreUser 尚未处于 Ready 状态,或者其 Secret 缺失。检查 kubectl -n rook-ceph get cephobjectstoreuser,并等待 Rook 完成用户预配。
指标端点仅返回 radosgw_usage_scrape_duration_secondsRGW 用户缺少 Admin Ops 权限,或者 store 的值与网关的地域约定不匹配,导致请求被拒绝。设置 logLevel: DEBUG 并检查 exporter 日志。请注意,Rook 仅在创建用户时应用 capabilities;如需更改这些设置,请重新创建用户。
在大型对象存储上抓取超时exporter 会为每个 RGW 用户发出一个请求。调高 timeout,并增大 serviceMonitor.interval。
尽管 curl /metrics 正常工作,平台仪表板中仍无数据此集群上未安装监控插件,或者 serviceMonitor.enabled 已设置为 false。

卸载

在 Marketplace > OperatorHub 中删除 Operator,或从 rook-ceph 命名空间中删除 Subscription 和 ClusterServiceVersion。Exporter Deployment、Service 和 ServiceMonitor 对象由其 CephRGWExporter 所有,并会在删除自定义资源时被垃圾回收。自动创建的 RGW 用户不会自动删除;如果不再需要,请显式删除:

kubectl -n rook-ceph delete cephrgwexporters --all
kubectl -n rook-ceph get cephobjectstoreusers | grep rgw-exporter-user-
kubectl -n rook-ceph delete cephobjectstoreuser rgw-exporter-user-<store>

Ceph 是 Red Hat, Inc. 或其子公司在美国及其他国家/地区的商标或注册商标。 Rook® 是 Linux Foundation 的注册商标。 Alauda 是独立供应商。本产品与 LF Projects, LLC 或 Linux Foundation 无关联,也未获得其认可或赞助。所有商标均为其各自所有者的财产,此处仅用于标识目的。