如何知道是哪个 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,其中 containers
和 overlay2
子目录最大,这些都是 Docker 存储容器数据的地方。
方法一:通过 Docker 命令查找
- 首先查看所有容器的磁盘使用情况:
docker system df -v
- 找出占用空间最大的容器:
docker ps -s --format "table {{.ID}}\t{{.Names}}\t{{.Size}}"
- 对于每个占用空间大的容器,可以找到对应的 Pod:
docker inspect <container_id> | grep -A 5 Labels
在输出中查找 io.kubernetes.pod.name
标签。
方法二:通过 Kubernetes 工具查找
- 使用
kubectl
查看所有 Pod 的资源使用情况(需要 metrics-server 安装):
kubectl top pod --all-namespaces
- 对于特定节点上的 Pod:
kubectl get pods --all-namespaces -o wide | grep <node-name>
方法三:直接分析 Docker 存储目录
- 找出最大的 overlay2 目录:
sudo du -h //data/docker/overlay2 | sort -rh | head -20
- 将找到的目录 ID 与容器关联:
docker inspect $(docker ps -q) | grep -i -A 10 "graphdriver" | grep -i "mergeddir\|upperdir"
清理建议
找到占用空间大的 Pod 后,可以考虑:
- 清理无用的容器和镜像:
docker system prune -a
- 对于特定的 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.2GB
、500MB
这样的格式,可以转换成纯数字再排序:
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 -k3
按Size
降序排列。 -
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
更准确。