You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算Kubernetes节点上各Pod占用的磁盘总空间?

问题背景

研究人员在Kubernetes集群上运行高性能计算(HPC)任务时,遇到部分Pod无法调度的问题,根因是容器引擎(Docker)因节点磁盘空间耗尽,无法拉取镜像。

诱因分析

  • 镜像体积过大:部分业务镜像超过7GB,占用节点大量磁盘资源,是磁盘耗尽的潜在诱因。
  • 本地数据集解压:部分用户通过curl等工具在节点本地下载并解压数据集,短时间内快速消耗磁盘空间,直接触发磁盘耗尽问题。

监控解决方案设计

推荐使用DaemonSet部署可访问节点文件系统的监控Pod,该Pod可计算节点上所有Pod的磁盘占用总量,并将数据暴露为Prometheus指标,进而通过告警规则检测Pod空间占用的异常增长,提前预警磁盘耗尽风险。

核心问题解答:如何计算单个Pod的磁盘总空间?

单个Pod的磁盘占用包含三类:容器镜像层(可能多Pod共享)、容器可写层(Pod运行产生的临时数据、日志)、挂载卷(如EmptyDir、HostPath等)。以下是具体计算方法和实践经验:

1. 基于容器引擎存储目录的直接统计

以Docker为例,节点默认存储目录为/var/lib/docker:

  • 容器可写层统计:每个容器对应/var/lib/docker/containers/<container-id>目录,其中overlay2/diff子目录为可写层,可通过du -sh /var/lib/docker/overlay2/<layer-id>/diff计算大小;通过docker inspect <container-id>可获取容器所属Pod的标签(io.kubernetes.pod.name、io.kubernetes.pod.namespace),关联到具体Pod。
  • 镜像层统计:通过docker image inspect <image-id> --format '{{.Size}}'获取镜像总大小,但注意镜像层可能被多个Pod共享,若需统计Pod的实际独占占用,可使用docker system df -v查看镜像与容器的空间分布,区分共享层与独占层。

若使用containerd,存储目录默认是/var/lib/containerd,通过ctr container info <container-id>获取Pod关联信息,再用du统计容器可写层路径大小即可。

2. 结合Kubernetes API的关联统计

在DaemonSet Pod中,可通过Kubernetes API获取节点Pod列表,再关联容器存储目录计算占用:

  • 将节点的/var/lib/docker或/var/lib/containerd挂载到DaemonSet Pod中;
  • 通过kubectl get pods -o wide --field-selector spec.nodeName=$(hostname)获取当前节点的所有Pod;
  • 提取每个Pod的容器ID,对应到存储目录计算磁盘占用。

3. 生产级实践:自定义Prometheus指标采集

实际场景中,可基于node-exporter的textfile collector,编写脚本定期统计Pod磁盘占用并生成指标:

#!/bin/bash
METRIC_FILE="/var/lib/node_exporter/pod_disk_usage.prom"
> $METRIC_FILE

# 获取当前节点名称
NODE_NAME=$(hostname)

# 遍历当前节点所有Pod,关联容器ID并计算可写层大小
kubectl get pods -A -o json --field-selector spec.nodeName=$NODE_NAME | jq -r '.items[] | .metadata.namespace as $ns | .metadata.name as $pod | .status.containerStatuses[] | .containerID as $cid | $ns + " " + $pod + " " + ($cid | split("://")[1])' | while read NS POD_NAME CONTAINER_ID; do
    CONTAINER_SIZE=$(du -s /var/lib/docker/containers/$CONTAINER_ID/overlay2/diff | awk '{print $1}')
    echo "pod_disk_usage_bytes{namespace=\"$NS\", pod=\"$POD_NAME\", node=\"$NODE_NAME\"} $CONTAINER_SIZE" >> $METRIC_FILE
done

将该脚本作为DaemonSet的一部分定期执行(如每5分钟),node-exporter会自动采集指标并暴露给Prometheus。

关键注意事项

  • 共享层去重:统计Pod总占用时,若包含共享镜像层会导致重复计算,建议分别统计独占可写层大小和镜像层大小,按需使用。
  • 挂载卷统计:若Pod使用EmptyDir/HostPath卷,需额外统计对应路径大小(EmptyDir默认路径为/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/<volume-name>)。
  • 性能优化:频繁使用du会消耗节点IO/CPU资源,建议降低统计频率,或使用docker stats接口获取容器磁盘使用的实时数据,替代磁盘遍历。

内容的提问来源于stack exchange,提问作者E. Jaep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:21:29