前言

Image Registry 建置初期最重要的管理工作即是設定容量配額、制定清理計畫與設定定期清理排程。多數情況下,開發維運團隊不會注意產出了多少 Image 與佔了多少容量,只會專注於開發與 production 環境是否有 Image 可以使用,這導致 Image Registry 管理後期經常需要面對容量問題。即使在經費允許下擁有較大的容量,因容量大引起的頻繁操作也可能造成 Harbor 效能問題,不得不謹慎。

本篇文章將簡單說明如何設置專案配額限制與清理工作,提供有興趣的朋友參考。



專案配額限制 (Project Quote)

身為 Harbor 管理者其實很難估算每個團隊使用多少儲存空間,但可以擬定相關管理策略並滾動式調整發現個團隊最佳使用方式,其中專案配額限制即是一個基本管理功能。在初期,依據目前擁有儲存空間進行配置;營運一段時間後,透過各團隊每週使用量估算配額,以達到穩定維運目的。

專案配額限制也是保護 Harbor 重要的手段,如果整體儲存空間不足則會導致 Harbor 無法正常運作,嚴重可能造成 CI/CD Pipeline 癱瘓。對於特定專案進行限制可以保護 Harbor 整體正常運作。

在 Harbor - 建立專案與儲存庫功能 文章內我們提到建立新專案時可以設定儲存配額限制,理所當然,管理人員可以隨時調整各專案配額。你可以點選專案配額 > 勾選專案 > 點選上方編輯按鈕調整儲存空間配置。



當專案達到配額上限,會收到明確的空間已經額滿的錯誤訊息。此時管理者只需要調整上限即可正常推送 Image,而不會有其他影響。




清理 - 垃圾回收 (Garbage Collection)

Image Registry 管理上比較重要的觀念即是:不是刪除 Image 後儲存空間立即釋放出來,必須透過垃圾回收功能才真正地釋放出儲存空間。雖然管理者在移除 Image 後在網頁上看見專案儲存空間減少,但實際上專案儲存空間顯示的是 Image 總和,並非實際占用儲存空間,容易造成管理人員誤會。您必須執行垃圾回收功能,透過從檔案系統中刪除清單不再引用的 blob 來釋放空間。

專案儲存空間顯示也並非實際占用容量,不同的 docker image 可能有 Shared blob,因此計算出來的容量可能大於實際硬碟佔用空間。在 Docker 中,blob 共享是全域定義的。在 Harbor 中,blob 共享是在專案層級定義的。


你可以在選單左邊選單找到清理功能,以立即執行、模擬執行 (Dry run) 或排程方式執行清理工作。清理工作屬於精密計算,花費時間長且容易引起效能,強烈建議在離峰時間執行。除此之謂,你也能選擇清理沒有標籤的檔案,避免留下一堆難以識別的 image。



執行完成後,可以透過清理日誌確認執行情況



另一清理工作是對於日誌 (Log),在較舊版本清理日誌是一件頗麻煩的事情,可能需要將 Harbor 處於停機狀態才得以清理。雖然花費時間不長,但重啟本身即為風險,相當不方便。目前的 Harbor 可以設定排程時間、日誌保留時間與那些操作需要保留。

雖然日誌本身容量不大,但避免因為日誌累積過多造成硬碟空間不足導致 Harbor 無法正常運作,設定日誌輪替是首要任務。




總結

容量問題是許多沒有經驗管理者的痛:初期若無法設定良好的管理策略與限制,當面對沒有容量問題可能會造成嚴重的維運問題。可能遇到的問題如下:

1. K8S 服務異常重新拉取 Image 佈署失敗,造成服務無法正常運作
2. 建置 Image 後無法推送,導致後續的 CI 流程失敗 (如安全掃描或 Image 搬移)
3. 因 Harbor 無法正常運作,拉取 base image 失敗而導致無法建置 image

本篇文章所介紹的功能並不困難,但卻是 Image Registry 維運的重點項目,需要謹慎規劃。