如何监控 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
抓取还需允许访问 node/kubelet 指标的 RBAC、网络和可信 TLS 配置;API server 的 CA 不一定能验证 kubelet serving 证书,应核对实际签发链和地址。kube-prometheus-stack 常可通过配置启用 kubelet 抓取,具体以 chart 版本与 values 为准。
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 所在挂载点的文件系统指标,但这不是该目录或 PVC 的独立使用量;
- 指标标签里带
persistentvolumeclaim,告警通知中直接引用即可定位。
常见问题(FAQ)
Q:指标查不到任何数据? 确认 CSI 驱动支持卷统计(部分老旧驱动不支持);在具备 nodes/proxy 权限时,用 kubectl get --raw /api/v1/nodes/<node>/proxy/stats/summary 直接验证 kubelet 是否有数据。
Q:能看 inode 用量吗? 可以,kubelet_volume_stats_inodes_used / kubelet_volume_stats_inodes——小文件多的场景 inode 比容量先爆。