转载本文需注明出处:EAii企业架构创新研究院(微信号:eaworld),违者必究。如需下载此文PPT,加入微信群参与微课堂、架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”。
目录:
1.背景
2.开源Docker Registry的不足
3.新的选择--Harbor
4.Harbor的使用
背景
公司于去年启动了新一代数字化企业云平台的研发,基于DevOps打造新一代的企业云计算平台,底层的容器云平台是重要的可选组件。容器云目前启动了第三版的重构,一些组件又有了重新选型的机会。
DevOps这个概念已经出来很多年了,相信大家已经不陌生了,说简单点,它就是开发(Development)和运维(Operations)这两个领域的合并。那么为什么要合并这两个领域?原因很多,但首要原因是:目前这两个领域的工作流程是脱节的,绝对的脱节。很多公司的开发部门和运维部门之间存在的深刻矛盾,其实就是这个“脱节”造成的。
开发部门在产品研发的时候,没有充分考虑部署要求,开发完了只管丢给运维去上线。运维拿到东西上线困难,回来找开发,开发却不一定认可,双方扯来扯去,最后开发修改,运维又有问题再来回找开发,不断循环。最后导致整个产品上线效率低下,运行不稳定。
公司的新一代数字化企业云平台,就是希望基于Devops理念,为企业打造集人员,需求,开发,自动构建,测试,运维一体的企业云平台。我们来看一下我们平台整体的逻辑架构:
从上图可以看出,平台在逻辑上是分成多层的,硬件上有基础设施平台,基础设施平台上又有基础服务平台,最上层则是各种微应用。DevoOps则是纵跨多层,它由多个领域系统构成,如TM(租户管理),PM(项目管理),SRM(软件资源管理),SCM(软件配置管理)等等,协调并管理整个平台资源。其中,基础设施平台中有IaaS,也有CaaS。IaaS与CaaS都是可选组件,他们可以只有一个,也可以两者都有。两者都有的时候,CaaS可以存在于IaaS之中。这里图中的CaaS指的是我们的容器云。
我们再来看一下我们的DevOps平台的整体技术选型:
如图,在选型时,我们将整个平台主要分成了三块。容器云对应基础设施层中的容器层。容器目前采用的是Docker, 平台管理用了谷歌的kubernetes, 容器网络目前是用的flannel,dns用的skydns, 平台系统使用的是coreos。容器镜像仓库,容器云的前两个小版本,我们使用的是开源的Docker Registry,配合nginx搭建容器镜像私库,使用还比较稳定,但也发现了它的一些不足。
开源Docker Registry的不足
同很多团队进行容器云构建的初始阶段一样,一开始我们并不太注重安全,容器仓库一般都是配置成insecure-registry直接使用。这次,我们决定加强安全方面的控制。我们发现了它的一些不足如下:
用户与鉴权
Docker Registry V2可以基于htpasswd文件进行简单的用户管理,但是维护不便,也没有对外的API可供集成。
缺少日志与审记
Docker Registry没有日志收集能力,也缺少审记。
复制与同步
在不同的Registry实例之间复制镜像是十分普遍的需求,但Docker Registry只支持将公有Registry的镜像同步至私有仓库 。
镜像删除不便
Docker客户端没有提供删除仓库镜像的命令,删除仓库中的镜像,只能通过其它工具调用rest api 。
缺少图形化的管理界面
要想补上这些缺点,需要在自已的容器云中做一些加强,需要工作量。除了Docker Registry,还有没有其它的选择,已经补齐了这些能力,或部分补齐了呢?于是,我们做了一点小了解。
目前业界可选的Containger Registry主要有如下:
Docker Hub 提供了直观的界面、自动化构建、私有仓库以及众多官方镜像。这是官方的公有库,下载镜像必须联接外网。
Docker Registry 最流行的开源registry。你可以在自己的设施上运行或者使用Docker Hub。
Quay.io 最初由一个两人工作室开发的产品,专注于Docker私有库。目前已被Coreos收购。
CoreOS Enterprise Registry Coreos收购Quay.io之后推出的企业级Containger Registry,提供细化权限和审计跟踪。
Nexus 3.0 nexus原来只是一个maven的仓库服务器,升级到3.0之后,也可以使用它对docker的镜像进行管理。
Harbor vmware开源的企业级容器registry,基于开源的Docker Registry进行增强。
Docker Hub相信大家都不陌生,用来做私库的源库是可以的,可以将一些基础镜像从这个云库拉到私库中。它并不适合在容器云中直接使用,下载镜像时需要连外网,速度也是个大问题。
Docker Registry就不说了,接下来的Quay.io,CoreOS Enterprise Registry是付费的,或者是商业付费的,不考虑。Nexus 3有图形化的管理页面可以操作镜像,但其它的能力与Docker Registry差不多。最后看到的harbor,则令我们眼前一亮。
新的选择--Harbor
Harbor是VMware公司于2016年开源的企业级Docker Registry项目。它是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。
作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Harbor的特点如下:
基于角色的访问控制 - 用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制 - 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面 - 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP 支持 - Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
RESTful API - RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单 - 提供在线和离线两种安装工具,也可以安装到vSphere平台(OVA方式)虚拟设备。
Harbor基于Docker Registry做了增强,添加了很多企业级管理需要的能力,使原来能力较弱的Docker Registry更适合于生产环境中使用。
我们再看看Harbor的整体架构:
Harbor在架构上主要由五个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理dockerpush/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。 webhook:为了及时获取registry上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。token服务:负责根据用户权限给每个docker push/pull命令签发token.Docker客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为coreservices提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
我们再来看一个harbor的核心概念
以上是Harbor的核心概念。一个项目可以看成一个用户的小私库,项目成员按照其角色,可以上传,下载,删除镜像,或添加删除成员等。系统管理员可以创建镜像库复制目标,为项目设置复制策略,可以从其它的镜像库复制镜像过来。复制策略会产生复制任务。项目下面可拥有多个镜像,而每个镜像则可以有多个镜像标签。项目包含日志。
Harbor的使用
harbor提供了web ui。我们来看一下harbor是如何使用的:
首先是通过管理员创建新的用户,然后登陆至新用户,使用新用户创建项目。这样新用户就会自动成为这个用户的项目管理员。
接下来可以使用新创建的用户,在docker命令行中登陆至镜像仓库,并上传镜像。注意,登陆的时候,指定为整个镜像仓库的地址,而不是仓库地址加项目名称。镜像要上传至指定项目下,需要为镜像打上 "镜像仓库地址/项目名/镜像名:镜像tag" 这样格式的tag,再去执行镜像上传才可以。
镜像上传完成了,可以在web ui中项目下看到它的信息。可以在web页面中很方便地删除整个镜像,或者删除镜像的单个Tag。使用docker client登陆之后,也可以下载到上传上去的镜像。
项目创建之后,项目管理员可以再为项目添加新的成员。成员有角色之分,项目管理员,开发人员与访客。项目管理员有最大的权限,开发人员可以上传下载删除镜像,访客只能下载镜像。
系统管理员可以创建复制目标,以便为项目创建复制策略。创建复制目标时,需要指定目标的url及用户名与密码。目标可以是harbor,也可以就是docker registry。
复制目标创建好了,就可以在项目下创建复制策略。复制策略一创建好,马上就会启动复制任务,将项目下的镜像push至目标仓库。同步时,只同步镜像,harbor的项目等不在同步范围之内。
这一篇主要讲了我们选型harbor的过程。并没有做太多的对比研究,主要还是沿着原来的老路子,只是有了更完善的方案。然后介绍了一下harbor的特点,架构及核心概念,最后以harbor本身的web-ui为例,介绍了harbor的使用,主的是让大家对harbor有一个比较全面的了解。
下一篇中,我们将着重介绍harbor的用户,同步与复制等设计,以及harbor的部署,如何集成,有兴趣的同学欢迎持续关注。
关于作者:
秦双春
现任普元云计算架构师。曾在PDM,云计算,数据备份,移动互联相关领域公司工作,10年IT工作经验。曾任上海科企软件桌面虚拟化产品的核心工程师,主导过爱数TxCloud云柜的设计与开发,主导过万达信息的食安管理与追溯平台的移动平台开发。国内云计算的早期实践者,开源技术爱好者,容器技术专家。
关于EAII
EAII(Enterprise Architecture Innovation Institute)企业架构创新研究院,致力于软件架构创新与实践,加速企业数字化转型。
eaworld项目(微信号:eaworld,长按二维码关注)
eaworld是EAII的官方微信账号。
明日下午14:30,微课堂持续进行中,敬请期待!