Harbor企業級實踐丨零侵入改造!
- 2019 年 10 月 8 日
- 筆記

本文作者 / 阿杜
玩Docker,玩K8s,玩Harbor
愛技術,愛運動,愛生活
「K8s&雲原生技術開放日」特邀講師
在上一篇中,我們分享了Harbor存儲選型,Harbor高並發壓測以及Harbor備份還原方案。本次分享將圍繞着Harbor的零侵入改造展開,依次介紹:Harbor API無侵入改造,Harbor認證&鑒權 無侵入改造以及Harbor高可用方案……
——阿杜

harbor API無侵入改造
Harbor支持豐富的RESTFUL API接口。企業平台可以調用這些API完成絕大多數的需求,但是隨着需求複雜度的增加,這些API就不能完全滿足企業的需求了。比如:Harbor只提供獲取指定Project對應的Repository查詢接口
,但是企業可能需要在不指定Project的情況下獲取相應查詢字段的Repository接口
,類似這種情況下,Harbor API接口就顯得不夠用了,那麼如何適配業務的這些需求?
這裡有兩種方式進行適配:
- Internal:通過修改Harbor內部代碼,修改和添加Harbor API接口,實現API適配
- External:Harbor外部添加一個適配器,所有適配操作通過Adapter來進行,無需修改Harbor

這兩種方式各有優缺點:
- Internal
- 優點:直接,效率高
- 缺點:修改了Harbor源碼,對於Harbor的升級來說不易維護
- External
- 優點:對Harbor零侵入,易於Harbor的升級維護
- 缺點:多了一個中轉和拼接,效率差;有些添加、修改Harbor原有表結構並對這些結構操作的API不適合這種方式
在對比了這兩種方式的優缺點後,我們選擇用第二種方式進行適配,原因很簡單:在允許一定效率損失的情況下,通過Harbor Adapter無侵入改造Harbor API,對Harbor更加友好,有利於Harbor的升級與維護。

harbor認證&鑒權 無侵入改造
Harbor對認證和鑒權支持得比較完善。Harbor主要支持三種認證方式:
- Database(PostgreSQL)——Users are stored in the local database
- LDAP——Under this authentication mode, users whose credentials are stored in an external LDAP or AD server can log in to Harbor directly.
- OIDC Provider——With this authentication mode, regular user will login to Harbor Portal via SSO flow.
Harbor的鑒權也即RBAC
是基於Project
的,用戶對Project
可以有不同的角色並對應不同的權限,例如:
- Guest——讀權限,可以下載鏡像
- Developer——讀寫權限,可以下載和上傳鏡像
- Admin——管理權限,除了下載和上次鏡像外,還具有管理該
Project
下用戶的權限
雖然Harbor支持完善的認證和鑒權機制,但是企業內部一般都有自己定製的認證和鑒權邏輯,而這些特殊邏輯是無法通過Harbor現有的方式來兼容的,那麼問題來了:如何在不修改Harbor的情況下適配企業級的認證&鑒權?
這裡我們分兩部分對Harbor認證&鑒權無侵入改造方案進行介紹:
1、API無侵入認證&鑒權
將認證&鑒權
邏輯從Harbor內部抽取到外部,由上層完成。也即:產品平台根據認證中心
進行認證和鑒權
,權限通過後,通過admin
賬號調用Harbor API
執行相關操作,執行成功後,將相應的RBAC
信息寫入數據庫:

2、Docker cmd無侵入認證&鑒權
這裡Docker cmd
的無侵入改造方案利用了Docker Token
的六次握手協議,如下:

通過配置外部認證服務器auth server
,走認證中心
進行統一的認證和鑒權
,併產生相應的token
給Docker,最終實現Docker cmd無侵入認證&鑒權
方案:

這裡在講完harbor API無侵入改造
和harbor認證&鑒權 無侵入改造
的方案後,我們還需要再補充說明一點:雖然上述方案可以滿足企業二次定製的一般情況,但是如果遇到無法通過非侵入改造的情況,那麼就只能修改Harbor了,這裡保留一個原則即可:盡量不改動Harbor內部邏輯,實在不行那也必須對Harbor進行代碼定製。

harbor高可用方案落地
我們將Harbor組件按照有無狀態分為兩部分,針對這兩部分分別設計高可用策略:
- 無狀態組件:可直接將實例數目設置>1來實現高可用
- 有狀態組件:需要專門研究高可用方案

這裡我們對有狀態組件:Redis
進行展開說明。由於Redis
在Harbor中只是起到緩存作用,數據量少,比較合適用Redis主從模式
,所以我們需要對這種模式進行高可用適配。按照官方推薦的哨兵方式
,我們部署了Redis一主兩從+三哨兵
的高可用集群:

但是這裡還存在一個問題:由於Harbor並不支持Redis哨兵協議
,為了讓Harbor更加透明地訪問Redis
,需要部署Redis
的智能代理服務:

這樣便實現了Harbor的高可用。

harbor展望
未來鏡像P2P方案
是Harbor
的主要工作方向,目前Harbor
還不支持該方案,希望不久的將來Harbor將支持鏡像P2P
特性來實現更大程度的並發拉取性能。

猜你還想看這些內容
●Kustomize上篇丨Helm 和 Kustomize:不只是含谷量的區別
· END ·

記得文末點個好看鴨~

點就完事兒了!
