Harbor磁盘空间清理指南:如何安全清理半年前的镜像 - 详解

news/2025/9/30 19:25:09/文章来源:https://www.cnblogs.com/wzzkaifa/p/19121685

1 背景:为何需要定期清理Harbor镜像

在多项目开发环境中,随着持续集成/持续部署(CI/CD)流程的不断运行,Jenkins等工具会频繁地向Harbor镜像仓库推送新构建的镜像。久而久之,仓库中会积累大量历史镜像版本,导致虚拟机磁盘空间迅速耗尽。这些"僵尸镜像"不仅占用宝贵的存储资源,还可能增加安全风险和管理复杂度。

根据实践经验,一个中等规模的开发团队每周可能产生数十甚至上百个新镜像。如果没有有效的清理策略,Harbor存储占用呈指数级增长只是时间问题。更糟糕的是,单纯删除镜像并不立即释放物理空间——这是许多管理员常遇到的误区。

本文将详细介绍两种有效清理半年前镜像的方法:Harbor原生保留策略API脚本清理方案,并解释最终释放磁盘空间的关键步骤。

2 清理原理:Harbor的两级删除机制

Harbor采用两级删除机制,理解这一点对有效管理存储空间至关重要:

  1. 软删除(标记删除):当我们通过界面或API删除镜像标签时,Harbor只是移除了镜像的元数据引用,并未真正删除底层的物理文件(blobs)。这就是为什么删除镜像后磁盘空间似乎没有变化。
  2. 硬删除(物理删除):需要通过垃圾回收(Garbage Collection, GC) 过程来实现。GC会清理那些不再被任何镜像引用的底层数据块,从而真正释放磁盘空间。

官方推荐
UI配置

高度定制化
API操作

关键步骤:垃圾回收 GC

安排维护窗口
GC期间仓库只读

执行垃圾回收命令

真正释放物理磁盘空间

方案二:通过 Harbor API 编写脚本

认证获取 Token

筛选创建时间早于半年的标签

调用 API 删除旧标签

方案一:通过 Harbor UI 配置保留策略

创建保留规则

设置保留最近180天镜像

设置定时执行或手动运行

Harbor 磁盘空间不足

选择清理方式

磁盘空间得到释放

3 方法一:使用Harbor原生保留策略(推荐UI操作)

Harbor自v2.4版本起提供了强大的保留策略(Retention Policy)功能,这是清理旧镜像的最简便方法。

