1. 引言

在 Kubernetes 中,Persistent Volume Claim(PVC) 是用于向集群申请存储资源的一种机制。当 PVC 被创建后,它会绑定到一个提供实际存储能力的 Persistent Volume(PV) 上。随着应用程序的运行和数据的持续写入,PVC 底层 PV 的可用空间会逐渐减少。

为了防止应用因存储空间耗尽而出现异常,监控 PVC 剩余空间是非常重要的。

在本教程中,我们将介绍几种在 Kubernetes 中查看 PVC 剩余空间的方法。


2. 使用 kubectl

kubectl 是 Kubernetes 提供的命令行工具,用于与集群交互,是管理集群资源的主要方式之一,包括部署应用、查看资源状态、调试等。

2.1. 查看 PVC 列表

首先,我们可以通过以下命令查看集群或指定命名空间下的所有 PVC:

$ kubectl get pvc --all-namespaces
NAMESPACE      NAME        STATUS   VOLUME    CAPACITY   ACCESS MODES   AGE
default        data-pvc    Bound    data      5Gi        RWO            12d
kube-system    logs-pvc    Bound    logs      10Gi       RWO            8d

该命令会列出所有 PVC 的基本信息,包括名称、状态、绑定的 PV、容量、访问模式和创建时间。

2.2. 描述指定 PVC

接下来,我们可以通过 describe 命令查看某个 PVC 的详细信息:

$ kubectl describe pvc data-pvc -n default
Name:          data-pvc
Namespace:     default
StorageClass:  standard
Status:        Bound
Volume:        data
Labels:        <none>
Annotations:   <none>
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    <none>
Events:        <none>

通过 kubectl describe pvc 命令,我们可以获取 PVC 的详细状态信息,包括其绑定的 PV、容量、访问模式等。

接着,我们还需要查看哪些 Pod 正在使用这个 PVC:

$ kubectl get pods -n default --selector=pvc=data-pvc
NAME       READY   STATUS    RESTARTS   AGE
data-pod-1   1/1     Running   0          10d
data-pod-2   1/1     Running   0          5d

输出显示了两个使用该 PVC 的 Pod:data-pod-1data-pod-2

2.3. 通过 exec shell 查看使用空间

接下来,我们可以进入其中一个 Pod,使用 du 命令查看 PVC 文件系统的使用情况:

$ kubectl exec -it data-pod-1 -n default -- /bin/bash

进入容器后,执行以下命令查看 PVC 挂载路径的使用情况:

$ du -sh /mnt/data
3.0Gi /mnt/data

然后,重复上述步骤查看所有 Pod 的使用情况,并将总使用空间从 PVC 总容量中减去,即可得到剩余空间。

2.4. 通过 exec + df 查看剩余空间

另一种方式是直接在容器中执行 df 命令查看磁盘空间:

$ kubectl -n default exec data-pod-1 -- df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       5Gi   3Gi   2Gi  60% /mnt/data

说明:

  • -n 指定 Pod 所在的命名空间
  • exec 在容器内执行命令
  • df -h 显示文件系统使用情况

⚠️ 注意:此方法要求容器内有 df 工具,并且 Pod 必须处于运行状态,否则无法执行。


3. 查询 Prometheus 指标

如果你的集群集成了 Prometheus,也可以通过其暴露的指标来获取 PVC 的使用情况。

Kubernetes 的节点代理 kubelet 会在 /metrics 接口上暴露两个关键指标:

  • kubelet_volume_stats_available_bytes:可用空间(字节)
  • kubelet_volume_stats_capacity_bytes:总容量(字节)

我们可以编写一个简单的脚本从 kubelet 获取这些指标:

$ cat metrics.sh
#!/bin/bash

# 获取 PVC 可用空间(字节)
available_bytes=$(curl -s http://kubelet-address:10255/metrics | grep kubelet_volume_stats_available_bytes | grep my-pvc | awk '{print $2}')

# 获取 PVC 总容量(字节)
capacity_bytes=$(curl -s http://kubelet-address:10255/metrics | grep kubelet_volume_stats_capacity_bytes | grep my-pvc | awk '{print $2}')

# 转换为 GB
available_gb=$(echo "scale=2; $available_bytes / 1024^3" | bc)
capacity_gb=$(echo "scale=2; $capacity_bytes / 1024^3" | bc)

# 输出结果
echo "Available space: $available_gb GB"
echo "Total capacity: $capacity_gb GB"

说明:

  • 使用 curl 从 kubelet 获取指标数据
  • 使用 grepawk 过滤出目标 PVC 的指标值
  • 使用 bc 将字节转换为 GB
  • 最后输出可用空间和总容量

⚠️ 注意:需要确保 kubelet 的 /metrics 接口可访问,并且脚本中 PVC 名称匹配。


4. 结语

在本教程中,我们介绍了几种查看 Kubernetes PVC 剩余空间的方法:

✅ 使用 kubectl 查看 PVC 容量并进入 Pod 检查实际使用情况
✅ 使用 Prometheus 指标实现自动化监控和实时分析

这些方法各有优劣,适用于不同场景。对于日常排查,推荐使用 kubectl exec + df;对于自动化监控,Prometheus 是更优选择。

掌握这些方法可以帮助你更好地管理 Kubernetes 中的存储资源,避免因磁盘空间不足导致的生产问题。


原始标题:How to Find the Space Left in a Persistent Volume Claim in Kubernetes