harbor的清理策略
清理策略
要不让自动清理误删关键版本,核心就是给关键版本加个“免死金牌”,告诉Harbor:这个版本不能删。具体来说,就是给关键镜像加个特殊的标签(比如prod、critical),然后在保留策略里加个规则:只要有这个标签的镜像,不管多旧都留着。
这里要先搞懂Harbor的标签和保留策略的匹配逻辑:Harbor会先执行所有保留规则,只要镜像符合任何一个保留规则,就会被留下;只有不符合所有保留规则的镜像,才会被清掉。所以只要我们把关键镜像的标签加到保留规则里,就不会被删。
比如我们给所有线上正在用的镜像都加prod标签,然后保留策略里加一条“留所有带prod标签的镜像”,再加上“留最近7天的非prod镜像”,这样既清了旧的非关键镜像,又不会删prod的版本。
GC 清理
保留策略(Retention):删“账本”——按业务规则决定哪些镜像该消失,删除的是数据库里的 artifact 记录和 tag。删完后磁盘空间并不释放。
垃圾清理(GC):扫“仓库”——把磁盘上已经没有任何记录引用的镜像文件(blob)物理删除,这才是真正释放磁盘空间的一步。
正确流水线是“保留策略先删记录 → GC 再回收 blob”。同时启动的话,GC 扫描时保留策略可能还没删完(或刚开始删),这批 blob 要再等 24 小时才能被回收;
GC 运行期间会把 registry 置为只读,而保留策略删镜像恰恰要调 registry 的删除接口——两者同时跑,保留策略的删除操作可能失败。
保留策略留在 00:00,GC 挪到 01:00(深夜顺序执行,互不干扰;历史上保留策略执行只需几秒到几十秒,1 小时余量足够)。
案例一:
比如这两条保留规则:
- 应用到仓库匹配
**, 保留全部 artifacts基于条件tags匹配prod* - 操作应用到仓库匹配
**, 保留最近30天被推送过的 artifacts基于条件tags匹配**基于条件 无 Tag
此时在 GC 清理策略中,就不要开启允许回收无 tag 的 artifacts,否则会在下次执行定时任务的时候,把这些都清楚了,无法达到保留 30 天的效果。
效果就是:
- 标签 匹配 prod* → 总是保留(always)只要镜像的 tag 以 prod- 开头,无论推了多久,永久保留。这就是你要的“prod 排除在清理之外、永久保留”。
- 标签 匹配 **(含无 tag 镜像)→ 保留最近 30 天内推送的,其余所有镜像(dev-*、基础镜像 tag、无 tag 的悬空镜像)统一按 30 天窗口清理:30 天内推过的留下,超过 30 天的删掉。
两条规则之间是 “或” 的关系——命中任意一条就保留。
如果把规则 2 的“包含无 Tag 的 Artifacts”取消勾选——那样无 tag 镜像会在下次执行时(每天北京时间早上 07:00)直接清掉。
组合起来的实际效果:
| 镜像 | 规则1(prod*→永久) | 规则2(其余→30天) | 结果 |
|---|---|---|---|
| prod-20260101xxxx 推了 300 天 | 命中 | — | 保留 |
| dev-20261109xxxx 推了 3 天 | 30天内 | 保留 | |
| dev-20261001xxxx 推了 40 天 | 超30天 | 删除 | |
| 无 tag 悬空镜像 推了 40 天 | 超30天 | 删除 |
案例二:
比如这三条保留规则:
- 应用到仓库匹配
**, 保留全部 artifacts基于条件tags匹配prod* - 操作应用到仓库匹配
**, 保留最近30天被推送过的 artifacts基于条件tags匹配** - 应用到仓库匹配
**, 保留最近7天被推送过的 artifacts基于条件tags匹配**基于条件 无 Tag
GC 清理策略不要开启。如果保持开启,每天 05:00 会把所有无 tag 镜像直接物理删除,7 天缓冲就白设了。
harbor的清理策略
https://www.seafog.cn/archives/siJjEqbU