如何在Kubernetes中通过csi-cephfs获取Ceph存储集群可用容量
核心认知澄清
ceph-csi从设计上就不负责采集、暴露Ceph存储集群的全局容量指标,你开启的CSIVolumeHealth特性门控、以及你查到的kubelet_volume_stats_*系列指标,覆盖范围都是单个PV卷维度的容量、健康状态,和集群全局统计完全是两个层面的能力,和你当前用的v3.6.0版本、v1.21.8 K8s版本适配没有关系。
可落地方案
方案一:对接Ceph原生Prometheus指标(推荐,100%对齐ceph -s输出)
这是实现成本最低、数据最准确的方案,不需要改动现有ceph-csi部署:
- Ceph所有主流稳定版本(Nautilus及以上)的mgr组件内置prometheus采集模块,直接在Ceph集群侧执行命令开启即可:
ceph mgr module enable prometheus
- 模块默认在mgr节点监听9283端口,配置Prometheus抓取该端口后,可直接拿到三个和
ceph -s输出完全一致的全局容量指标:ceph_cluster_total_bytes:集群总容量ceph_cluster_used_bytes:集群已用容量ceph_cluster_avail_bytes:集群可用容量
- 三个指标做单位换算后,就能直接拼出你要的
usage: X GiB used, Y GiB / Z GiB avail格式的统计结果,数据和ceph命令行输出无偏差。如果你的Ceph集群是通过Rook部署的,直接给mgr组件创建对应Service和ServiceMonitor,就能被Prometheus自动发现,不需要手动登录节点操作。
方案二:通过CSI接口间接获取(不推荐,精度不足)
如果必须走ceph-csi组件链路获取数据,只能拿到估算值,无法达到和ceph -s对齐的精度:
- ceph-csi v3.6实现了CSI规范里的
GetCapacity接口,可查询单个存储池的可用容量,但接口不返回总容量、已用容量字段,你需要自行开发轻量采集器,遍历ceph-csi管理的所有存储池调用该接口,累加得到近似的集群可用容量,无法统计副本开销、快照占用、系统预留空间,数据误差通常在20%以上,维护成本高,无特殊需求不建议采用。 - 你也可以查询K8s自动生成的
CSIStorageCapacity资源拿到单池可用容量:
kubectl get csistoragecapacities.storage.k8s.io
但该资源是K8s存储调度用的参考数据,仅存可用容量字段,同样无法满足三个维度的统计要求。
注意事项
不要尝试累加所有kubelet_volume_stats_*指标计算集群整体容量,该系列指标统计的是Pod挂载点文件系统层面的空间使用量,没有计算Ceph多副本冗余、快照、保留空间等开销,计算结果和实际集群容量偏差极大,完全不具备全局监控参考价值。
内容的提问来源于stack exchange,提问作者MaroonYao
相关产品推荐
相关产品推荐

