您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

開源企業(yè)級容器Registry架構(gòu)簡介

大小:0.4 MB 人氣: 2017-10-11 需要積分:1
VMware公司最近開源了企業(yè)級Registry項目Harbor,由VMware中國研發(fā)的團隊負責開發(fā)。Harbor項目是幫助用戶迅速搭建一個企業(yè)級的registry 服務。它以Docker公司開源的registry為基礎,提供了管理UI, 基于角色的訪問控制(Role Based Access Control),AD/LDAP集成、以及審計日志(Audit logging) 等企業(yè)用戶需求的功能,同時還原生支持中文,對廣大中國用戶是一個好消息。本文將介紹Harbor項目的主要組件,并闡述Harbor的工作原理。
  架構(gòu)介紹
  
  Harbor在架構(gòu)上主要由五個組件構(gòu)成:
  Proxy:Harbor的registry, UI, token等服務,通過一個前置的反向代理統(tǒng)一接收瀏覽器、Docker客戶端的請求,并將請求轉(zhuǎn)發(fā)給后端不同的服務。
  Registry: 負責儲存Docker鏡像,并處理dockerpush/pull 命令。由于我們要對用戶進行訪問控制,即不同用戶對Docker image有不同的讀寫權(quán)限,Registry會指向一個token服務,強制用戶的每次docker pull/push請求都要攜帶一個合法的token,Registry會通過公鑰對token 進行解密驗證。
  Core services: 這是Harbor的核心功能,主要提供以下服務:
  UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對用戶進行授權(quán)。 webhook:為了及時獲取registry
  上image狀態(tài)變化的情況, 在Registry上配置webhook,把狀態(tài)變化傳遞給UI模塊。
  token服務:負責根據(jù)用戶權(quán)限給每個docker push/pull命令簽發(fā)token.Docker
  客戶端向Regi?stry服務發(fā)起的請求,如果不包含token,會被重定向到這里,獲得token后再重新向Registry進行請求。
  Database:為coreservices提供數(shù)據(jù)庫服務,負責儲存用戶權(quán)限、審計日志、Docker image分組信息等數(shù)據(jù)。
  Log collector:為了幫助監(jiān)控Harbor運行,負責收集其他組件的log,供日后進行分析。
  技術(shù)實現(xiàn)
  Harbor的每個組件都是以Docker 容器的形式構(gòu)建的,因此很自然地,我們使用Docker Compose來對它進行部署。
  在源代碼中(https://github.com/vmware/harbor), 用于部署Harbor的Docker Compose 模板位于 /Deployer/docker-compose.yml. 打開這個模板文件,會發(fā)現(xiàn)Harbor由5個容器組成:
  proxy: 由Nginx 服務器構(gòu)成的反向代理。registry:由Docker官方的開源registry 鏡像構(gòu)成的容器實例。ui: 即架構(gòu)中的core services, 構(gòu)成此容器的代碼是Harbor項目的主體。mysql: 由官方MySql鏡像構(gòu)成的數(shù)據(jù)庫容器。log: 運行著rsyslogd的容器,通過log-driver的形式收集其他容器的日志。
  這幾個容器通過Dockerlink的形式連接在一起,這樣,在容器之間可以通過容器名字互相訪問。對終端用戶而言,只需要暴露proxy(即Nginx)的服務端口。
  工作原理
  下面以兩個Docker 命令為例,講解主要組件之間如何協(xié)同工作。
  docker login
  假設我們將Harbor部署在IP 為192.168.1.10的虛機上。用戶通過docker login命令向這個Harbor服務發(fā)起登錄請求:
  # docker login 192.168.1.10
  當用戶輸入所需信息并點擊回車后,Docker 客戶端會向地址“192.168.1.10/v2/” 發(fā)出HTTP GET請求。Harbor的各個容器會通過以下步驟處理:
  
 ?。╝) 首先,這個請求會由監(jiān)聽80端口的proxy容器接收到。根據(jù)預先設置的匹配規(guī)則,容器中的Nginx會將請求轉(zhuǎn)發(fā)給后端的registry 容器;
 ?。╞) 在registry容器一方,由于配置了基于token的認證,registry會返回錯誤代碼401,提示Docker客戶端訪問token服務綁定的URL。在Harbor中,這個URL指向Core Services;
  (c) Docker 客戶端在接到這個錯誤代碼后,會向token服務的URL發(fā)出請求,并根據(jù)HTTP協(xié)議的Basic Authentication規(guī)范,將用戶名密碼組合并編碼,放在請求頭部(header);
 ?。╠) 類似地,這個請求通過80端口發(fā)到proxy容器后,Nginx會根據(jù)規(guī)則把請求轉(zhuǎn)發(fā)給ui容器,ui容器監(jiān)聽token服務網(wǎng)址的處理程序接收到請求后,會將請求頭解碼,得到用戶名、密碼;
  (e) 在得到用戶名、密碼后,ui容器中的代碼會查詢數(shù)據(jù)庫,將用戶名、密碼與mysql容器中的數(shù)據(jù)進行比對(注:ui 容器還支持LDAP的認證方式,在那種情況下ui會試圖和外部LDAP服務進行通信并校驗用戶名/密碼)。比對成功,ui容器會返回表示成功的狀態(tài)碼,并用密鑰生成token,放在響應體中返回給Docker 客戶端。
  至此,一次docker login 成功地完成了,Docker客戶端會把步驟(c)中編碼后的用戶名密碼保存在本地的隱藏文件中。
  docker push的流程
  
  用戶登錄成功后用docker push命令向Harbor 推送一個Docker image:
  # docker push 192.168.1.10/library/hello-world
 ?。╝) 首先,docker 客戶端會重復login的過程,首先發(fā)送請求到registry,之后得到token 服務的地址;
 ?。╞) 之后,Docker 客戶端在訪問ui容器上的token服務時會提供額外信息,指明它要申請一個對imagelibrary/hello-world進行push操作的token;
 ?。╟) token 服務在經(jīng)過Nginx轉(zhuǎn)發(fā)得到這個請求后,會訪問數(shù)據(jù)庫核實當前用戶是否有權(quán)限對該image進行push。如果有權(quán)限,它會把image的信息以及push動作進行編碼,并用私鑰簽名,生成token返回給Docker客戶端;
 ?。╠) 得到token之后Docker客戶端會把token放在請求頭部,向registry發(fā)出請求,試圖開始推送image。Registry 收到請求后會用公鑰解碼token并進行核對,一切成功后,image的傳輸就開始了。
  本文并未涉及Harbor項目本身的配置、部署,這方面請參考Harbor在github上的文檔:https://github.com/vmware/harbor
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

開源企業(yè)級容器Registry架構(gòu)簡介下載

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?