# TWCC二期Harbor 2.0 ###### tags: `Harbor` ## 目的 落實用戶私有映像檔概念,並結合TWCC計劃共享概念,以下列設計達成 ## 設計 ### 使用者權限 1. 一般用戶:可存取私有影像檔,或計劃內共享影像檔,或全系統共享影像檔 2. 計劃管理者:可管理計劃內共享影像檔 3. 系統管理者:可管理所有影像檔 ### 架構與實作 ![](https://i.imgur.com/mOncNP0.png) ![](https://i.imgur.com/57U4bTV.png) #### 計劃管理 提供Event API給GOC呼叫 * 新增 * 建立twcc專案與harbor專案間的對應關係 * User-project: registry.twcc.ai/c00yun00/{imagename} * shared-project: registry.twcc.ai/gov108029/{imagename} * 導入member到Harbot專案中 * user-proj只有user and harbor admin * 加入user到shared-project group中 * 刪除 * Freeze [GOC預期行為]:當有錢包用完等商務的問題時,各服務需對應此狀態,進行相對應動作,K8S會停止vm,container等運算資源. [Harbor預期行為]: 禁止檔案上傳,但允許檔案下載、 1. 透過額度管理:限額機制達成 * Business Freeze [GOC預期行為]: 當有被hacker入侵,project以不當方式使用計算資源等,需立即停止時,各服務需對應此狀態,進行相對應動作,例如禁止read/write。 [Harbor預期行為]: 禁止對該專案執行任何映像檔相關之操作如建立容器,read/write映像檔之行為 1. Delete API-account from project member 2. Save the project member info to db 3. Delete project member * Delete [GOC預期行為]: 計畫終止,刪除所有相關資源、檔案等 [Harbor預期行為]: 刪除專案本身與專案下之映像檔與其儲存空間 1. Delete project member 2. Delete repositories 3. Delete project 4. Enable GC * * 查詢 * List project * List repositories/tags #### 映像檔管理 * 新增 * 私有映像檔上傳 * UI ![](https://i.imgur.com/1etVosO.png) 1. 來源有Http(s)/s3/dockerhub 2. UI端輸入相關資訊,運用docker pull/push到harbor registry.twcc.ai/c00yun00/{imagename} 3. 掃描並將結果透過webhook回傳給AIR 4. 更新DB * CLI 1. docker push registry.twcc.ai/c00yun00/{imagename} 2. 掃描並呈現結果 3. 取用時goc/UI需濾掉掃描沒過的映像檔 * 公有映像檔上傳(only for admin) 1.Image builder確認ngc映像檔版本差異 2.Image builder觸發cicd build 3.cicd上傳映像檔到Harbor * 刪除 * shared image: 只有project admin能透過映像檔管理頁面刪除 * user image: user透過私有映像檔管理頁面刪除 * 修改 * 容器複本 * 查詢 * 新增私有映像檔管理頁面 * 取用 * 映像檔的取用包含user + shared專案 1. 取用列表需綜合不同來源的映像檔 (GOC/UI) 2. 取用時需濾掉掃描沒過的映像檔 (GOC) * 映像檔執行的環境設置 (評估中) 1. dropbear install script 2. dropbear bring up * 透過UI上傳ssh public key (UI) * mount user public key 並帶起dropbear (GOC) 3. initial container * add ldap-user account 5. * * 共享機制 同時應存在計畫id對應之project name,此project為計劃下用戶均可存取 例如計畫gov108029,該計劃可共享之影像檔位址為 registry.twcc.ai/gov108029/{imagename} * 實現分享image的流程 1. API for doing docker pull/push 2. UI透過分享鈕觸發 #### 待評估 **UI** 1. 新增私有映像檔管理頁面,可對應到 user image * 映像檔列表 * First level content * ID * Name * tags * pulls * quota * Second level content * Tag * size * pull-command * status * create time * download button * scan result * delete * (share botton) 2. 上傳管理頁面 * 上傳工作列表 * First level content * ID * 檔案來源 * 檔案名稱 * 檔案大小 * 上傳狀態 * 建立時間 * delete 2. 分享管理頁面 * 分享工作列表 * First level content * ID * 來源映象檔名稱 * 分享狀態 * 建立時間 * delete 3. 映像檔管理頁面則對應Shared project image * 映像檔列表 * First level content * ID * Name * (Tags) * (pulls) * (quota) * ~~createTime~~ * ~~updateTime~~ * Second level content * Tag * size * pull-command * status * create time * ~~download button~~ * scan result * ~~delete~~ 4. 額度管理頁面(site admin?) * 專案列表 * First level content * capacity (used/total) * image count (pushed/total) * shared-project name * capacity and count (used/allocated) * user-project name * capacity and count (used/allocated) * check button * submit button * 5. 開發型容器 * 開發型容器詳細資料分頁-網路與連線 * 私有映像檔開啟之容器沒有Jupyter, 請goc在gsp端做區分(ngc or private) 6. **GOC/UI** 1. 要在不同情境、頁面底下來撈 user image並可在列舉時綜合不同來源的映像檔 * 開發型容器頁面 * 映像檔取用列表 * AIM模板建立頁面 * 映像檔取用列表 2. 取用時需濾掉掃描沒過的映像檔 #### 額度管理 * 額度計算邏輯 在新的架構下,每個使用者擁有user和shared兩個專案存放映像檔,根據[映像檔管理-4查詢與取用]說明兩個專案的映像檔皆可使用 方案一: 總額度為兩個專案總和.可透過UI執行分配管理 * 初始化專案時,建立專案分享空間`gov108029`和專案使用者空間`gov108029-c00yun00` 並需要紀錄iService額度與專案額度之對應關係於DB中 ![](https://i.imgur.com/KAHuzff.png) iService認知: 1T pool (400G) gov108029(500G) gov108029-users(100G) * 專案管理者可以透過UI介面分配總額度給某member 1. 額度管理頁面 * 顯示所有專案額度() 2. 額度檢查與分配 * check quota * submit quota 方案二: 分享空間和使用者空間分開討論,提供API讓使用者或是專案管理者可以依需求擴增額度. * 限額 如何限制超額上傳 * UI上傳 1. 提供get harbor quota api 2. 提供get remain usage api 3. 額度判斷與訊息回饋 (UI) * CLI上傳 1. Harbor project default api quota * * 增額 如何增加額度 * 提供 set harbor quota api 7. Demo情境 7-1. 專案啟動 * 建立私有與專案空間 * 兩個專案皆成功被建立出來 * 使用者資訊與權限配給 * 私有空間只有自己和project admin(待確認), 共享空間需包含所有LDAP記錄中的members 7-2. 權限操作 * 映像檔操作: * 使用者可以刪除自己空間的映像檔. * 映像檔上傳: * 同專案下的兩個使用者不可上傳/下載至各對方的私有空間 * 不同專案下的兩個使用者,不可上傳/下載至各對方的私有空間 7-3. 額度限制測試 * 限額: * 額度滿額時無法上傳映像檔 * 額度滿額時擴增容量(專案與額度對應資訊紀錄在哪還須討論) 7-4. 列舉專案資訊 * 私有映像檔: * 使用POST MAN顯示以下資訊 * First level content * ID * Name * tags * pulls * Second level content * Tag * size * pull-command (UI處理) * status * create time * download button (UI/Charlie處理) * scan result * delete * (share botton) (UI/Charlie處理) * 共享映像檔: * 使用POST MAN顯示以下資訊 * First level content * ID * Name * tags * pulls * Second level content * Tag * size * status * create time * scan result * delete (only project admin) 7-4. 映像檔上傳功能 * 上傳來源 * 使用3種來源(S3/DH/Http(s))執行映像檔上傳 * 目的專案要有映像檔 * 映像檔的資訊需正確 * 額度檢測機制 * 狀態檢視 * 檢視上傳管理頁面工作狀態(Finished, error) 7-5. 映像檔分享功能 * 分享流程 * 分享至共享頁面 * 狀態檢視 * 檢視共享管理頁面工作狀態(Finished, error) * 使用POST MAN顯示以下資訊 * First level content * ID * 來源映象檔名稱 * 分享狀態 * 建立時間 * delete 7-6 複本功能 * 7-7. 總共有3個項目分成兩個大綱. 1. 私有映像檔架構實作 2. 私有映像檔功能開發 1. 映像檔上傳 a. 3. 映像檔分享