共计 3091 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章将为大家详细讲解有关如何理解企业级容器 Registry 开源项目 Harbor 架构,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
1. Harbor 项目
VMware 公司最近开源了企业级 Registry 项目 Harbor,由 VMware 中国研发的团队负责开发。Harbor 项目是帮助用户迅速搭建一个企业级的 registry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),镜像远程复制(同步),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文,对广大中国用户是一个好消息。本文将介绍 Harbor 项目的主要组件,并阐述 Harbor 的工作原理。
(源代码地址:https://github.com/vmware/harbor )
2. 架构介绍
1) 主要组件
Harbor 在架构上主要由 6 个组件构成:
· Proxy:Harbor 的 registry, UI, token 等服务,通过一个前置的反向代理统一接收浏览器、Docker 客户端的请求,并将请求转发给后端不同的服务。
· Registry:负责储存 Docker 镜像,并处理 docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对 Docker image 有不同的读写权限,Registry 会指向一个 token 服务,强制用户的每次 docker pull/push 请求都要携带一个合法的 token, Registry 会通过公钥对 token 进行解密验证。
· Core services:这是 Harbor 的核心功能,主要提供以下服务:
o UI:提供图形化界面,帮助用户管理 registry 上的镜像(image), 并对用户进行授权。
o webhook:为了及时获取 registry 上 image 状态变化的情况,在 Registry 上配置 webhook,把状态变化传递给 UI 模块。
o token 服务:负责根据用户权限给每个 docker push/pull 命令签发 token. Docker 客户端向 Regiøstry 服务发起的请求, 如果不包含 token,会被重定向到这里,获得 token 后再重新向 Registry 进行请求。
· Database:为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他 Harbor 实例中。
· Log collector:为了帮助监控 Harbor 运行,负责收集其他组件的 log,供日后进行分析。
各个组件之间的关系如下图所示:
2) 实现
Harbor 的每个组件都是以 Docker 容器的形式构建的,因此很自然地,我们使用 Docker Compose 来对它进行部署。
在源代码中(https://github.com/vmware/harbor), 用于部署 Harbor 的 Docker Compose 模板位于 /Deployer/docker-compose.yml. 打开这个模板文件,会发现 Harbor 由 5 个容器组成:
· proxy: 由 Nginx 服务器构成的反向代理。
· registry: 由 Docker 官方的开源 registry 镜像构成的容器实例。
· ui: 即架构中的 core services, 构成此容器的代码是 Harbor 项目的主体。
· mysql: 由官方 MySql 镜像构成的数据库容器。
job services: 通过状态机机制实现远程镜像复制功能,包括镜像删除也可以同步到远端 Harbor 实例。
· log: 运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志。
这几个容器通过 Docker link 的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露 proxy(即 Nginx)的服务端口。
3. 工作原理
下面以 两个 Docker 命令为例,讲解主要组件之间如何协同工作。
docker login
假设我们将 Harbor 部署在 IP 为 192.168.1.10 的虚机上。用户通过 docker login 命令向这个 Harbor 服务发起登录请求:
# docker login 192.168.1.10
当用户输入所需信息并点击回车后,Docker 客户端会向地址“192.168.1.10/v2/”发出 HTTP GET 请求。Harbor 的各个容器会通过以下步骤处理:
(a) 首先,这个请求会由监听 80 端口的 proxy 容器接收到。根据预先设置的匹配规则,容器中的 Nginx 会将请求转发给后端的 registry 容器;
(b) 在 registry 容器一方,由于配置了基于 token 的认证,registry 会返回错误代码 401,提示 Docker 客户端访问 token 服务绑定的 URL。在 Harbor 中,这个 URL 指向 Core Services;
(c) Docker 客户端在接到这个错误代码后,会向 token 服务的 URL 发出请求,并根据 HTTP 协议的 Basic Authentication 规范,将用户名密码组合并编码,放在请求头部(header);
(d)类似地,这个请求通过 80 端口发到 proxy 容器后,Nginx 会根据规则把请求转发给 ui 容器,ui 容器监听 token 服务网址的处理程序接收到请求后,会将请求头解码,得到用户名、密码;
(e) 在得到用户名、密码后,ui 容器中的代码会查询数据库,将用户名、密码与 mysql 容器中的数据进行比对(注:ui 容器还支持 LDAP 的认证方式,在那种情况下 ui 会试图和外部 LDAP 服务进行通信并校验用户名 / 密码)。比对成功,ui 容器会返回表示成功的状态码,并用密钥生成 token,放在响应体中返回给 Docker 客户端。
这个过程中组件间的交互过程如下图所示:
至此,一次 docker login 成功地完成了,Docker 客户端会把步骤 (c) 中编码后的用户名密码保存在本地的隐藏文件中。
2. docker push
用户登录成功后用 docker push 命令向 Harbor 推送一个 Docker image:
# docker push 192.168.1.10/library/hello-world
(a) 首先,docker 客户端会重复 login 的过程,首先发送请求到 registry, 之后得到 token 服务的地址;
(b) 之后,Docker 客户端在访问 ui 容器上的 token 服务时会提供额外信息,指明它要申请一个对 image library/hello-world 进行 push 操作的 token;
(c) token 服务在经过 Nginx 转发得到这个请求后,会访问数据库核实当前用户是否有权限对该 image 进行 push。如果有权限,它会把 image 的信息以及 push 动作进行编码,并用私钥签名,生成 token 返回给 Docker 客户端;
(d) 得到 token 之后 Docker 客户端会把 token 放在请求头部,向 registry 发出请求,试图开始推送 image。Registry 收到请求后会用公钥解码 token 并进行核对,一切成功后,image 的传输就开始了。
我们省去 proxy 转发的步骤,下图描述了这个过程中各组件的通信过程:
关于如何理解企业级容器 Registry 开源项目 Harbor 架构就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。