Docker&Kubernetes

Harbor架构

2021-12-16  本文已影响0人  wangfeiq

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

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

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用于数据存储。主要有三块:

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

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

依赖的外部模块有:

关于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

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即可

最后,提供一个简单的功能结构图。mysql已经被PG取代,仅供参考。来源:https://www.codetd.com/article/5278710

image.png

docker registry推拉镜像过程图。 来源: https://www.jianshu.com/p/07041223df66

image.png
image.png
上一篇下一篇

猜你喜欢

热点阅读