harbor磁盘镜像清理

3,908 阅读3分钟

harbor有比较重要的三个概念: project:项目名。 repository:仓库名。 artifacts:制品,实际的镜像。与镜像tag直接关联,有些artifact有tag,有些没有tag。

一个project下可以有多个repository,一个repository下可以有多个artifact。

harbor清理实际上是清理镜像(artifacts)占用的磁盘空间。

在harbor 管理页面上所有执行的删除操作都是软删除,要想真正彻底从磁盘上删除,需要执行垃圾清理。

graph TD
开始 -->设置tag保留规则 -->执行tag保留规则 -->设置垃圾清理任务 -->执行垃圾清理任务 --> Stop

镜像清理流程

tag保留规则

设置tag保留规则

tag保留规则是针对具体的项目而言的,首先找到待清理的项目的"策略"。 image.png 可以根据实际需求设置对应的保留策略。保留规则都是针对artifacts而言的,因为artifacts才是实际占用磁盘空间的。 image.png

执行tag保留规则

tag保留规则设置完成后,可以选择"定时执行",也可以"手动执行"。 在harbor ui上可以看到"定时执行",可以根据实际需求设置特定的定时任务,其中"自定义"是可以设置相应的"corn表达式"。 image.png 当然也可以不通过定时任务,直接选择"立即运行","模拟运行"顾名思义就是模拟执行,并不会对此次运行带来实际的修改。 每次执行后,会看到执行的任务列表。 image.png "状态"代表此次任务执行的结果,"持续时间"代表此次执行总共花费的时间。 "日志"可以看到此次执行的具体日志详情。 保留数/总数代表artifacts被保留的个数/artifacts总的个数。 image.png Retention标记为DEL的,说明是需要被删除的,标记为RETAIN的说明需要被保留下来的。垃圾清理只会删除被标记为DEL的artifacts。

垃圾清理(彻底释放磁盘空间)

垃圾清理可以是定时任务执行,也可以是立即执行。在执行垃圾清理时镜像仓库处于只读模式,其他对镜像仓库的任何修改操作,如镜像推送等都无法正常进行。 垃圾清理只会清理那些被标记为DEL的artifacts。

设置垃圾清理任务

image.png

执行垃圾清理任务

可以在历史任务中查看垃圾清理的详情。 "触发类型"为"手动",说明是通过非定时任务执行的; 当"状态"为"已完成", 说明此次垃圾清理任务已经完成了; 通过"日志"可以查看垃圾清理的具体日志。 image.png 当垃圾清理任务状态处于"已完成",说明镜像占用的磁盘空间已经彻底释放了。

验证磁盘空间是否释放

找到服务器上harbor数据挂载目录,在执行"垃圾清理"之前,检查下harbor目录下各个子目录的大小,当"垃圾清理"执行完成后,再对比各个目录大小即可得到验证。 image.png

删除仓库

artifacts通过垃圾清理后,磁盘空间已经彻底释放了,有的仓库已经没有存在的必要了,可以通过调用harbor api进行删除。

harbor api都没什么特殊的,直接调用就好,只不过对于仓库名带有特殊字符/的,则需要进行特殊处理。 github.com/goharbor/ha…

The name of the repository. If it contains slash, encode it with URL encoding. e.g. a/b -> a%252Fb

如果使用go的话,则需要对带有/的仓库名进行encoding

// Encode encode the repository name
func Encode(repository string) string {
   // https://github.com/goharbor/harbor/blob/master/api/v2.0/swagger.yaml#L5411
   // The name of the repository. If it contains slash, encode it with URL encoding. e.g. a/b -> a%252Fb
   return url.PathEscape(url.PathEscape(repository))
}