问题描述
当私有仓库运行一段时间后,仓库将存有大量无用的镜像(或不再使用);
这些镜像将占用大量的存储空间,所以需要清理以释放磁盘空间;
解决方案
在 Harbor UI 中,删除存储库这一操作是这是”软删除“,这可以删除整个存储库或仅删除它的标签;
当”软删除“后,Harbour 中不再管理存储库,但是存储库的文件仍然保留在 Harbour 的存储中,即依旧占用存储空间;
最终,释放存储空间需要执行 GC 操作,但是不同版本的 Harbor 操作方法不同;
参考 GC 手册,以获取关于 GC 的细节;
v2.3.5
GC,Garbage Collection
Administration / Garbage Collection,能够进行定期的垃圾回收,删除无用镜像,释放磁盘空间;
Tag Retention Rules
Harbor docs/Create Tag Retention Rules
随着 DevOps CI 构建,镜像仓库会积累大量的镜像。当 CI 产生新版本的就行后,过旧版本的镜像基本不会再使用。我们需要对这些镜像进行清理,以释放磁盘空间;
Tag Retention Rules 功能用于解决此问题。通过配置策略,其将自动清理镜像。以往没有该功能,我们需要在 Jenkins CI 中通过 Pipeline 来维护镜像版本的管理(调用 API 进行删除);
参考 Harbor docs/Create Tag Retention Rules 文档,以获取细节说明。在这里我们记录几个我们常用的场景。
在 Porject 中,Policy 进行配置,目前暂时无法针对个别 Repositories 进行配置;
CASE-01:各项目组都有自己的 TAG 命名规则,导致镜像仓库存在各种格式的 TAG 命名。我们需要某些 TAG 删除而其他 TAG 保留。
// 针对所有仓库,匹配 release** 的 TAG,仅保留最近的 30 个版本; For the repositories matching **, retain the most recently pushed 30 artifacts with tags matching release** // 针对所有仓库,匹配 develop** 的 TAG,仅保留最近的 10 个版本; For the repositories matching **, retain the most recently pushed 10 artifacts with tags matching develop** // 针对所有仓库,除了 develop**,release** 的 TAG,保留最近的 9999 个版本(所有版本); For the repositories matching **, retain the most recently pushed 9999 artifacts with tags excluding develop**,release**
v1.7.5
Harbor 镜像删除空间回收
Harbor 私有仓库中如何彻底删除镜像释放存储空间?
User Guide/Delete repositories and images
从 1.7.0 起,Harbor 提供 Online Garbage Collection 功能;
在 v1.7.5 中,我们使用系统提供 GC 配置界面「Online Garbage Collection」,可以定时执行清理工作;
v1.5.3
User Guide/Delete repositories and images
比如:在 v1.5.3 中,需要停止 Harbor 服务,然后执行 GC 命令;
但是,使用 Harbor 的 GC 效果不明显,并没有释放太多的空间;
# 仓库的删除分为两步 ################################################################################ # 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
=