最近,公司的技术平台,运维的破事儿颇多。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. kafka-java消费者与生产者代码示例

    引入依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11 ...

  2. PHP语言基础知识

    目录 前言 第一章 PHP语言学习介绍 1.1 PHP部署安装环境 1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍 2.2 PHP常量变量介绍 2.2.1 PHP变 ...

  3. python作业-2048小游戏

    需了解的知识 Pygame中的各个模块及其功能: Pygame.init():初始化所有导入的模块 pygame.display: pygame.display.init()  -  初始化 disp ...

  4. 20201126-1 txt文件筛选与读写【】

    Exercise 1import os # 设置文件夹路径为'工作文件夹',获取文件夹下的所有文件和文件夹名称 path = './工作文件夹/' files_list = os.listdir(pa ...

  5. vue 事件函数传参

    事件函数传参 在元素绑定事件时候,如果我们的函数没有传参,他也会有一个默认的传参值 event 但是如果我们的函数有传参,那么它必须作为做为最后一个传参值显示传递,且必须为$event 通过代码打印我 ...

  6. Kafka消费者手动提交消息偏移

    生产者每次调用poll()方法时,它总是返回由生产者写入Kafka但还没有消费的消息,如果消费者一致处于运行状态,那么分区消息偏移量就没什么用处,但是如果消费者发生崩溃或者有新的消费者加入群组,就会触 ...

  7. Python SQLALchemy框架

    SQLALchemy SQLALchemy是Python中的一款优秀的ORM框架,它可以作用于任何第三方Web框架,如flask,tornado等框架. SQLALchemy相较于DjangoORM来 ...

  8. 移动 drag&drop拖放

    拖放事件 #1. 三个对象 源对象 -- 被拖放的元素 过程对象 -- 经过的元素 目标对象 -- 到达的元素   #2. 源对象中的事件 要想让某个元素可以拖拽需要设置draggable=" ...

  9. angular8 大地老师学习笔记---第八课

    /*ViewChild获取dom节点 1.模板中给dom起一个名字 <div #myBox> 我是一个dom节点 </div> 2.在业务逻辑里面引入ViewChild imp ...

  10. 同学你会hello world吗? 给我讲清楚点

    少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 面试官超级喜欢问hello ...