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特性來實現更大程度的並發拉取性能。

猜你還想看這些內容

●Harbor企業級實踐丨20倍性能提升so easy!

●Ceph Bulestore磁盤空間分配初探

Kustomize上篇丨Helm 和 Kustomize:不只是含谷量的區別

Kustomize下篇丨Kustomize 中的增刪改查

· END ·

記得文末點個好看鴨~


點就完事兒了!