harbor有比较重要的三个概念: project:项目名。 repository:仓库名。 artifacts:制品,实际的镜像。与镜像tag直接关联,有些artifact有tag,有些没有tag。
一个project下可以有多个repository,一个repository下可以有多个artifact。
harbor清理实际上是清理镜像(artifacts)占用的磁盘空间。
在harbor 管理页面上所有执行的删除操作都是软删除,要想真正彻底从磁盘上删除,需要执行垃圾清理。
graph TD
开始 -->设置tag保留规则 -->执行tag保留规则 -->设置垃圾清理任务 -->执行垃圾清理任务 --> Stop
镜像清理流程
tag保留规则
设置tag保留规则
tag保留规则是针对具体的项目而言的,首先找到待清理的项目的"策略"。
可以根据实际需求设置对应的保留策略。保留规则都是针对artifacts而言的,因为artifacts才是实际占用磁盘空间的。
执行tag保留规则
tag保留规则设置完成后,可以选择"定时执行",也可以"手动执行"。
在harbor ui上可以看到"定时执行",可以根据实际需求设置特定的定时任务,其中"自定义"是可以设置相应的"corn表达式"。
当然也可以不通过定时任务,直接选择"立即运行","模拟运行"顾名思义就是模拟执行,并不会对此次运行带来实际的修改。
每次执行后,会看到执行的任务列表。
"状态"代表此次任务执行的结果,"持续时间"代表此次执行总共花费的时间。
"日志"可以看到此次执行的具体日志详情。
保留数/总数代表artifacts被保留的个数/artifacts总的个数。
Retention标记为DEL的,说明是需要被删除的,标记为RETAIN的说明需要被保留下来的。垃圾清理只会删除被标记为DEL的artifacts。
垃圾清理(彻底释放磁盘空间)
垃圾清理可以是定时任务执行,也可以是立即执行。在执行垃圾清理时镜像仓库处于只读模式,其他对镜像仓库的任何修改操作,如镜像推送等都无法正常进行。 垃圾清理只会清理那些被标记为DEL的artifacts。
设置垃圾清理任务
执行垃圾清理任务
可以在历史任务中查看垃圾清理的详情。
"触发类型"为"手动",说明是通过非定时任务执行的;
当"状态"为"已完成", 说明此次垃圾清理任务已经完成了;
通过"日志"可以查看垃圾清理的具体日志。
当垃圾清理任务状态处于"已完成",说明镜像占用的磁盘空间已经彻底释放了。
验证磁盘空间是否释放
找到服务器上harbor数据挂载目录,在执行"垃圾清理"之前,检查下harbor目录下各个子目录的大小,当"垃圾清理"执行完成后,再对比各个目录大小即可得到验证。
删除仓库
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))
}