Harbor镜像仓库清理

最近线上Harbor镜像仓库的磁盘一直告警,磁盘使用率一度超过85%,发现很多微服务发布过于频繁,而我们每隔两周手动删除过期的镜像显得有点力不从心。看了官网有1.9版本的,带垃圾清理功能,决定将Harbor升级到1.9.2(我们使用的是1.6.3的老版本)

虽然Harbor1.9版本开始有垃圾清理和过期镜像自动清理,但是使用过程中有个bug,就是推送时间一直是1/1/1 上午8:05,这就很尴尬了,容易误删,看了下创建时间还是正常的,只能写python脚本调API删除了。

Harbor的API:

大致思路:

1.获取Harbor会话连接。

2.获取项目名称和分组。

3.获取项目中镜像的tag标签名称,并按创建时间排序。

4.按保留个数依次删除项目中的过期镜像(这个只是删除了WEB界面的镜像tag,磁盘中还在)。

5.设置垃圾清理定时任务,自动清理镜像(磁盘中删除,1.9版本有垃圾清理功能,可以不停机清理过期镜像)。

最终脚本如下:

#! /usr/bin/env python3
# -*- coding:utf-8 -*-
# 本脚本只是harbor页面tags清理
# author:jimleno

import requests
import os

class RequestClient(object):

    def __init__(self, login_url, username, password):
        self.username = username
        self.password = password
        self.login_url = login_url
        self.session = requests.Session()
        self.login()

    def login(self):
        requests.packages.urllib3.disable_warnings()
        self.session.get(self.login_url, params={"principal": self.username, "password": self.password}, verify=False)


class ClearHarbor(object):

    def __init__(self, harbor_domain, username, password, num, schema="http", ):
        self.num = num
        self.schema = schema
        self.harbor_domain = harbor_domain
        self.harbor_url = self.schema + "://" + self.harbor_domain
        self.login_url = self.harbor_url + "/login"
        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.client = RequestClient(self.login_url, self.username, self.password)

    def __fetch_pros_obj(self):
        # 获取所有项目名称
        self.pros_obj = self.client.session.get(self.pro_url).json()
        for n in self.pros_obj:
            print("分组:",n.get("name"))
        return self.pros_obj

    def fetch_pros_id(self):
        # 获取所有项目ID
        self.pros_id = []
        pro_res = self.__fetch_pros_obj()
        for i in pro_res:
            self.pros_id.append(i['project_id'])
        print("所有项目ID:",self.pros_id)
        return self.pros_id

    def fetch_del_repos_name(self, pro_id):
        # 镜像tag数量大于self.num的镜像仓库名称
        self.del_repos_name = []
        repos_res = self.client.session.get(self.repos_url, params={"project_id": pro_id})
        #print("项目信息:",repos_res.json())
        for repo in repos_res.json():
            if repo["tags_count"] > self.num:
               # print("镜像仓库名称:",repo['name'])
                self.del_repos_name.append(repo['name'])
        return self.del_repos_name

    def fetch_del_repos(self, repo_name):
        # 删除镜像仓库tag
        
        self.del_res = []
        tag_url = self.repos_url + "/" + repo_name + "/tags"
        # 项目镜像仓库的所有tags,按创建时间排序
        tags = self.client.session.get(tag_url).json()
        tags_sort = sorted(tags, key=lambda a: a["created"])
        #print(len(tags_sort),tags_sort)
        # 除了最新的self.num个,其他的tag都添加到待删除列表del_tags
        del_tags = tags_sort[0:len(tags_sort) - self.num]
        # print(del_tags)
        for tag in del_tags:
            del_repo_tag_url = tag_url + "/" + tag['name']
            print(del_repo_tag_url)
            del_res = os.popen('curl -X DELETE -u %s:%s -s -w %s %s' % (self.username,self.password,'%{http_code}',del_repo_tag_url)).readlines()
            self.del_res.append("镜像: %s 删除状态: %s" % (del_repo_tag_url,del_res))
        return self.del_res

    def work(self):
        # 遍历project id
        for i in self.fetch_pros_id():
            # 获取所有tag超过self.num的repos
            repos = self.fetch_del_repos_name(i)
            if repos:
                for repo in repos:
                    del_repos = self.fetch_del_repos(repo)
                    print(del_repos)


if __name__ == "__main__":
    clean = ClearHarbor(harbor_domain="192.168.88.170",
                        username="harbor",
                        password="Harbor@123",
                        num=3)
    clean.work()

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值