3.1 配置步骤

  1. 登录Harbor控制台,进入需要清理的项目
  2. 点击"策略"选项卡 -> "添加规则"
  3. 配置保留规则:
    • 规则名称:例如"清理半年前镜像"
    • 匹配仓库:可使用**匹配所有仓库,或指定特定仓库
    • 保留策略:选择"保留最近多少天被推送过的",设置天数为180天(约半年)
    • 标签过滤:可根据需要设置标签匹配模式(如release-*
    • 删除未打标签的镜像:建议启用,以清理无标签的中间层镜像
  4. 设置执行频率(如每周一次)
  5. 点击"模拟运行"预览将被清理的镜像
  6. 确认无误后"立即执行"

3.2 优势与注意事项

  • 优势:官方支持、配置简单、可定时自动运行、提供模拟运行功能降低风险
  • 注意事项
    • 保留策略基于"保留最近推送的镜像"逻辑,而非直接按时间点删除
    • 需要Harbor v2.4+版本支持
    • 执行后仍需运行垃圾回收才能释放物理空间

4 方法二:使用API脚本精确删除

对于需要更复杂清理逻辑或使用旧版Harbor的情况,可通过API脚本实现精确控制。

4.1 Python脚本示例

以下Python脚本示例演示了如何删除指定项目中所有早于半年的镜像标签:

import requests
from datetime import datetime, timedelta
# Harbor配置
HARBOR_URL = 'https://your-harbor.com'
USERNAME = 'admin'
PASSWORD = 'your-password'
PROJECT_NAME = 'your-project'
# 计算半年前时间点
six_months_ago = datetime.now() - timedelta(days=180)
# 获取认证token
def get_token():login_url = f'{HARBOR_URL}/c/login'resp = requests.post(login_url, json={'principal': USERNAME,'password': PASSWORD}, verify=False)return resp.headers.get('Authorization')
# 获取项目中的所有仓库
def get_repositories(project):headers = {'Authorization': get_token()}repos_url = f'{HARBOR_URL}/api/v2.0/projects/{project}/repositories'resp = requests.get(repos_url, headers=headers, verify=False)return [repo['name'] for repo in resp.json()]
# 获取仓库的所有标签及其创建时间
def get_tags(repository):headers = {'Authorization': get_token()}tags_url = f'{HARBOR_URL}/api/v2.0/{repository}/tags'resp = requests.get(tags_url, headers=headers, verify=False)return [(tag['name'], datetime.strptime(tag['push_time'], '%Y-%m-%dT%H:%M:%S.%fZ'))for tag in resp.json()]
# 删除早于指定时间的标签
def delete_old_tags():for repo in get_repositories(PROJECT_NAME):tags = get_tags(repo)for tag_name, push_time in tags:if push_time < six_months_ago:delete_url = f'{HARBOR_URL}/api/v2.0/{repo}/tags/{tag_name}'requests.delete(delete_url, headers={'Authorization': get_token()}, verify=False)print(f'Deleted: {repo}:{tag_name}')
if __name__ == '__main__':delete_old_tags()

4.2 Shell脚本方案

Alternatively,也可以使用Shell脚本实现类似功能:

#!/bin/bash
HARBOR_URL="https://your-harbor.com"
USERNAME="admin"
PASSWORD="password"
PROJECT="your-project"
# 获取token
TOKEN=$(curl -s -k -X POST -H "Content-Type: application/json" \-d "{\"principal\": \"$USERNAME\", \"password\": \"$PASSWORD\"}" \"$HARBOR_URL/c/login" | grep -o '"token":"[^"]*' | cut -d'"' -f4)
# 获取项目中的仓库列表
REPOS=$(curl -s -k -X GET -H "Authorization: Bearer $TOKEN" \"$HARBOR_URL/api/v2.0/projects/$PROJECT/repositories" | jq -r '.[].name')
for REPO in $REPOS; do# 获取仓库的标签列表TAGS=$(curl -s -k -X GET -H "Authorization: Bearer $TOKEN" \"$HARBOR_URL/api/v2.0/$REPO/tags" | jq -r '.[] | [.name, .push_time] | @tsv')while IFS=$'\t' read -r TAG PUSH_TIME; do# 转换时间格式并比较PTIME=$(date -d "$PUSH_TIME" +%s)SIX_MONTHS_AGO=$(date -d "6 months ago" +%s)if [ $PTIME -lt $SIX_MONTHS_AGO ]; then# 删除旧标签curl -s -k -X DELETE -H "Authorization: Bearer $TOKEN" \"$HARBOR_URL/api/v2.0/$REPO/tags/$TAG"echo "Deleted: $REPO:$TAG"fidone <<< "$TAGS"
done

4.3 API方法的优缺点

  • 优点:灵活性强,可精确控制删除条件,适合批量操作
  • 缺点:需要编程知识,存在一定风险,需谨慎测试

5 关键步骤:运行垃圾回收释放物理空间

无论采用哪种方法删除镜像,都必须执行此步骤才能真正释放磁盘空间

5.1 执行垃圾回收

  1. 安排维护窗口:GC期间Harbor将进入只读模式,需提前通知团队
  2. 执行GC命令
    # 进入Harbor安装目录
    cd /path/to/harbor
    # 首先进行试运行(不实际删除)
    docker-compose exec -T registry garbage-collect --dry-run /etc/registry/config.yml
    # 确认无误后正式执行
    docker-compose exec -T registry garbage-collect /etc/registry/config.yml
  3. 监控执行结果:GC完成后,查看释放的存储空间大小

5.2 新版Harbor的在线GC

Harbor v2.0+支持在线垃圾回收,可通过UI操作:

  1. 以管理员身份登录
  2. 进入"系统管理" -> "垃圾清理"
  3. 点击"立即清理"或设置定时任务
  4. 在"历史记录"中查看执行结果

6 预防措施:建立有效的镜像管理策略

清理只是治标,预防才是根本。以下措施可有效控制镜像增长:

6.1 制定镜像标签规范

6.2 设置合理的保留策略

根据不同环境设置不同的保留策略:

环境保留策略执行频率
开发环境保留最近10-30个版本或7天每天
测试环境保留最近20-50个版本或30天每周
生产环境保留所有稳定版本或按需保留手动

6.3 自动化清理流程

将清理流程纳入CI/CD流水线,定期自动执行:

  1. 使用Harbor API查询存储使用情况
  2. 在磁盘空间达到阈值时自动触发清理
  3. 定期运行垃圾回收任务
  4. 设置通知机制,报告清理结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:第14章 AI Agent——构建自主智能助理

详细介绍:第14章 AI Agent——构建自主智能助理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

网站建设宣传广告03340 网站建设与管理

响应式设计方法对开发者非常有用&#xff0c;因为它使我们的内容在各种设备上广为传播。不用保留几个独立版本的网站&#xff0c;也可以摒除诸如缩放和流式布局这些方法的弊端。 缩放、流式布局与响应式 这些术语容易造成混淆&#xff0c;设计师常常错误地交替互用。实际上&…

网站建设费用属于业务宣传费吗软件企业

写在前面的话&#xff1a; 总是在灾难发生后&#xff0c;才想起容灾的重要性&#xff1b; 总是在吃过亏后&#xff0c;才记得曾经有人提醒过。 核心军规 1、不在数据库做运算 cpu计算务必移至业务层 2、控制单表数据量 int型不超过1000w&#xff0c;含char则不超过500w&#xf…

Java入门级教程21——Java 缓存技术、RMI远程办法调用、多线程分割大档案

Java入门级教程21——Java 缓存技术、RMI远程办法调用、多线程分割大档案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

如何建设网站 知乎aoc24g2色域

随着信息技术的迅猛发展&#xff0c;计算机和网络已经成为了我们日常生活中不可或缺的工具&#xff0c;用于办公、通信和协作。尽管这些信息系统提高了工作效率&#xff0c;但也引发了一系列与信息安全相关的问题&#xff0c;例如如何有效地保护存储在这些系统中的关键数据&…

PowerToys新工具Light Switch:让Windows自动切换明暗主题

微软PowerToys将新增Light Switch工具,可根据时间自动切换Windows明暗主题。用户可设置地理位置或特定时间,还能选择仅系统、仅应用或两者同时切换主题,提升视觉舒适度。PowerToys:在Windows上根据时间自动切换明暗…

丰县做淘宝网站网站聚合页面怎么做

1005.K次取反后最大化的数组和 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后…

icoc.cc是哪个网站域名琼海网站制作

问题&#xff1a; 问题1磁盘满 1.原本是100G的大小&#xff0c;我们实际还没接入真正业务&#xff0c;昨日空间满了&#xff0c;需要帮忙看下是什么原因导致磁盘满的吗 数据库是每天备份一次&#xff0c;是不是备份的太频繁&#xff0c;还是数据量的问题导致&#xff0c;需要…

java从word模板生成.doc和.wps文件

当遇到要生成一个word文档(证明文件等)的需求时,就可以考虑使用word模板生成.doc和.wps文件 一、需求 1、生成如下这样的订单数据.doc文件,红框部分是变化的,其余部分是固定的2、生成如下这样的书籍列表,书的个数…

做我女朋友好不好手机网站汕头网站制作电话

一、介绍带有金属球的球形倾斜开关&#xff0c;它用于检测小角度的倾斜。图7.1 倾斜开关模块二、材料准备Arduino Uno 主板*1USB数据线*1倾斜开关模块*1杜邦线若干三、实验原理在倾斜开关中小球以不同的倾斜角度移动以造成触发电路的原理。倾斜开关模块使用双向传导的球形倾斜开…

分布式限流方案 - 详解

分布式限流方案 - 详解2025-09-30 19:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

炼石#8 T1

赛时很快想出切掉,感觉比t2恶心🤢,可能是二分做法的问题(bushi 想法简单,贪心想法保留m个最小的 ,于是二分k用来区分大数和小数 , 如果小于k/2为小数 , 显然小数是必拿 ,然后在每个小数之间最多只能有一个大…

中国建设银行卖狗年纪念币官方网站百度推广seo软件

标题&#xff1a;深入解析JVM内部机制&#xff1a;探索Java虚拟机的工作原理 摘要&#xff1a;本文将深入解析Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;探索其工作原理。我们将从JVM的架构、内存管理、垃圾回收、即时编译器等方面进行讨论&#xff0c;并通…

详细介绍:《C++ Primer Plus》读书笔记 第二章 开始学习C++

详细介绍:《C++ Primer Plus》读书笔记 第二章 开始学习C++pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

网站后台数据库下载企业网站服务类型

纯HTML外贸公司通用企业html网站模板源码 源码地址&#xff1a;https://download.csdn.net/download/Highning0007/89150720

【虚拟机】“:域名解析出现暂时性错误”VMware配置DNS

前言 最近家里路由器换了,虚拟机忘记重新配置,导致下午在apt的时候出现这个错误环境 软件:VMware Workstation 17 Pro 系统:Windows 10 网络:使用NAT模式作为虚拟机网络 步骤2. 选中虚拟机使用的虚拟网络,点击NA…

十堰网站建设电话wordpress 登录地址

1.Hazelcast介绍 Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品&#xff0c;提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map&#xff0c;Queue&#xff0c;ExecutorService&#xff0c;Lock和JCache等Java的许多开发人员友好的分布式实现。 Hazelcast优…

双抗 ADC:如何突破传统 ADC 瓶颈,成为癌症治疗的精准杀伤利器?

在癌症靶向治疗领域,单克隆抗体(单抗)药物曾凭借 “精准识别肿瘤靶点” 的优势改变治疗格局,但随着临床应用深入,其局限性逐渐凸显 —— 癌症发病机制复杂,多靶点协同驱动肿瘤进展、单一靶点靶向易引发耐药、肿瘤…

通州网站建设公司如何建立自己的公司

前言&#xff1a;博主第一次接触MongoDB&#xff0c;看了一圈网上现有的教程&#xff0c;不是缺少细节就是有问题没交代清楚&#xff0c;特整理了一下自己安装运行的过程&#xff0c;从下载安装到开机自启&#xff0c;全程细节齐全、图文并茂、简单易懂。 目录 1. 从官网下载2…

电子商务网站建设预算表seo是指什么岗位

使用 netstat 检查端口 netstat 是一个命令行工具&#xff0c;可以提供有关网络连接的信息。 netstat - atulnp会显示所有端口和所有对应的程序&#xff0c;用grep管道可以过滤出想要的字段 -a &#xff1a;all&#xff0c;表示列出所有的连接&#xff0c;服务监听&#xff…