两年前清理过一次harbor镜像,而现在又要面临清镜像的操作了,笔者目前所在的公司镜像是存放在ceph集群内部的,目前约200T,且该存储池是两副本,那么占用空间是400T左右。真的是相当浪费空间了。
harbor镜像仓库由于过大,需要清理老版本镜像,以释放空间。清理之前有一些需要注意事项,提前说一下
1、太老版本的harbor可能不带有清理机制(也就是下文讲的清理操作)
2、清理期间harbor仓库处于只读状态,期间不能推镜像,但可以拉镜像。清理的过程也称为gc
3、生产环境当中的harbor只读是不被允许的,因此开发出在线不停服gc的功能会更加受用(目前网上没有找到该案例,需要自己研发)
实践过程如下:
1、现在仓库有如下镜像
2、harbor镜像仓库存放的位置
一般上来说,harbor本身就是由docker跑起来的。harbor的数据存储是在容器goharbor/harbor-registryctl
当中。进入到这个容器内部,找到/storage/docker/registry/v2
目录,可以看到blobs和repositories两个目录。如下所示:
root [ /storage/docker/registry/v2 ]# du -sm *
1140 blobs
1 repositories
实际上,容器内部的/storage/docker/registry/v2
目录对应的是宿主机上的/data/registry/docker/registry/v2
目录。
当我们推上去一个镜像的时候,blobs目录的大小会随之发生变化,至于增大多少空间,取决于你在harbor里面看到的镜像大小,如图所示:
大约是702MB。所以上面看到的blobs目录的大小就是在推上去一个gitlab镜像后,由原来的438MB增长到现在的1140MB
3、开始清理
清理操作我们可以在harbor的webUI界面上来点点进行删除,镜像超级多的时候就是有点费手。
选中并删除,删除成功后会在右侧进行提示。但是这种删除只是逻辑上的删除,并不会真正释放空间,可以去/storage/docker/registry/v2
验证一下看看,空间还是没有释放。所以还需要下面的一步
4、垃圾清理(在线gc)
点击进行垃圾清理操作,期间会在下面生成一个清理任务。注意清理期间harbor仓库处于只读状态,此时不可推镜像。
显示已完成表示清理成功了
5、验证空间是否释放
此时再去查看空间
root [ /storage/docker/registry/v2 ]# du -sm *
438 blobs
1 repositories
发现空间释放了。