兩年前清理過一次harbor鏡像,而現在又要面臨清鏡像的操作了,筆者目前所在的公司鏡像是存放在ceph集群內部的,目前約200T,且該存儲池是兩副本,那么占用空間是400T左右。真的是相當浪費空間了。
harbor鏡像倉庫由於過大,需要清理老版本鏡像,以釋放空間。清理之前有一些需要注意事項,提前說一下
1、太老版本的harbor可能不帶有清理機制(也就是下文講的清理操作)
2、清理期間harbor倉庫處於只讀狀態,期間不能推鏡像,但可以拉鏡像。清理的過程也稱為gc
3、生產環境當中的harbor只讀是不被允許的,因此開發出在線不停服gc的功能會更加受用(目前網上沒有找到該案例,需要自己研發)
實踐過程如下:
1、現在倉庫有如下鏡像

2、harbor鏡像倉庫存放的位置
一般上來說,harbor本身就是由docker跑起來的。harbor的數據存儲是在容器goharbor/harbor-registryctl當中。進入到這個容器內部,找到/storage/docker/registry/v2目錄,可以看到blobs和repositories兩個目錄。如下所示:
root [ /storage/docker/registry/v2 ]# du -sm *
1140 blobs
1 repositories
實際上,容器內部的/storage/docker/registry/v2目錄對應的是宿主機上的/data/registry/docker/registry/v2目錄。
當我們推上去一個鏡像的時候,blobs目錄的大小會隨之發生變化,至於增大多少空間,取決於你在harbor里面看到的鏡像大小,如圖所示:

大約是702MB。所以上面看到的blobs目錄的大小就是在推上去一個gitlab鏡像后,由原來的438MB增長到現在的1140MB
3、開始清理
清理操作我們可以在harbor的webUI界面上來點點進行刪除,鏡像超級多的時候就是有點費手。

選中並刪除,刪除成功后會在右側進行提示。但是這種刪除只是邏輯上的刪除,並不會真正釋放空間,可以去/storage/docker/registry/v2驗證一下看看,空間還是沒有釋放。所以還需要下面的一步
4、垃圾清理(在線gc)
點擊進行垃圾清理操作,期間會在下面生成一個清理任務。注意清理期間harbor倉庫處於只讀狀態,此時不可推鏡像。

顯示已完成表示清理成功了
5、驗證空間是否釋放
此時再去查看空間
root [ /storage/docker/registry/v2 ]# du -sm *
438 blobs
1 repositories
發現空間釋放了。
