最近,公司的技术平台,运维的破事儿颇多。Jira无法访问,ES堆内存不足,Jenkins频繁不工作。。等等等,让我这个刚入门的小兵抓心脑肝,夜不能寐,关键时刻方恨经验薄弱呀!!一波未平,一波又起,这不,Harbor镜像库又无法访问了。查了下磁盘,发现/data目录已经占用了99%,这还怎么愉快的工作了。搞他就是了!

使用Harbor API删除镜像

网上找了太多的文章都是通过Python或者shell脚本写的,因为自身没弄过python,shell脚本也不熟,而且大多不符合我的特殊需求。所以我打算直接使用Spring boot ,并利用Quartz做定时任务检查,调用Harbor API,完成镜像的删除。由于harbor镜像库保存了公司所有项目的镜像,有些仓库下的镜像比较少,时间也比较久远,不少镜像都是继承的关系,不能单一的按照时间和数量做删除。这里我的策略是每个镜像仓库至少保留5个Tag;如果多于5个,则只保留最近15天的Tag。

完整代码我已贴到Github上,如果大家需要的话可以在文末找到。

Harbor镜像占用过多磁盘

docker镜像是分层的,registry在存储镜像的时候,将docker镜像分成了2部分:

  1. 镜像元数据(manifests),存储在docker/registry/v2/repositories目录中,在这里会看到registry上的项目、项目中的镜像、镜像到Layer的索引信息。
  2. blobs,存储在docker/registry/v2/blobs目录中,在这里按00-ff分目录存储了所有镜像的layer。

如果有2个镜像使用了同一个基础镜像,那么在registry上存储的时候,blobs只有一份数据,而镜像元数据中两个镜像各自的索引都有一部分layer指向相同的layer。

举个例子。

初始状态,A、B两个镜像,都是基于layer a所做的镜像;A引用a,b,B引用a,c。

A -----> a <----- B
\--> b |
c <--/

之后删掉B镜像(通过Harbor的web,或者通过api)

A -----> a     B
\--> b
c

此时layer c实际已经没人用了,但是registry在删除B镜像时,只是会删除B的元数据,并不会主动删除layer c。

layer c就是无人照看的孤儿待回收的垃圾,需要GC。

果然 /data/registry/docker/registry这个目录占了600多GB,我们抓到了真凶。

GC回收

 

使用API,删掉镜像,UI上确实看不见了,但是我们发现磁盘并未释放,还需要回收GC。

使用docker ps, 我们可以看见harbor相关的9个容器。

进入镜像存储位置,我们使用  docker exec -it 3501 /bin/bash,进到registry这个容器里

df -h查看剩余空间

先dry-run一下,看看待删除的报告,此步不会真正执行删除。

registry garbage-collect --dry-run  /etc/registry/config.yml

可以清理的blobs还是挺多的。去掉dry-run,实际跑一下

registry garbage-collect  /etc/registry/config.yml

GC效果还可以,清理出来500GB左右的空间。

这里如果执行删除时提示对/storage/docker/registry/v2/blobs/sha256/5e/5e526656b6e423eb836829b95951913719a48efa2649189f0a039b068eb59e10/data 没有权限,在容器外执行

chmod -R 777 /data/registry/docker/registry/v2

给整个目录授权即可

Harbor API删除镜像代码,可以扫描下方二维码,关注,并私信,获取Github链接,还望兄弟们帮忙支持公号。

        < END >

  如果您喜欢这篇文章,还希望帮忙点赞分享,让更多的朋友能够参与其中,分享各自的感悟;也欢迎下方留言,和小伙伴一起探讨职场人生。 小墨唯一公众号 《DevOps特种部队》,分享我在国企数字化转型中,DevOps领域所有相关技术栈,也包含职场的苦与乐,希望各位老哥搜索或者扫描下方图片一键关注,给个支持!

Harbor镜像删除回收?只看这篇的更多相关文章

  1. V8垃圾回收?看这篇就够了!

    什么是内存管理 内存管理是控制和协调应用程序访问电脑内存的过程.这个过程是复杂的,对于我们来说,可以说相当于一个黑匣子. 当咱们的应用程序运行在某个操作系统中的时候,它访问电脑内存(RAM)来达成下列 ...

  2. Java多线程超级详解(只看这篇就够了)

    多线程能够提升程序性能,也属于高薪必能核心技术栈,本篇会全面详解Java多线程.@mikechen 主要包含如下几点: 基本概念 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先建立一个数 ...

  3. 关于 Docker 镜像的操作,看完这篇就够啦 !(下)

    紧接着上篇<关于 Docker 镜像的操作,看完这篇就够啦 !(上)>,奉上下篇 !!! 镜像作为 Docker 三大核心概念中最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌 ...

  4. Pycharm新手教程,只需要看这篇就够了

    pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...

  5. 在Linux主机使用命令行批量删除harbor镜像

     在Linux主机使用命令行批量删除harbor镜像 脚本使用说明: 此脚本不是万能脚本,根据自身环境要调整很多 能用harbor的域名就不要用IP 脚本前半部分可以套用,后半部分需一步一步试错,结合 ...

  6. 关于 Docker 镜像的操作,看完这篇就够啦 !(上)

    文章首发于微信公众号: 小哈学Java 镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 ...

  7. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  8. 集合类--最详细的面试宝典--看这篇就够用了(java 1.8)

    看了一个星期源码,搜索上百篇博文,终于总结出了集合类的所有基础知识点,学集合,看这篇就够用了!!! 篇幅有点长, 如果你能全部理解,java最重要的集合就不怕了,秒过面试!!!(本篇素材来自网络,如有 ...

  9. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

随机推荐

  1. 在iframe中获取另一个iframe中的元素

    $(top.parent.iframeId).contents().find("#selector") //iframeId为iframe的id名称

  2. sql 遍历list

    <select id="findadminSaleList" parameterClass="java.util.Map" resultClass=&qu ...

  3. uni-app全局属性和方法

    全局变量和全局方法是软件开发中常用的技术点! 实现方式大致分为: 1.vuex实现,值变动灵活 2.建立js文件,页面内引用 3.挂载vue实例后使用 4.小程序中的globalData 5.本地存储 ...

  4. 在虚拟机中安装Linux系统CentOS7详细教程!!!超详细!!!!一看就会!!!手把手教学!!!

    一.CentOS的下载 CentOS是免费版,推荐在官网上直接下载.https://www.centos.org/download/ DVD ISO:普通光盘完整安装版镜像,可离线安装到计算机硬盘上, ...

  5. Java安全之原生readObject方法解读

    Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...

  6. 20201214-1 Json与pickle数据序列化

    1-1 文件处理时,只能存字符串或者二进制 info = { 'name':'alex', 'age':22 } f = open("test.text", "w&quo ...

  7. 聚焦LS-MIMO的四大层面,浅谈5G关键技术

    摘要:本文简要讲述了5G关键技术之一的LS-MIMO,分别从导频污染.信道估计.预编码技术.信号检测四个部分入手. 导频污染 理想情况下,时分复用(TDD)系统中上行链路和下行链路之间各个导频符号之间 ...

  8. 微信小程序api拦截器

    微信小程序api拦截器 完美兼容原生小程序项目 完美兼用小程序api的原本调用方式,无痛迁移 小程序api全Promise化 和axios一样的请求方式 小程序api自定义拦截调用参数和返回结果 强大 ...

  9. [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务

    [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 目录 [从源码学设计]蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务 0x00 摘要 0x01 业务领域 0 ...

  10. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...