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

  CREATED BY JENKINSBOT

问题描述

当私有仓库运行一段时间后,仓库将存有大量无用的镜像(或不再使用);

这些镜像将占用大量的存储空间,所以需要清理以释放磁盘空间;

解决方案

在 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

从 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

参考文献

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