「Harbor」- 删除仓库,释放空间 @20210316

TODO 存在的问题:使用Harbor的GC无效,并没有释放太多的空间

私有仓库运行一段时间后,仓库中存有大量无用的镜像,会占用太多的存储空间。因此,需要清理。

首先,在Harbor的UI中删除存储库这一操作是这是”软删除“,这可以删除整个存储库或仅删除它的标签,”软删除“后,Harbour中不再管理存储库,但是存储库的文件仍然保留在Harbour的存储中,即依旧占用存储空间。

那如何释放存储空间呢?释放存储空间需要执行GC操作,但是不同版本的Harbor操作方法不同。比如:

	在v1.5.3中,需要停止Harbor服务,然后执行GC命令;
	在v1.7.5中,系统提供了GC配置界面「Online Garbage Collection」,可以定时执行清理工作;

「Online Garbage Collection」是从1.7.0版本开始的。

关于GC的细节,参考「GC」手册。

Version v1.5.3-9a630207

User Guide/Delete repositories and images

#!/bin/sh

# 仓库的删除分为两步

################################################################################
# 1. 从Harbor的UI中删除仓库(软删除)
# 删除之后,仓库不再由Harbor管理
################################################################################
# 略过……

################################################################################
# 2. 使用Registry的GC删除实际的文件
# 执行GC前,先停止Harbor服务。以防止GC期间有人push镜像,因为这会导致镜像被破坏
################################################################################
# 停止服务
docker-compose stop

# 执行--dry-run查看将被删除的镜像,不会实际删除
docker run -it --name gc --rm --volumes-from registry \
    vmware/registry:2.6.2-photon garbage-collect --dry-run /etc/registry/config.yml

# 执行删除
docker run -it --name gc --rm --volumes-from registry \
    vmware/registry:2.6.2-photon garbage-collect /etc/registry/config.yml

# 启动服务
docker-compose start

# 然而并不好用,空间仍然没有回收多少……

# 系统磁盘:146G

# 计算镜像文件占用空间
du -h --max-depth=0 /data/registry/docker/registry/v2/blobs
# 125G

################################################################################
# 查看所有文件的实际大小
################################################################################
find /data/registry/docker/registry/v2/blobs/ -type f -name "data" -printf "%p, %s\n"
# 此时发现很多小于块大小的文件(最开始实在Harbor接口上发现这个问题的)

# 实际占用的空间大小
find /data/registry/docker/registry/v2/blobs/ -type f -name "data" -printf "%s\n" | paste -sd+ - | bc
# 133735716138B

################################################################################
# 计算每个文件占用的块数
################################################################################
find /data/registry/docker/registry/v2/blobs/ -type f -name "data" -printf "%s\n" \
     | xargs -I '%' -n 1 sh -c "echo % | perl -nl -MPOSIX -e 'print ceil(\$_/4096);'" > /tmp/count.txt

# 计算累计的块数
cat /tmp/count.txt | paste -sd+ - | bc
# 32655707

# 文件系统块大小
xfs_info /dev/mapper/centos-root
# bsize=4096

# 计算实际占用的磁盘空间
echo $((32655707*4096/1024/1024/1024))
# 133757775872B

################################################################################
# 浪费的空间
################################################################################
echo $((133757775872-133735716138))
# 22059734B # 22M

参考文献

Harbor镜像删除空间回收
Harbor私有仓库中如何彻底删除镜像释放存储空间?
User Guide/Delete repositories and images


posted @ 2021-03-16 17:50  研究林纳斯写的  阅读(430)  评论(0编辑  收藏  举报