Harbor
harbor是vmware開源的企業級registry,可以讓你迅速的搭建自己的私有registry,harbor擴展的docker的registry,使harbor支持以下特性:
- RBAC 基於角色的權限控制
- 基於策略的鏡像複製
- 漏掃
- LDAP/AD支持
- 鏡像刪除和垃圾清理
- Notary 鏡像簽名
- 用戶界面
- 審計
- RESTful api
- 安裝簡單(基於compose)
組件
今天只聊聊harbor的架構,harbor主要有6大模塊,默認的每個harbor的組件都被封裝成一個docker container,所以可以通過compose來部署harbor,總共分爲8個容器運行,通過docker-compose ps來查看
簡易架構圖
harbor-adminserver /harbor/start.sh Up (healthy)
harbor-db /usr/local/bin/docker-entr ... Up (healthy) 3306/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-ui /harbor/start.sh Up (healthy)
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh serve /etc/ ... Up (healthy) 5000/tcp
- harbor-adminserver:harbor系統管理接口,可以修改系統配置以及獲取系統信息
- harbor-db:存儲項目的元數據、用戶、規則、複製策略等信息
- harbor-jobservice:harbor裏面主要是爲了鏡像倉庫之前同步使用的
- harbor-log:收集其他harbor的日誌信息。rsyslogd
- harbor-ui:一個用戶界面模塊,用來管理registry。主要是前端的頁面和後端CURD的接口
- nginx:harbor的一個反向代理組件,代理registry、ui、token等服務。這個代理會轉發harbor web和docker client的各種請求到後端服務上。是個nginx。nginx負責流量轉發和安全驗證,對外提供的流量都是從nginx中轉,它將流量分發到後端的ui和正在docker鏡像存儲的docker registry
- registry:存儲docker images的服務,並且提供pull/push服務。harbor需要對image的訪問進行訪問控制,當client每次進行pull、push的時候,registry都需要client去token服務獲取一個可用的token。
- redis:存儲緩存信息
- webhook:當registry中的image狀態發生變化的時候去記錄更新日誌、複製等操作。
token service:在docker client進行pull/push的時候今天token的發放。
harbor-login
a nginx代理在80端口收到client發來的請求,然後把該請求轉發到後端的registry。
b registry收到請求,因爲registry是配置的token-based的認證,所以會直接返回一個401狀態碼,然後返回一個url,通知client去哪裏獲取token,也就是token service
c 當docker client收到這個url後,會對這個url發起請求,需要在請求頭中植入用戶名和密碼。
d 當請求到達nginx反向代理後,nginx會把該請求轉發至ui服務上,因爲ui符合token服務在一個容器裏面,token服務會解碼請求頭中用戶名和密碼
e 拿到用戶名和密碼後會和db中的進行對比,如果驗證無誤,則返回成功,在返回的http請求中包含一個私有key
harbor-push
省略了proxy轉發這一步
當你登錄harbor成功後,docker push就可以使用了。
a docker client和registry交互,獲取到token service的url
b 隨後docker client和token service交互,告訴token需要進行push操作
c token服務查看db,該用戶是否有相關的權限來push image,如果有相關權限,則返回一個私有的key
d docker client拿到token後,會對registry發起push請求,當registry收到請求後,會用自己的公鑰解密token,如果驗證token是合格的,則開始image傳輸過程
附加
clair
是 coreos 開源的容器漏洞掃描工具,在容器逐漸普及的今天,容器鏡像安全問題日益嚴重。clair 是目前少數的開源安全掃描工具,主要提供OS(centos,debian,ubuntu等)的軟件包脆弱性掃描。clair的可以單機部署也可以部署到k8s上,可以與現有的registry集成。harbor 很好的整合了 clair ,通過簡單的UI就可以對上傳的鏡像掃描,還可以通過每天的定時掃描對所有鏡像進行統一掃描,架構如下:
Notary
是一套docker鏡像的簽名工具, 用來保證鏡像在pull,push和傳輸工程中的一致性和完整性。避免中間人攻擊,避免非法的鏡像更新和運行。