背景
- harbor版本 1.6坪郭。
- distribution(原來的名字叫registry)版本為2.7.1,存儲后端對接ceph (s3)脉幢,線上環(huán)境ceph存儲性能一般截粗。
- 應(yīng)用會定期刪除不需要的鏡像,每個鏡像只保留一定個數(shù)的tag數(shù)鸵隧。
- harbor的bucket占用了52T的存儲容量绸罗。
- 執(zhí)行g(shù)c,耗時過長豆瘫。
針對以上問題珊蟀,需要深入研究distribution gc的原理和s3相關(guān)的接口,進而優(yōu)化gc代碼,理想目標(biāo)是gc在8個小時以內(nèi)育灸。
鏡像倉庫中的相關(guān)概念
-
registry
docker的鏡像管理工具腻窒,負(fù)責(zé)對接各種不同的存儲后端,后來改名為distribution磅崭。
distribution的github鏈接 -
harbor
開源的私有倉庫管理工具儿子,在distribution的基礎(chǔ)上增加了ui、認(rèn)證砸喻、配額等等功能柔逼。
harbor的github鏈接 -
manifest
鏡像的描述文件,如鏡像的配置信息割岛,數(shù)據(jù)信息(layers)
manifest官方解釋 -
blob
blob這個詞應(yīng)該是參考自mysql中的數(shù)據(jù)類型blob愉适,在distribution中表示一個存儲數(shù)據(jù)的文件。
GC邏輯簡介
在1.6版本的harbor中癣漆,暫時還沒有GC的概念维咸,所以這里個GC是指對于鏡像倉庫(distribution)的GC。下面簡單介紹下GC的邏輯惠爽。
- 將倉庫設(shè)置為只讀
- 遍歷distribution的存儲目錄癌蓖,獲取到鏡像列表。
- 遍歷鏡像的revisions目錄婚肆,獲取鏡像的不同版本號的manifest文件费坊。
- 根據(jù)3中的manifest,標(biāo)記blob信息旬痹,保存到markSet(字典結(jié)構(gòu))附井,可以索引到的blob就可以認(rèn)為不能刪除。
- 遍歷所有blob文件两残,如果blob不在markSet中永毅,則認(rèn)為該blob無鏡像引用,加入到deleteSet中
- 遍歷deleteSet人弓,調(diào)用存儲接口挨個刪除blob數(shù)據(jù)沼死,完成鏡像倉庫的清理。
GC的delete-untagged參數(shù)
harbor [ / ]$ registry_DO_NOT_USE_GC garbage-collect --help
`garbage-collect` deletes layers not referenced by any manifests
Usage:
registry garbage-collect <config> [flags]
Flags:
-m, --delete-untagged=false: delete manifests that are not currently referenced via tag
-d, --dry-run=false: do everything except remove the blobs
-h, --help=false: help for garbage-collect
通過查詢相關(guān)文檔崔赌,并沒有查看到具體的解釋意蛀,通過梳理代碼流程,這個參數(shù)的作用是清理以下兩種情況下的鏡像健芭。
- 使用相同的鏡像tag推送不同的鏡像內(nèi)容县钥,之前的鏡像就不能再通過tag的方式拉取。
docker tag centos:7 myos:v1
docker push myos:v1 # 生成一個sha256值
docker tag ubuntu:20 myos:v1
docker push myos:v1 # 生成一個sha256值
經(jīng)過上訴步驟后慈迈,使用docker pull myos:v1
只能拉取到ubuntu的鏡像若贮,但是centos:7
這個鏡像并沒有被刪除,可以通過centos:7
的sha256
值的方式進行拉取。
- 如果通過
sha256
的方式刪除鏡像谴麦,那么此sha256
對應(yīng)鏡像的tag將無法被拉取蠢沿。
docker push myos:v2 # 生成一個sha256值,比如是987654321
docker tag myos:v2 centos:7
docker push centos:7
docker tag myos:v2 ubuntu:20
docker push ubuntu:20
docker remove remote myos@987654321
經(jīng)過上訴步驟后匾效,centos:7
和````ubuntu:20``均無法被拉取舷蟀。
優(yōu)化思路
了解原有g(shù)c速度慢是因為ceph性能低的原因后,就可以做針對性的優(yōu)化面哼。
1野宜、通過s3 list 遍歷獲取鏡像列表 改為 從pgsql中中獲取鏡像列表
2、去掉stat獲取key的狀態(tài)精绎。
3速缨、遍歷blob锌妻,不需要遍歷到data文件代乃。
4、去掉刪除函數(shù)中的list操作仿粹。
5搁吓、合并刪除請求,挨個刪除blob數(shù)據(jù)吭历,修改為每500個blob(這個量要控制一下堕仔,防止ceph崩潰和其他影響),調(diào)用s3接口刪除一次晌区。
6摩骨、為方便觀察GC效率,增加GC記錄信息朗若,每隔5分鐘輸出一次剩余的待刪除layers的數(shù)據(jù)恼五。
總結(jié)
相關(guān)代碼就不展示了,需要的同學(xué)可以私信獲取哭懈。優(yōu)化的第一步就是要了解到性能慢的細(xì)節(jié)和代碼執(zhí)行的完整步驟灾馒,在有限的條件下思考每個步驟是否有優(yōu)化的空間。本次優(yōu)化遣总,將GC時間從原來的至少兩天縮短到了不到3個小時睬罗,性能提升了20多倍。