Harbor架构

由于docker registry只提供了基本的镜像上传下载保存功能,在用户认证及鉴权、多用户管理、安全扫描、镜像清理、镜像同步等部分有所欠缺,因此如果要在公司内部使用镜像仓库,推荐使用harbor。

Harbor 2.0版本支持OCI(Open Container Initiative)镜像(如镜像、Helm Chart等)以及OCI镜像索引。镜像索引是一种high level manifest,指向一个manifest列表。通过镜像索引,可以根据client端的架构不同,自动下载对应架构的镜像。(创建多架构支持的镜像方法参考

Harbor 2.0的整体架构如下图所示。


image.png

整个Harbor架构可以分为三层,分别为Consumer、Fundamental Service和Data Access Layer。

Consumer是Harbor的使用方。除了Harbor自带的前端界面(web portal)外,也可以通过其他client访问harbor,如kubelet、helm、docker等。

Fundamental Service模块较多,后面介绍。

Data Access Layer用于数据存储。主要有三块:

  • 键值对存储: 使用的是Redis。redis主要用来进行registry缓存、session存储包括后期的helm chartmuseum缓存。
  • 数据存储: 用于存储registry(镜像)和chart数据。支持对接块存储、文件存储和对象存储。
  • 数据库: 使用的是PG,存储Harbor使用到的各个表。包括projects, users, roles, replication policies, tag retention policies, scanners, charts, images等

下面介绍下Fundamental Service的各个组成模块。

Harbor自带的模块主要有以下几个:

  • Core: Core模块包含较多子模块,每个模块中也有自己的子模块。
    • API Server: 接收Rest 请求,并通过子模块处理后返回结果。
      • Authentication & Authorization
        • Authentication服务:通过本地数据库、AS/LDAP或OIDC对请求进行Authentication(登陆认证)
        • Authorization服务:对action进行RBAC鉴权,如pull/push镜像。
        • Token Service:根据用户对project的权限,签发不同的token用于push/pull等操作。如果docker client发送的请求不含token,Registry会将请求重定向到token服务。
      • MiddleWare: 中间件用于请求的预处理,确定请求是否需要转发到后端。包含的预处理功能有“quota management”, “signature check”, “vulnerability severity check”和“robot account parsing”等。
      • API Handlers: 解析、验证请求参数,根据相应的API controller完成业务逻辑处理,并生成相应的响应。
    • Config Manager: 系统配置管理。
    • Project Management: 管理Project(namespace)。
    • Quota Manager: 管理Project的quota配额。
    • Chart Controller: 转发chart相关的处理请求到后端chartmuseum 。提供了一些扩展来优化chart管理。
    • Retention Manager:管理tag回收(保留)策略,并执行和监控。
    • Content Trust: 方便使用Notary功能的一个扩展(插件)。
    • Replication Controller: 管理镜像复制(备份)策略,并执行和监控;适配不同registry。当前适配的registry有docker registry、Docker hub、Huawei SWR等,参考架构图。
    • Scan Manager: 镜像扫描,提供扫描结果。支持对接Trivy,Clairs等。
    • Notification Manager:webhook回调管理。支持HTTP POST请求和Slack channel。
    • OCI Artifact Manager:提供OCI制品的全生命周期管理(CRUD)。包括安全扫描报告、镜像构建历史等镜像元数据及额外信息的管理;helm charts的readme、dependencies、value.yaml文件管理;制品的Tag管理等。
    • Registry Driver: 与底层的registry(目前是docker registry)进行通信的registry client SDK。OCI Artifact Manager需要通过该组件获取制品的manifest及Config JSON等信息。
  • GC controller: GC。删除镜像后,需要通过GC将存储空间释放。
  • Log Collector: 日志记录。
  • Job Service: 异步任务处理。如镜像定时扫描等。

依赖的外部模块有:

  • Proxy:提供代理服务,使用的是Nginx,将consumer的请求代理转发到后端的各个模块。
  • Notary:Notary 是一套镜像的签名工具, 用来保证镜像层在 pull、push、transfer 过程中的一致性和完整性。避免中间人攻击,阻止非法的镜像更新和运行。镜像层的创建者可以对镜像层做数字签名,生成摘要,保存在 Notary 服务中。开启 Content Trust 机制之后,未签名的镜像无法被拉取。

关于notary的详细功能见: https://github.com/zj1244/Blog/blob/master/2019/harbor%E7%9A%84Notary%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95.md

  • Chart Museum:用于保存helm chart镜像的组件。
  • Docker Distribution(docker registry):harbor本身不提供镜像上传/下载等功能,相关功能是通过调用docker registry的API实现的。因此,需要依赖到docker registry服务。
    另外支持对接一些外部模块,如镜像扫描使用的Clair和Trivy,镜像备份使用的Docker Distribution、Docker Hub等。

docker login的过程

  1. Proxy在80端口接收到请求,并转发给Registry container。
  2. Registry container需要token-based authentication。会返回401,并告诉client从指定的URL(指向token service)获取token。
  3. docker client发送请求到token service。(请求头中包含username和password,用于HTTP的basic authentication)
  4. proxy在80端口接收到请求后,会将请求转发到UI container中(UI container中包含token service)。token service接收到请求后,获取其中的username和password。
  5. token service将username和password在数据库或者是LDAP/AD等服务中进行authentication。成功后,返回一个HTTP状态码表示认证成功,并将通过私钥生成的token放在返回的body中。
  6. docker client接收到成功的返回后,将用户名密码编码后保存在本地的文件中。

docker push镜像过程。

docker push xxx/library/hello-world

  1. 首先,同登陆一样,docker client会发送请求,并拿到token service的URL。
  2. 然后,docker client向token service发送请求,除了用户名密码外,在请求中还会提供一些额外信息(action为push,resource为library/hello-world)。
  3. token service查询数据库,获取用户绑定的角色(role),查看是否有权限进行push镜像。有权限则编码push操作对应的信息,并使用私钥签发token给docker client。
  4. docker client发送push请求到registry,并在header中带上token。registry使用公钥解码token后,验证内部信息。如果验证通过,则开始上传流程。
    如果需要临时访问密钥,则可以用harbor的私钥签发一个带有时效的token即可。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容