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

如何在Kubernetes的Docker容器内仅显示上层目录存储使用情况?

解决容器内df -h显示宿主机存储而非容器实际配额的问题

核心原因

默认情况下,Docker容器的根文件系统是基于宿主机存储驱动(如overlay2)的联合挂载,df命令会穿透到宿主机的底层文件系统,所以显示的是宿主机根目录的情况。要让它显示容器自身的存储限制和使用量,需要从宿主机文件系统配置、Docker存储驱动、Kubernetes资源限制三个层面配合实现。


1. 确保宿主机文件系统支持存储配额

Docker的overlay2存储驱动需要宿主机文件系统支持项目配额(project quota)才能给容器可写层设置限制:

  • 对于XFS文件系统,宿主机根分区挂载时需添加prjquota参数。修改/etc/fstab后执行mount -o remount /生效。
  • 对于ext4文件系统,挂载时需添加usrquota,grpquota参数,同样修改fstab后重新挂载。
  • 验证:执行mount | grep /查看挂载参数,确认包含对应的quota标识。

2. 配置Kubernetes容器的临时存储限制

在Pod的资源限制中指定ephemeral-storage的配额,K8s会自动将这个限制传递给Docker,为容器的可写层和临时存储(如emptyDir)设置配额。示例配置片段:

spec:
  containers:
  - name: your-app-container
    image: your-app-image:latest
    resources:
      limits:
        ephemeral-storage: "25Gi"  # 容器的总临时存储上限
      requests:
        ephemeral-storage: "1Gi"   # 初始分配的存储请求

3. 让容器内df显示正确配额

使用Docker 20.10+版本配合K8s 1.20+,当正确配置上述步骤后,容器内执行df -h /应该能显示设置的25Gi上限和实际已用空间。如果仍显示宿主机信息,可尝试:

  • 检查Docker存储驱动是否为overlay2:docker info | grep Storage Driver
  • 确认宿主机的quota配置已生效,且K8s的ephemeral-storage限制已正确应用到Pod(可通过kubectl describe pod <pod-name>查看Resources字段)

4. 备选方案:自定义脚本模拟df输出

如果环境限制无法让原生df正常显示,可在容器内添加一个简单脚本,读取cgroup中的存储限制和容器实际使用量,模拟df的输出格式:

#!/bin/bash
# 获取容器可写层已用空间
USED=$(du -sh / | awk '{print $1}')
# 获取cgroup中的存储限制(cgroup v2路径)
LIMIT=$(cat /sys/fs/cgroup/io.storage.size | numfmt --to=iec)
# 计算可用空间
AVAILABLE=$(echo "$LIMIT" "$USED" | awk '{print $1 - $2}')

echo "Filesystem      Size  Used Avail Use% Mounted on"
echo "overlay         $LIMIT  $USED $AVAILABLE $(echo "$USED $LIMIT" | awk '{print int($1/$2*100)}')% /"

将脚本保存为df-container并添加执行权限,运行即可得到容器实际的存储情况。


总结

这没有超出Docker的能力范围,只要配合宿主机的quota配置和K8s的资源限制,就能让容器内的df显示正确的存储配额。如果环境存在版本或配置限制,自定义脚本也是一个轻量可行的替代方案。

内容的提问来源于stack exchange,提问作者aisensiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:20:42