harbor blobs占用的空間越來(lái)越大的情況記錄和解決辦法
2019-08-07
harbor所在的服務(wù)器突然提示磁盤(pán)空間不足,上去查看磁盤(pán)占用情況發(fā)現(xiàn),/data竟然達(dá)到了49GB:

導(dǎo)致磁盤(pán)剩余只有17GB

于是我就好奇,做了一個(gè)統(tǒng)計(jì),看看當(dāng)前harbor中的所有image加起來(lái)到底是多少,這一統(tǒng)計(jì)就發(fā)現(xiàn)了問(wèn)題,一共加起來(lái)才用了10GB不到,咋占用磁盤(pán)空間就達(dá)到了49GB呢?

所以懷疑,是否是產(chǎn)生了垃圾,導(dǎo)致了磁盤(pán)空間沒(méi)有釋放?。?!
于是查了一下解決辦法:
執(zhí)行如下的前提是必須保證harbor是處于stop狀態(tài),而不能是down狀態(tài):
先執(zhí)行:
docker-compose stop
然后執(zhí)行
dockerrun -it --name gc --rm--volumes-from registryvmware/registry-photon:v2.6.2-v1.5.0garbage-collect--dry-run /etc/registry/config.yml
如果harbor是down狀態(tài),則會(huì)報(bào)錯(cuò):
docker: Error responsefrom daemon: No such container: registry.
檢測(cè)出如下結(jié)果:

此時(shí)磁盤(pán)占用情況為:

然后執(zhí)行:
docker run -it --name gc --rm--volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0garbage-collect /etc/registry/config.yml
可以看到上述并沒(méi)有起作用:

于是在harbor控制臺(tái)上手動(dòng)刪除了一些image,然后查看磁盤(pán)是沒(méi)有立即釋放的。
于是又執(zhí)行了一次垃圾回收:
docker run -it --name gc --rm--volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0garbage-collect --dry-run /etc/registry/config.yml
docker run -it --name gc --rm--volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0garbage-collect /etc/registry/config.yml
然后查看發(fā)現(xiàn),磁盤(pán)空間確實(shí)釋放了2GB:

此時(shí)的磁盤(pán)空間占用為:

最后再啟動(dòng)harbor:docker-compose start
這只是證明了垃圾回收針對(duì)刪除的image是起作用的。但是為啥blobs會(huì)占用這么大的空間呢?
于是接著查找原因,終于發(fā)現(xiàn)了一篇文章中記錄著解決辦法:
文章鏈接:https://www.cnblogs.com/xzkzzz/p/10151482.html
Harbor刪除鏡像后且GC清理后,磁盤(pán)空間沒(méi)有釋放。因?yàn)槲覀僷ush大量相同標(biāo)簽的鏡像,Docker?鏡像由標(biāo)簽引用,并由唯一的摘要標(biāo)識(shí)。這意味著如果myImage使用標(biāo)記推送兩個(gè)圖像,在DR內(nèi)部他們顯示的不同,它們將由兩個(gè)不同的digests標(biāo)識(shí)。最后推送的Images是當(dāng)前的。Docker?鏡像由layers組成,每個(gè)layers都關(guān)聯(lián)一個(gè)blob。該blob是最占用存儲(chǔ)的文件; 這些文件將由GC清理。正由上面的描述每個(gè)鏡像都會(huì)存儲(chǔ)一個(gè)引用,因?yàn)?,我們重?fù)提交10次,那一個(gè)標(biāo)簽在DR中會(huì)有10個(gè)引用,標(biāo)簽只能獲取tag。而其他9個(gè)只能用digest獲取了。
簡(jiǎn)單的來(lái)說(shuō)就是因?yàn)橄嗤臉?biāo)簽的鏡像重復(fù)提交次數(shù)過(guò)多導(dǎo)致。
通過(guò)向docker-compose.yml中添加:
ports:
? -127.0.0.1:5000:5000
然后通過(guò)執(zhí)行(需提前下載mortensrasmussen/docker-registry-manifest-cleanup):
docker run--network="host" -it -v /data/registry:/registry -eREGISTRY_URL=http://127.0.0.1:5000mortensrasmussen/docker-registry-manifest-cleanup
來(lái)清理已刪除未使用的那些blobs?。?!
執(zhí)行結(jié)果如下:

此時(shí)查看服務(wù)器磁盤(pán)空間,已經(jīng)釋放了:

可以看到,磁盤(pán)占用的情況已經(jīng)發(fā)生了變化:

這簡(jiǎn)直是太美妙了!問(wèn)題終于解決了!很久之前,在虛擬機(jī)中使用harbor,時(shí)間長(zhǎng)了就出現(xiàn)過(guò)一回這個(gè)情況,但是當(dāng)時(shí)沒(méi)有找到解決辦法,最后無(wú)奈遷移了harbor中的數(shù)據(jù)到新的harbor中。但是當(dāng)時(shí)就對(duì)harbor的這個(gè)情況印象深刻,終于在這個(gè)環(huán)境中再次出現(xiàn)了,并且終于解決了!又攻克了一道大山?。?!
補(bǔ)充一下通過(guò)harbor清理垃圾的方法:
首先必須以admin用戶登錄才行,普通用戶是看不到以下頁(yè)面的:



以上只是邏輯上的清理,但是磁盤(pán)空間并沒(méi)有釋放,必須要執(zhí)行如下命令才能釋放空間:
docker run -it --name gc --rm
--volumes-from registry vmware/registry-photon:v2.6.2-v1.5.0 garbage-collect
/etc/registry/config.yml
但是以上命令不能刪除多余的layer,只能釋放刪除的image的資源。若想真正刪除多余的layer,還是需要:mortensrasmussen/docker-registry-manifest-cleanup 出馬才行?。?!