资讯专栏INFORMATION COLUMN

Harbor镜像仓库清理小窍门

IT那活儿 / 1642人阅读
Harbor镜像仓库清理小窍门

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!


  
由于集团上云进度不断向前推进,各种大小系统纷纷上云,随着各系统镜像不断push到harbor,harbor仓库磁盘空间逐渐吃紧, 空间告警频繁出现,由于项目众多,harbor空间清理起来纷繁复杂,让人挠头。


01


为了让harbor正常健康运行,为各系统上云提供服务,我们要保障harbor 存储空间的使用率,需要定期清理垃圾,过期镜像。但人为清理太过繁杂,我们需要设计一个自动化流程来完成这一项工作,减少人工消耗。
首先,我们的架构是由k8s和harbor仓库2部分组成,垃圾清理分为2个阶段,第一个阶段是清理镜像标签,第二个阶段是清理垃圾,释放磁盘空间,流程如下图所示:


02

阶段一实现镜像清理

第一阶段使用python实现,大致步骤如下:

  • 获取harbor连接,登陆指定harbor;
  • 获取各系统项目名称清单,获取相关项目分组;
  • 获取各项目镜像的标签名称,然后按照时间排序;
  • 按保留个数,依次删除项目中的过期镜像标签。
代码实现部分:
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
import requests
import os
class HarborRequest(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 CleanHarbor(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 = HarborRequest(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 = CleanHarbor(harbor_domain="192.168.xx.xxx",
                       username="harbor",
                       password="Harbor@123",
                       num=3)
   clean.work()

阶段二实现垃圾回收

使用harbor管理界面,配置清理任务。
  • 登陆harbor仓库配置web界面
  • 配置任务垃圾清理,定时清理垃圾,释放系统磁盘空间
总结:随着云化的不断推进,诸多传统的运维动作变的异常复杂,我们需要不断的创新、改造运维手段,并持续学习掌握新的运维工具和云化相关组件,才能够适应如今不断更新迭代的云化产品以及相关的DevOps工作。

END




本文作者:李 震(上海新炬王翦团队)

本文来源:“IT那活儿”公众号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129429.html

相关文章

  • 可能是最详细的部署:Docker Registry企业级私有镜像仓库Harbor管理WEB UI

    摘要:私有仓库是,并在中运行。不要使用或为主机名注册表服务需要由外部客户端访问或,默认为用于访问和令牌通知服务的协议。打开或关闭,默认打开打开此属性时,准备脚本创建私钥和根证书,用于生成验证注册表令牌。 上一篇文章搭建了一个具有基础功能,权限认证、TLS 的私有仓库,但是Docker Registry 作为镜像仓库,连管理界面都没有,甚至连一些运维必备的功能都是缺失的,还有什么 Docker...

    沈俭 评论0 收藏0
  • 基于 Harbor 搭建 Docker 私有镜像仓库

    摘要:的每个组件都是以容器的形式构建的,使用来对它进行部署。登录输入用户名,默认密码或已修改密码登录系统。 showImg(https://segmentfault.com/img/remote/1460000012261129?w=1280&h=786); 什么是 Harbor? 第一次使用这个的时候是刚进公司处理的第一个任务的时候,发现 Harbor 就是一个用于存储和分发 Docker...

    lvzishen 评论0 收藏0
  • VMware Harbor:基于 Docker Distribution 的企业级 Registry

    摘要:架构介绍主要组件在架构上主要由五个组件构成的等服务,通过一个前置的反向代理统一接收浏览器客户端的请求,并将请求转发给后端不同的服务。目前不支持功能已提交。 前言 对于 Harbor 这样一个优秀的 Docker Registry 管理开源项目,以下内容基本上来自前人已有的研究,我只是将其在实践中进行了测试,并整理汇集了相关资料供大家参考,同时针对 Harbor 与 Rancher产品的...

    simon_chen 评论0 收藏0
  • Docker相关环境全套安装文档兼技能

    摘要:在年的月号之后,的版本命名开始发生变化,同时将版本和版本进行分开,表示年月发布。离线安装命名前安装我们可以使用来对多个容器进行管理。离线安装安装公司开源的企业级的管理项目。 以下环境皆为ubuntu16.04,主要安装docker,docker-compose,docker仓库等。 Docker安装 参考官方 A: 有源安装 sudo apt-get remove docker doc...

    impig33 评论0 收藏0
  • 【容器实例Cube】自建镜像仓库支持:自建镜像仓库,更强安全性

    摘要:输入镜像地址后,在自建镜像仓库栏,输入自建镜像仓库详细信息,字段说明如下,当前只支持基于同一主账号下云主机搭建的镜像仓库。自建镜像仓库支持容器镜像封装了应用代码,是用户的重要资产之一,出于强安全性的考虑,部分用户在容器应用的使用过程中有使用自建镜像仓库的需求。Cube 支持拉取同一 VPC 下的自建镜像仓库,丰富了使用场景,确保用户镜像和代码安全。控制台创建 / 修改 Cube 实例在控制台...

    Tecode 评论0 收藏0
  • 使用nexus3.x配置docker镜像仓库仓库代理

    摘要:正好我们在使用作为的仓库,同时提供了等诸多类型的仓库功能。值得一提的是,我们可以使用这个仓库从和下载镜像,但是我们不能通过这个仓库推送镜像到远程仓库。 背景 我们一直使用 harbor 作为docker的镜像仓库,但Harbor只能作为私有仓库,当需要Docker Hub 或 Google Cloud Containers 上的镜像时,我们只能自己手动pull,重新打tag,再push...

    HollisChuang 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<