harbor镜像清理

背景

客户通过Jenkins流水线构建镜像上传harbor部署到kubernetes,经过不断的CI/CD,harbor占用空间不断增大,但旧的镜像其实是可以删除掉,保留最新的几个版本供回滚就可以,因此需要制定删除策略,目前情况如下

  • 保留每个镜像最新3个版本即可
  • 用户通过tag区分环境,比如 definesys/hr:dev.20210601,definesys/hr:uat.20210601,这样就导致如果保留最新3个镜像,有可能都保留了dev.xxx,其他环境的都被删除,因此也要考虑按照环境做分组,只保留每个分组内的最新3个版本即可

harbor本身并没有提供类似的功能,但是harbor有完善的restapi,因此可以自己写工具去实现以上需求。

方案

  • java开发清理程序,打包为jar包,通过Main运行
  • 通过jenkins打包应用并执行清理动作

之所以选择jenkins运行jar包,是因为jenkins可以提供配置参数界面,可以将清理程序的一些配置项通过jenkins传入,省的再去开发界面,而且jenkins有定时调度的功能,可以实现定时清理的功能。

实现

harbor的restapi非常的完善,而且难能可贵的是,整个harbor web系统也都是通过调用标准api完成所有功能,这样开发者可以很方便查看功能对应的api,只要打开F12查看网络请求即可。harbor也提供了swagger界面用于api的测试,点击harbor web系统左下角就可以进入

本次用到以下几个api

  • 获取项目列表:/projects
  • 获取仓库列表:/projects/{project_name}/repositories
  • 获取镜像列表:/projects/{project_name}/repositories/{repository_name}/artifacts
  • 删除镜像:/projects/{project_name}/repositories/{repository_name}/artifacts/{artifact_digest}

所有接口调用都需要经过认证,支持Basic Auth认证,也就是将用户名密码转成base64通过header传入即可

获取接口都是支持分页,因此需要一页页获取直到没数据为止

jenkins

创建一个带参数的jekins job,参数如下

  • harborServer:harbor系统地址
  • admin:harbor管理员账号
  • password:harbor管理员密码
  • reserveCount:保留最新版本个数
  • projectWhite:项目白名单
  • repositoryWhite:仓库白名单

jenkins执行脚本如下

#!/bin/bash
set -e
mvn clean package
java -jar target/harbor-clean-1.0.jar "$harborServer" "$admin" "$password" "$reserveCount" "$projectWhite" "$repositoryWhite"
带双引号可以避免参数为空参数位置错误问题

执行

jenkins运行后会提示总共删除了多少个镜像

删除后需要登录harbor手动清理才能最终释放磁盘空间,不然只是软删除磁盘空间并不会释放

代码

代码已上传github欢迎star

,
Trackback

no comment untill now

Add your comment now