【k8s】如何知道k8s节点上哪个 pod 占用的磁盘最多?

如何知道是哪个 pod 占用的磁盘最多?

k8s node 节点: 

# du -sh //data/kubelet/
15G     //data/kubelet/

# du -sh //data/* | grep G
277G    //data/docker

# ll //data/docker/
total 128
drwx------.   2 root root    24 Sep  3  2022 builder
drwx------.   4 root root    92 Sep  3  2022 buildkit
drwx------. 187 root root 16384 May 23 21:55 containers
drwx------.   3 root root    22 Sep  3  2022 image
drwxr-x---.   3 root root    19 Sep  3  2022 network
drwx------. 804 root root 86016 May 23 21:55 overlay2
drwx------.   4 root root    32 Sep  3  2022 plugins
drwx------.   2 root root     6 Sep  3  2022 runtimes
drwx------.   2 root root     6 Sep  3  2022 swarm
drwx------.   2 root root     6 Feb 28 15:13 tmp
drwx------.   2 root root     6 Sep  3  2022 trust
drwx------.   2 root root    25 Sep  3  2022 volumes

如何确定哪个 Kubernetes Pod 占用磁盘最多

从你的输出可以看出,//data/docker 目录占用了 277GB,其中 containersoverlay2 子目录最大,这些都是 Docker 存储容器数据的地方。

方法一:通过 Docker 命令查找

  1. 首先查看所有容器的磁盘使用情况:
docker system df -v
  1. 找出占用空间最大的容器:
docker ps -s --format "table {{.ID}}\t{{.Names}}\t{{.Size}}"
  1. 对于每个占用空间大的容器,可以找到对应的 Pod:
docker inspect <container_id> | grep -A 5 Labels

在输出中查找 io.kubernetes.pod.name 标签。

方法二:通过 Kubernetes 工具查找

  1. 使用 kubectl 查看所有 Pod 的资源使用情况(需要 metrics-server 安装):
kubectl top pod --all-namespaces
  1. 对于特定节点上的 Pod:
kubectl get pods --all-namespaces -o wide | grep <node-name>

方法三:直接分析 Docker 存储目录

  1. 找出最大的 overlay2 目录:
sudo du -h //data/docker/overlay2 | sort -rh | head -20
  1. 将找到的目录 ID 与容器关联:
docker inspect $(docker ps -q) | grep -i -A 10 "graphdriver" | grep -i "mergeddir\|upperdir"

清理建议

找到占用空间大的 Pod 后,可以考虑:

  1. 清理无用的容器和镜像:
docker system prune -a
  1. 对于特定的 Pod,可以:
  • 检查是否有日志文件过大
  • 检查是否有数据卷使用不当
  • 考虑调整 Pod 的资源限制

注意:清理操作前请确保了解这些容器/Pod 的作用,避免影响生产服务。

如何将根据pod占用的磁盘空间,从大到小排列?

要将 docker ps -s 的输出按磁盘占用空间从大到小排序,你可以结合 sort 命令来实现。
以下是几种方法:


方法 1:直接排序 SIZE 列(按人类可读格式,如 1.2GB)

docker ps -s --format "table {{.ID}}\t{{.Names}}\t{{.Size}}" | 
  (read -r header; echo "$header"; sort -rh -k3)

说明:

  • read -r header; echo "$header":保留表头。
  • sort -rh -k3
    • -h:按人类可读的数字排序(如 1GB > 500MB)。
    • -k3:按第 3 列(Size)排序。
    • -r:降序排列(从大到小)。

方法 2:按原始字节排序(更精确)

如果 Size 列显示的是 1.2GB500MB 这样的格式,可以转换成纯数字再排序:

docker ps -s --format "table {{.ID}}\t{{.Names}}\t{{.Size}}" | 
  (read -r header; echo "$header"; tail -n +2 | 
   awk '{print $0 "\t" $3}' | 
   sort -rh -k3 | cut -f1-3)

说明:

  • tail -n +2:跳过表头。
  • awk 提取 Size 列并附加到行尾,方便排序。
  • sort -rh -k3Size 降序排列。
  • cut -f1-3 只保留前 3 列(去掉临时附加的列)。

方法 3:直接解析 docker system df -v(推荐)

如果只关心磁盘占用,更推荐使用 docker system df -v,它会显示每个容器的实际磁盘占用:

docker system df -v | grep "Local Volumes" -A 20 | 
  awk '{print $1, $2, $3}' | 
  sort -k3 -hr

输出示例:

CONTAINER ID  NAMES        SIZE
a1b2c3d4e5f6  my-container 2.5GB
x9y8z7w6v5u4  nginx        1.2GB

总结

方法 适用场景 特点
方法 1 快速排序 docker ps -s 简单,但可能不精确(人类可读格式)
方法 2 精确排序 docker ps -s 较复杂,但结果更准确
方法 3 直接查看磁盘占用 最准确,推荐使用

推荐直接用 docker system df -v(方法 3),它直接显示磁盘占用,比 docker ps -s 更准确。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容