admin管理员组文章数量:1566223
最近线上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()
版权声明:本文标题:Harbor镜像仓库清理 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726093279a1055200.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论