如何验证containerd存储的相同容器镜像并非冗余重复?
如何确认containerd中同名镜像的空间占用是否为冗余浪费
使用du命令统计containerd存储Docker镜像的磁盘空间时,会出现同一镜像按命名空间累加占用的现象——比如在microk8s环境中,10个校验和完全一致的镜像,du统计总占用达到单镜像的10倍,但这可能只是测量假象,可通过以下方法验证:
方法1:用containerd原生工具查看实际占用
containerd自带的ctr或crictl工具能准确区分镜像的虚拟大小(包含共享层的总大小)和实际磁盘占用(仅计算一次共享层+独占层),不会重复统计:
# 用ctr查看k8s.io命名空间下的镜像实际大小 ctr -n k8s.io images ls --size # k8s环境下也可用crictl crictl images --size
输出中的SIZE字段为实际磁盘占用,VIRTUAL SIZE为包含共享层的总大小,前者才是真实的空间消耗。
方法2:检查镜像层的硬链接
containerd默认通过硬链接共享镜像层,可通过inode编号确认:
# 进入containerd镜像层存储目录(microk8s默认路径) cd /var/snap/microk8s/common/containerd/io.containerd.content.v1.content/blobs/sha256/ # 查看不同镜像目录下对应层文件的inode ls -i <目标镜像层的sha256值>
如果多个文件的inode编号相同,说明它们是硬链接,实际仅占用一份磁盘空间,du的累加只是统计了不同路径下的链接,而非实际存储。
方法3:删除单个命名空间镜像,观察磁盘变化
删除一个命名空间下的目标镜像,对比删除前后的磁盘使用情况:
# 记录当前磁盘使用状态 df -h /var/snap/microk8s/common/ # 切换到目标命名空间并删除镜像 kubectl config use-context ak-tst crictl rmi docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b # 再次查看磁盘使用 df -h /var/snap/microk8s/common/
如果磁盘空间仅减少少量元数据大小(而非8.2GiB),说明镜像层是共享的,没有冗余占用。
方法4:用支持硬链接识别的工具统计
使用ncdu或带特定参数的du统计,它们会自动识别硬链接并只计算一次:
# 用ncdu扫描存储目录,可视化查看真实占用 ncdu /var/snap/microk8s/common/containerd/ # 用du的参数统计真实总占用 du -sh --one-file-system --count-links /var/snap/microk8s/common/containerd/k8s.io/
真实案例验证
某开发服务器的microk8s环境中,du统计显示10个相同镜像总占用101G,但实际通过ctr images ls --size验证,真实总占用仅为单个镜像的8.2GiB左右,确认du的累加是测量假象:
# du统计的累加结果 101G k8s.io/ # 每个命名空间下的镜像目录大小(du统计) 8.2G d8a5f98e90a4240465bce9011ee9855f38a1355d98001651692ac32b60de692a/ 8.2G c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8/ # ... 共10个8.2G目录 # 不同du参数的结果对比 du -sh c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8 # 8.2G c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8 du -sh --apparent-size c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8 # 7.7G c7be1e30a7c59c77d6c2b9e645af6fc231ee0e3626b76792d2c5fa76df501dc8 # 验证所有命名空间的镜像校验和一致 Now using project "ak-tst" on server "https://localhost:8080". Image ID: docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b Now using project "ks-tst" on server "https://localhost:8080". Image ID: docker.io/mirekphd/ml-scraper-py39-jup@sha256:6ab4c3bd81d9125eecef0906ce79440068690cb4a53ec123c50febbe5f2fe17b # ... 其余8个命名空间镜像ID完全一致
内容的提问来源于stack exchange,提问作者mirekphd
相关产品推荐
相关产品推荐

