如何用CoreOS Kube Prometheus监控K8s v1.13.4持久化卷磁盘使用量
我完全懂你现在的困扰——K8s 1.12之后旧的kubelet_volume_stats_capacity_bytes指标被移除,现有的指标要么只显示申请量要么不够精准,要监控hostPath PV的实际使用情况确实得换个思路。下面是针对你的环境(CoreOS Kube Prometheus + K8s 1.13.4 + hostpath-provisioner)的具体解决方案:
1. 先确认kubelet是否正确采集了PV统计指标
K8s 1.12之后,官方把PV相关的统计指标迁移到了新命名下,但需要kubelet正确开启采集。你可以登录任意节点,访问kubelet的安全端口metrics端点(比如curl -k https://<节点IP>:10250/metrics),搜索以下指标:
kubelet_volume_stats_used_bytes:PV已用存储量kubelet_volume_stats_capacity_bytes:PV总容量kubelet_volume_stats_available_bytes:PV剩余可用容量
这些指标会带有persistentvolumeclaim(PVC名称)、namespace(PVC所属命名空间)和volume_name(PV名称)标签,用来关联到具体的PV/PVC。如果没找到这些指标,需要检查kubelet的启动参数:
- 确保
--enable-controller-attach-detach=true(K8s 1.13默认开启) - 确保
--volume-stats-aggregator=true(该参数负责聚合PV统计数据,1.13默认开启,若被手动关闭需要重新开启)
2. 确保Prometheus正确抓取kubelet的metrics
CoreOS Kube Prometheus默认应该配置了kubelet的抓取任务,但需要确认是否抓取了安全端口的metrics(PV统计指标只在安全端口暴露)。检查Prometheus的配置中是否有类似以下的job:
- 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 relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics
如果没有这个job,或者metrics路径不对,需要调整Kube Prometheus的ServiceMonitor配置,确保kubelet的安全端口metrics被正确抓取。
3. 构建精准的PromQL查询
有了正确的指标后,就可以构建查询来展示每个PV的使用情况:
查看每个PV的已用存储量
kubelet_volume_stats_used_bytes{job="kubelet"}
这个查询会返回所有PV的已用存储,通过volume_name标签可以直接对应到PV名称,persistentvolumeclaim标签对应关联的PVC。
计算PV的使用率
(kubelet_volume_stats_used_bytes{job="kubelet"} / kubelet_volume_stats_capacity_bytes{job="kubelet"}) * 100
这个查询会输出每个PV的使用率百分比,方便在仪表盘里设置告警或可视化。
关联PVC和PV的详细信息
如果需要把PV和PVC的元数据(比如命名空间、PVC名称)结合起来,可以用kube_persistentvolumeclaim_info指标做关联:
kubelet_volume_stats_used_bytes * on(namespace, persistentvolumeclaim) group_left(persistentvolume) kube_persistentvolumeclaim_info
这样查询结果会同时包含PV名称、PVC名称和命名空间,更便于定位问题。
4. 为什么container_fs_usage_bytes不够用?
container_fs_usage_bytes统计的是容器根文件系统或挂载的所有文件系统的使用量,但它无法精准关联到单个PV:
- 一个PV可能被多个容器挂载,该指标会把所有容器的使用量混在一起
- 容器的根文件系统和PV是分开的,无法区分哪些是PV的使用量
- 没有直接关联到PV/PVC的标签,无法精准定位到某个存储卷
而kubelet提供的kubelet_volume_stats_*指标是专门针对PV的统计,直接关联到PV/PVC,数据更精准。
5. 配置Grafana仪表盘
在你的Kube Prometheus Grafana里新建面板,使用上面的PromQL查询,按persistentvolume或persistentvolumeclaim分组,选择合适的图表类型(比如条形图展示使用率,数值面板展示已用/剩余容量),就能实现PV磁盘使用情况的监控。
内容的提问来源于stack exchange,提问作者Cemal Unal

