为何有了Docker registry还须要Harbor?

本文转自微信号EAWorld。扫描下方二维码,关注成功后,回复“普元方法+”,将会得到热门课堂免费学习机会!
目录:
1、Harbor的安全机制
2、Harbor的镜像同步
3、Harbor与K8s的集成实践
4、两个小贴士
5、总结
Habor是由VMWare公司开源的容器镜像仓库。事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而得到了更加普遍的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制 ,AD/LDAP集成以及审计日志等。
容器的核心在于镜象的概念,因为能够将应用打包成镜像,并快速的启动和中止,所以容器成为新的煊赫一时的基础设施CAAS,并为敏捷和持续交付包括DevOps提供底层的支持。
而Habor和Docker Registry所提供的容器镜像仓库,就是容器镜像的存储和分发服务。之因此会有这样的服务存在,是因为如下三个缘由:
一、提供分层传输机制,优化网络传输
Docker镜像是是分层的,而若是每次传输都使用全量文件(因此用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,肯定传输的对象。
二、提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,须要有一个用户界面能够支持登录、搜索功能,包括区分公有、私有镜像。
三、支持水平扩展集群
当有用户对镜像的上传下载操做集中在某服务器,须要对相应的访问压力做分解。
上面这些就是Docker Registry所完成的主要工做,而Habor在此之上,又提供了用户、同步等诸多特性,这篇文章中咱们就这几个方面做一些阐述,同时实例代码介绍Harbor与K8s的集成。html

1、Harbor的安全机制java

企业中的软件研发团队每每划分为诸多角色,如项目经理、产品经理、测试、运维等。在实际的软件开发和运维过程当中,这些角色对于镜像的使用需求是不同的。从安全的角度,也是须要经过某种机制来进行权限控制的。
举例来讲,开发人员显然须要拥有对镜像的读写(PULL/PUSH)权限以更新和改正代码;测试人员中须要读取(PULL)权限;而项目经理须要对上述的角色进行管理。
Harbor为这种需求提供了用户和成员两种管理概念。
在Harbor中,用户主要分为两类。一类为管理员,另外一类为普通用户。两类用户均可以成为项目的成员。而管理员能够对用户进行管理。
成员是对应于项目的概念,分为三类:管理员、开发者、访客。管理员能够对开发者和访客做权限的配置和管理。测试和运维人员能够访客身份读取项目镜像,或者公共镜像库中的文件。
从项目的角度出发,显然项目管理员拥有最大的项目权限,若是要对用户进行禁用或限权等,能够经过修改用户在项目中的成员角色来实现,甚至将用户移除出这个项目。
图片描述git

2、Harbor的镜像同步github

为何须要镜像同步
因为对镜像的访问是一个核心的容器概念,在实际使用过程当中,一个镜像库多是不够用的,下例状况下,咱们可能会须要部署多个镜像仓库:
国外的公有镜像下载过慢,须要一个中转仓库进行加速
容器规模较大,一个镜像仓库不堪重负
对系统稳定性要求高,须要多个仓库保证高可用性
镜像仓库有多级规划,下级仓库依赖上级仓库
更经常使用的场景是,在企业级软件环境中,会在软件开发的不一样阶段存在不一样的镜像仓库,
在开发环境库,开发人员频繁修改镜像,一旦代码完成,生成稳定的镜像即须要同步到测试环境。
在测试环境库,测试人员对镜像是只读操做,测试完成后,将镜像同步到预上线环境库。
在预上线环境库,运维人员对镜像也是只读操做,一旦运行正常,即将镜像同步到生产环境库。
在这个流程中,各环境的镜像库之间都须要镜像的同步和复制。
Harbor的镜像同步机制
有了多个镜像仓库,在多个仓库之间进行镜像同步立刻就成为了一个广泛的需求。比较传统的镜像同步方式,有两种:web

第一种方案,使用Linux提供的RSYNC服务来定义两个仓库之间的镜像数据同步。
第二种方案,对于使用IaaS服务进行镜像存储的场景,利用IaaS的配置工具来对镜像的同步进行配置。
这两种方案都依赖于仓库所在的存储环境,而须要采用不一样的工具策略。Harbor则提供了更加灵活的方案来处理镜像的同步,其核心是三个概念:
用Harbor本身的API来进行镜像下载和传输,做到与底层存储环境解耦。
利用任务调度和监控机制进行复制任务的管理,保障复制任务的健壮性。在同步过程当中,若是源镜像已删除,Harbor会自动同步删除远端的镜像。在镜像同步复制的过程当中,Harbor会监控整个复制过程,遇到网络等错误,会自动重试。
提供复制策略机制保证项目级的复制需求。在Harbor中,能够在项目中建立复制策略,来实现对镜像的同步。与Docker Registry的不一样之处在于,Harbor的复制是推(PUSH)的策略,由源端发起,而Docker Registry的复制是拉(PULL)的策略,由目标端发起。
图片描述
Harbor的多级部署
在实际的企业级生产运维场景,每每须要跨地域,跨层级进行镜像的同步复制,好比集团企业从总部到省公司,由省公司再市公司的场景。
这一部署场景可简化以下图:
图片描述
更复杂的部署场景以下图:
图片描述
3、Harbor与K8s的集成实践
Harbor提供了基于角色的访问控制机制,并经过项目来对镜像进行组织和访问权限的控制。kubernetes中经过namespace来对资源进行隔离,在企业级应用场景中,经过将二者进行结合能够有效将kubernetes使用的镜像资源进行管理和访问控制,加强镜像使用的安全性。尤为是在多租户场景下,能够经过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
集成的核心概念和关键步骤
二者的集成,一个核心概念是k8s的secret。做为kubernetes中一个重要的资源secret,它的设计初衷是为了解决容器在访问外部网络或外部资源时验证的问题,例如访问一个Git仓库,链接一个数据库,设置一些密码配置等,须要额外验证的场景Secret存储了敏感数据,例如能容许容器接受请求的权限令牌。经过将Harbor的用户信息与K8s的Secret相关联,即达成了二者的集成。步骤以下:
在Harbor中建立建立用户,项目,将项目设置为私有。
将建立的用户加入到项目中,设置用户的角色为开发者或者为项目管理员。确保该帐户具备拉取该仓库镜像的权限。
建立K8s下的Secret,其中secret中的用户名、密码和邮箱地址信息为在Harbor中建立的用户的信息。
在此过程当中须要注意的是,第三步中建立的secret,对应的用户必须在Harbor的对应私库中有下载镜像的权限,不然应用部署时会报没法下载镜像。
举例来讲
在Harbor中建立了用户,如userD
在Harbor中建立一个私有项目,如projectA
在Harbor中使用Docker命令行登录并上传镜像至步骤2中的私有库
在K8s中建立Namespace
在K8s的Namespace中建立SecretC,该Secret对应Harbor中的用户帐号userD
使用Harbor私库中的镜像在K8s的Namespace中部署应用,指定镜像下载时使用上面建立的SecretC
若是只须要可以拉取Harbor的镜像在K8s中部署应用,Harbor中的userD须要在projectA中有最低权限的访客成员角色。
Harbor与K8s集成的代码实践
imagePullSecret在K8s中用来保存镜像仓库的认证信息,以方便Kubelet在启动Pod时,可以得到镜像仓库的认证信息,确保能Kubelet够有权限从镜像仓库中下载Pod所需的镜像。
首先咱们来看一下k8s中的ImagePull类型的Secret如何来建立。官方文档为:https://kubernetes.io/docs/user-guide/images/#specifying-imagepullsecrets-on-a-pod
如下代码实践Harbor版本是0.3.5。
首先,咱们须要在harbor中选择一个用户,使用它的用户名与密码生成一个字符串,用户名与密码中间用冒号相连,而后使用base64对它进行加密,以下所示:[root@k8s-01 ~]# echo “test:tT001”|base64
dGVzdDp0VDAwMQo=
而后,咱们须要生成一个dockerconfig.json,须要使用上面生成的加密字符串,内容大体以下,假如对应的harbor库的地址为:hub.testharbor.com:
{
“auths”:{
“hub.testharbor.com”: {
“auth”: “dGVzdDp0VDAwMQo=”,
“email”: “”
}
}
}
咱们须要把这整个json使用base64进行加密。生成的字符串可能比较长,须要加上 -w 0 参数,不让它换行。将上面的json保存成dockerconfig.json文件,而后执行命令:
[root@k8s-01 secret]# cat dockerconfig.json |base64 -w 0
ewogICJhdXRocyI6IHsKICAgICJodWIudGVzdGhhcmJvci5jb20iOiB7CiAgICAgICJhdXRoIjogImRHVnpkRHAwVkRBd01Rbz0iLAogICAgICAiZW1haWwiOiAiIgogICAgfQogIH0KfQo=
如今,咱们能够来建立secret所需的yaml了。secret建立的时候,必须指定namespace。多个namespace中的secret能够同名。假如咱们须要在名为hub中的namespace中建立名为testsecret的secret,对应的secret.yaml内容以下。须要使用上面生成的加密字符串。
此时在k8s中使用kubectl create 命令便可建立对应的secret:
kubectl create -f secret.yaml
最后,在部署应用的时候,咱们须要为Pod指定下载镜像所需的secret名字,以下所示:
apiVersion: v1
kind: Pod
metadata:
name: httpdpod
namespace: hub
spec:
containers:
- name: httpdpod
image:hub.testharbor.com/project1/httpd:2.2
imagePullSecrets:
- name:testsecret
注意,要想部署成功,test用户必须为harbor中的project1项目中的成员,它才能有下载这个httpd:2.2的权限。
容器云的用户与集成
做为容器云运行时,Harbor的用户与K8s的Secret能够有更集约的整合方式。在咱们的项目实践中,一个容器云的用户与一个Harbor中同名Project一一对应,但此用户能够在k8s中能够建立多个namespace。为了简化管理过程,目前咱们的作法是:
在容器云启动过程当中,自动在Harbor中建立一个专用用户,专门用来在各私库中下载镜像
每一个在Harbor中新建的私库,都会将这个专用用户添加为它的访客成员角色 ,使这个专用用户拥有下载此库中镜像的权限
在K8s中,每建立一个新的namespace的同时,在此namespace下,使用上面的专用用户的信息建立固定名称的secret(多namespace中可存在同名secret)
部署应用时,指定imagePullSecrets下面的名称为上面固定的secret名称。docker

4、两个小贴士数据库

使用在线工具让Harbor的接口文档更易读
Harbor对外提了restful形式的接口供其它系统集成,它的接口描述以swagger格式的文档包含在源码中,文档地址为: https://github.com/vmware/harbor/blob/master/docs/swagger.yaml
目前,愈来愈多的系统使用restful的接口对外暴露服务,而swagger已经成了事实上的restful接口的描述标准。直接使用文本编辑器去查看这种swagger文档,会有点晕,无法方便清晰地查看接口的总体结构。咱们能够借助一些工具来看这些文档。在线的,好比官方提供的swagger在线编辑器,把文档内容复制至左边,右边便可显示html格式的文档,能够折叠等,让人对全部接口一目了然。离线的,则能够在一些编辑器安装插件,将它一样转化成html进行查看,好比vscode,安装 Swagger Viewer插件便可。关于Swagger的使用,也能够阅读个人同事李小飞的文章《微服务架构实战:Swagger规范RESTful API》。
两种格式的文档展现以下:
图片描述
小贴士:Harbor的Java Client开源实现
对于熟悉Java编程的用户来讲,Harbor官方没有提供java client,可是在github上也有人写了相关的项目,项目地址:https://github.com/grissomsh/harbor-java-client
图片描述编程

5、总结json

本文主要介绍了Harbor的用户机制、镜像同步和与K8s的集成实践。
Harbor的用户机制分为系统用户和项目成员两类。用户能够成为项目成员,而不一样成员有不一样的镜像读写权限。
Harbor的同步策略和任务调度机制,为镜像库间的镜像同步提供了灵活的机制。
利用K8s的Secret与Harbor用户的关联,能够在K8s中拉取Harbor私有库中的镜像来部署应用。咱们也用代码进行了举例。api

最后,再分享几个在Harbor(0.3.5)的使用过程当中碰到的小坑:
在Harbor中建立用户时,密码必须为复杂密码。可是修改时,没有了此限制
用户更新密码的时候,原密码不能与新密码一致,不然报500内部错误
在为harbor的project添加成员的时候,成员角色没有相关API,须要给的id值也没有常量定义,目前来看,1为admin, 2为devlop,3为guest。

关于做者:

秦双春

现任普元云计算架构师。曾在PDM,云计算,数据备份,移动互联相关领域公司工做,10年IT工做经验。曾任上海科企软件桌面虚拟化产品的核心工程师,主导过爱数TxCloud云柜的设计与开发,主导过万达信息的食安管理与追溯平台的移动平台开发。国内云计算的早期实践者,开源技术爱好者,容器技术专家。
图片描述
关于EAWorld
微服务,DevOps,元数据,企业架构原创技术分享,EAii(Enterprise Architecture Innovation Institute)企业架构创新研究院旗下官方微信公众号。

扫描下方二维码,关注成功后,回复“普元方法+”,将会得到热门课堂免费学习机会!
微信号:EAWorld。
图片描述
全新形态的PWorld2017盛大开启,首四场定于7月1日在北京、上海、广州、成都四城同步举行。CSDN专项报名通道可得到现场伴手礼个性T恤一件!

7月1日北京站报名:http://www.bagevent.com/event/611620?bag_track=csdn

7月1日上海站报名:http://www.bagevent.com/event/626256?bag_track=csdn

7月1日广州站报名:http://www.bagevent.com/event/625055?bag_track=csdn

7月1日成都站报名:http://www.bagevent.com/event/626275?bag_track=csdn