清理Harbor仓库

一、原因

由于开发和测试环境的发布比较频繁,Harbor仓库在使用一段时间之后,就存储了大量的镜像,占用了比较大的磁盘空间。所以需要通过删除那些时间比较久远的镜像来释放服务器的磁盘空间。

二、处理方法

注:我这边的Harbor版本是v1.10.0

这里需要了解的一点是直接通过Harbor的UI界面是不会自动删除存储中的文件和镜像的。正确的做法是:

  • 在Harbor的UI界面中删除镜像。这是一种软删除。软删除之后,Harbor中不再管理该镜像的存储库,但是存储库的文件仍然保留在Harbor的存储中。
  • 运行垃圾回收(GC)以通过从文件系统中删除不再引用的blob来释放空间。在执行GC之前,确保没人推送镜像或直接停止Harbor。因为在执行GC时,Harbor会进入只读模式,对注册表的修改是被禁止的。

因为我的Harbor上有public、dev、test三个项目,且在dev和test项目中都有40个左右(微服务和前端项目)的镜像仓库,每个镜像仓库中的镜像数量从几个到几百个不等。
所以手动去Harbor的UI界面上去删除这些镜像是一个很繁琐且费时的事情。所以这个操作还是交给脚本去完成吧。

1、删除Harbor中的多余镜像,脚本如下:

#! /usr/bin/env python
# -*- coding:utf-8 -*-

import requests


class ClearHarbor(object):

    def __init__(self, harbor_domain, password, reserve_num, schema="http", username="admin"):
        self.schema = schema
        self.harbor_domain = harbor_domain
        self.harbor_url = self.schema + "://" + self.harbor_domain
        self.api_url = self.harbor_url + "/api"
        self.pro_url = self.api_url + "/projects"
        self.repos_url = self.api_url + "/repositories"
        self.username = username
        self.password = password
        self.reserve_num = reserve_num

        self.session = requests.Session()
        self.session.verify = False  # 如果公司是使用自签名证书,不能通过 SSL 验证,就需要设置这个
        self.session.headers = {
            "Connection": "keep-alive",
            "User-Agent": "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
            "X-Xsrftoken": "FTFXOYdZH433vDwOcrLBCBMDS2RWSxQb",
            "Content-Type": "application/x-www-form-urlencoded",
            "Cookie": "td_cookie=1170650412; harbor-lang=zh-cn; sid=374633068cedf8f1911949cf4573c439; _xsrf=RlRGWE9ZZFpINDMzdkR3T2NyTEJDQk1EUzJSV1N4UWI=|1595939810659434269|376c01ea31ef55717de0173a338fa409fbfd39c3",
        }
        self.session.auth = (self.username, self.password)

    def __fetch_pros_obj(self):
        # TODO
        self.pros_obj = self.session.get(self.pro_url).json()
        return self.pros_obj

    def fetch_pros_id(self):
        self.pros_id = []
        # TODO
        pro_res = self.__fetch_pros_obj()
        for i in pro_res:
            self.pros_id.append(i['project_id'])
        return self.pros_id

    def fetch_del_repos_name(self, pro_id):
        self.del_repos_name = []
        repos_res = self.session.get(self.repos_url, params={"project_id": pro_id})
        # TODO
        for repo in repos_res.json():
            if repo["tags_count"] > self.reserve_num:
                self.del_repos_name.append(repo['name'])
        return self.del_repos_name

    def fetch_del_repos(self, repo_name):
        self.del_res = []
        tag_url = self.repos_url + "/" + repo_name + "/tags"
        # TODO
        tags = self.session.get(tag_url).json()
        tags_sort = sorted(tags, key=lambda a: a["created"])
        # print(tags_sort)
        del_tags = tags_sort[0:len(tags_sort) - self.reserve_num]
        # print(del_tags)
        for tag in del_tags:
            del_repo_tag_url = tag_url + "/" + tag['name']
            print(del_repo_tag_url)
            del_res = self.session.delete(del_repo_tag_url)
            # print(del_res.status_code)
            self.del_res.append(del_res)
        return self.del_res


if __name__ == "__main__":

    harbor_domain = "192.168.0.157:18088"
    password = "Harbor12345"
    # 设置每个镜像保留的tag数目
    reserve_num = 10
    res = ClearHarbor(harbor_domain, password, reserve_num)
    # 循环所有的project id
    for project_id in res.fetch_pros_id():
        # 获取所有tag超过10的repos
        repos = res.fetch_del_repos_name(project_id)
        if repos:
            print(repos)
            for repo in repos:
                del_repos = res.fetch_del_repos(repo)
                print(del_repos)

2、进行垃圾回收,清理释放磁盘

# 进入导harbor yaml文件所在目录
cd /usr/local/src/harbor
# 停止harbor(最好是停止,防止GC期间有人推送镜像)
docker-compose stop
# 使用--dry-run 表示尝试进行GC,输出的log和正式GC的一致,可用于提前发现问题
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.4.0 garbage-collect --dry-run /etc/registry/config.yml

# 正式GC,会GC掉已经软删除的镜像
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.4.0 garbage-collect /etc/registry/config.yml

# harbor 1.7+ 可以通过 restful api 进行在线GC或定期自动GC。

# 启动harbor
docker-compose start

鉴于上面的两个步骤,可以写一个shell脚本,将两个步骤串联起来,然以加入到定时任务中,来达到定时清理Harbor镜像的目的。

参考文章:
https://www.kancloud.cn/willseecloud/docker-handbook/1277781
https://www.cnblogs.com/kaishirenshi/p/11461504.html
https://www.cnblogs.com/pythonPath/p/11593430.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值