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-1
和 data-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 获取指标数据 - 使用
grep
和awk
过滤出目标 PVC 的指标值 - 使用
bc
将字节转换为 GB - 最后输出可用空间和总容量
⚠️ 注意:需要确保 kubelet 的 /metrics
接口可访问,并且脚本中 PVC 名称匹配。
4. 结语
在本教程中,我们介绍了几种查看 Kubernetes PVC 剩余空间的方法:
✅ 使用 kubectl
查看 PVC 容量并进入 Pod 检查实际使用情况
✅ 使用 Prometheus 指标实现自动化监控和实时分析
这些方法各有优劣,适用于不同场景。对于日常排查,推荐使用 kubectl exec + df
;对于自动化监控,Prometheus 是更优选择。
掌握这些方法可以帮助你更好地管理 Kubernetes 中的存储资源,避免因磁盘空间不足导致的生产问题。