在多项目开发环境中,随着持续集成/持续部署(CI/CD)流程的不断运行,Jenkins等工具会频繁地向Harbor镜像仓库推送新构建的镜像。久而久之,仓库中会积累大量历史镜像版本,导致虚拟机磁盘空间迅速耗尽。这些"僵尸镜像"不仅占用宝贵的存储资源,还可能增加安全风险和管理复杂度。
根据实践经验,一个中等规模的开发团队每周可能产生数十甚至上百个新镜像。如果没有有效的清理策略,Harbor存储占用呈指数级增长只是时间问题。更糟糕的是,单纯删除镜像并不立即释放物理空间——这是许多管理员常遇到的误区。
本文将详细介绍两种有效清理半年前镜像的方法:Harbor原生保留策略和API脚本清理方案,并解释最终释放磁盘空间的关键步骤。
Harbor采用两级删除机制,理解这一点对有效管理存储空间至关重要:
Harbor自v2.4版本起提供了强大的保留策略(Retention Policy)功能,这是清理旧镜像的最简便方法。
**匹配所有仓库,或指定特定仓库release-*)对于需要更复杂清理逻辑或使用旧版Harbor的情况,可通过API脚本实现精确控制。
以下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
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"
fi
done
无论采用哪种方法删除镜像,都必须执行此步骤才能真正释放磁盘空间。
# 进入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
Harbor v2.0+支持在线垃圾回收,可通过UI操作:
清理只是治标,预防才是根本。以下措施可有效控制镜像增长:
v1.2.3)20230901-abc1234)dev、staging、prod)latest标签根据不同环境设置不同的保留策略:
| 环境 | 保留策略 | 执行频率 |
|---|---|---|
| 开发环境 | 保留最近10-30个版本或7天 | 每天 |
| 测试环境 | 保留最近20-50个版本或30天 | 每周 |
| 生产环境 | 保留所有稳定版本或按需保留 | 手动 |
将清理流程纳入CI/CD流水线,定期自动执行:
清理Harbor中半年前的镜像是一个系统性的过程,涉及标记删除和物理释放两个关键阶段。您可以根据实际情况选择合适的方法:
定期清理不再使用的镜像不仅是存储空间的要求,也是安全最佳实践。通过建立规范的镜像管理策略和自动化清理流程,您可以有效控制Harbor存储增长,确保容器环境的高效稳定运行。
重要提示:在执行任何删除操作前,请务必确认备份重要镜像,并确保没有运行中的容器依赖这些镜像,以免影响业务正常运行。
本文来自博客园,作者:dashery,转载请注明原文链接:https://www.cnblogs.com/ydswin/p/19118883
登录查看全部
参与评论
手机查看
返回顶部