如何监控 Kubernetes 持久卷(PV)的磁盘用量?
K8s 不直接暴露 PV 用量,但 kubelet 提供 kubelet_volume_stats_used_bytes / capacity_bytes 指标,Prometheus 抓取 kubelet 后即可计算使用率并告警。本文给出配置、PromQL 与告警示例。
抓取 kubelet 的指标即可获得持久卷用量:kubelet_volume_stats_used_bytes(已用)与 kubelet_volume_stats_capacity_bytes(容量),两者相除就是使用率——再配一条 >85% 的告警规则即可闭环。
1. 抓取 kubelet
scrape_configs:
- job_name: 'kubelet'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
kube-prometheus-stack 默认已带此 job。
2. 计算使用率
(kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes) * 100
按 persistentvolumeclaim 与 namespace 标签分组,直接看出哪个 PVC 快满了。
3. 告警规则
- alert: PVDiskAlmostFull
expr: (kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes) > 0.85
for: 10m
annotations:
summary: "PVC {{ $labels.persistentvolumeclaim }} 用量超过 85%"
注意事项
- 该指标依赖 kubelet 统计,某些存储类型(如部分 NFS、hostPath)不上报——hostPath 用 node-exporter 的文件系统指标兜底;
- 指标标签里带
persistentvolumeclaim,告警通知中直接引用即可定位。
观测云对照
观测云 DataKit 的 K8s 采集自动上报 PV/PVC 用量指标,工作空间里内置容器云监控看板与"存储用量"监控器模板,无需自己抓 kubelet、写 PromQL。
常见问题(FAQ)
Q:指标查不到任何数据? 确认 CSI 驱动支持卷统计(部分老旧驱动不支持);用 kubectl get --raw /api/v1/nodes/<node>/proxy/stats/summary 直接验证 kubelet 是否有数据。
Q:能看 inode 用量吗? 可以,kubelet_volume_stats_inodes_used / kubelet_volume_stats_inodes——小文件多的场景 inode 比容量先爆。