Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,通过添加一些企业必须的功能特性(如安全、标识和管理等)扩展了Docker Distribution(即Docker Registry2.x版本)。
- Harbor的特性与功能
1.1 Harbor特性
Harbor的特性主要表现在提高了性能和安全性两方面。
①提高性能:作为企业级私有Registry服务器,Harbor提升了用户使用Registry构建和运行环境传输镜像的效率,Harbor支持安装在多个Registry节点的镜像资源复制;
②增加安全性:Harbor中的镜像全部保存在私有Registry中,确保了数据和知识产权在企业内部网络中的管控,此外,用户管理、访问控制和审计等也为Harbor带来了更高级的安全特性。
1.2 Harbor功能
根据官方文档的介绍,Harbor主要有以下几点功能:
①基于角色的访问控制:用户与Docker镜像仓库通过“项目”来进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限;
②镜像复制:镜像可以在多个Registry实例中进行同步复制,尤其适合负载均衡、高可用、混合云和多云场景;
③图形化用户界面:用户可以通过浏览器查看、检索当前Docker镜像仓库,并可进行管理项目和命名空间的操作;
④AD/LDAP:Harbor可以集成企业内部已有的AD/LDAP,用户鉴权认证管理;
⑤审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理;
⑥国际化:已拥有英文、中文、德文、日文和俄文的本地化版本,更多的语言也将会在后期添加进来;
⑦RESTful API - RESTful API:提供给管理员对于Harbor更多的操控,以做到与其他管理软件之间的集成变得更加便利;
⑧部署简单:提供在线和离线安装工具,也可以安装到vSphere(OVA方式)虚拟设备中。
- Harbor的安装
2.1 Harbor安装方式
Harbor的安装可选择在线安装或离线安装两种。
①选择在线安装时,安装程序会比较小,各种所依赖的资源通过网络进行下载;
②选择离线安装时,安装程序会比较大,里面包含了安装过程所需要的各种资源和镜像等,可以不联网,一般推荐使用离线安装。
2.2 Harbor安装准备
2.2.1 Harbor安装要求
Harbor的安装有硬件和软件方面的要求:
①硬件要求:Harbor服务器要求2核CPU、4G内存和40G磁盘空间的保底要求;
②软件要求:必须是在提前安装好Docker和Docker-compose的服务器上进行安装,并且Docker版本不能低于17.06.0,Docker-compose版本不能低于1.18.0,如果要使用证书走加密协议,还需要安装好openssl服务。
2.2.2 脚本安装Docker与Docker-compose
Docker的安装部分,笔者在上一周的作业中已经演示过,从GitHub官网下载好编译好的Docker-compose二进制程序包(版本选择界面:https://github.com/docker/compose/releases,也可使用apt安装,不过版本较老),赋予可执行权限后直接放在/usr/bin目录下取名docker-compose即可使用。
此篇直接通过脚本完成Docker20.10.0和Docker-compose2.2.1的安装,所需文件及脚本内容如下图所示,Docker相关文件可参考《Docker的安装和基础命令使用》(链接:https://blog.51cto.com/johnnyfang/5479932)一文。
执行脚本开始快速安装,安装完毕能正常显示Docker和Docker-compose相关信息,即视为安装成功。
2.3 获取并解压Harbor压缩包
Harbor压缩包可通过GitHub网站获取(版本选择界面:https://github.com/goharbor/harbor/releases),目前已更新到2.5.3版本,笔者选择的为2.3.3版本离线安装压缩包。
下载好Harbor压缩包后进行解压。
2.4 修改Harbor配置文件
进入Harbor解压目录,拷贝harbor.yml.tmpl模板文件,并改名为harbor.yml配置文件,并对配置文件文件做如下图所示修改:
*配置文件修改说明:
①hostname:部分可使用域名或IP,使用域名时需进行hosts文件解析;
②如果只走http协议,http语句块不用动,并注释https语句块相关内容;如果走https协议,要在Harbor服务器上生成自签名证书,并添加证书相关文件路径;
③harbor_admin_password部分默认是Harbor12345,生产中建议进行修改,实验中笔者就改的简单点;
④数据库密码默认为root123,生产中也建议进行修改;
⑤data_volume部分可以放在系统盘或者另外创建的数据盘上,生产中建议放在数据盘。
2.5 安装Harbor
在安装好符合要求的Docker和Docker-compose,以及修改好Harbor配置文件后,即可通过Harbor解压包中的install.sh脚本开始Harbor的安装。
2.6 浏览器查看
本地电脑对Harbor配置文件中hostname部分使用的是域名进行解析后,即可浏览器登录。
- 镜像的上传与下载
3.1 上传镜像
3.1.1 创建项目
在浏览器页面的“项目”—“新建项目”部分可以添加新的项目,例如笔者创建一个名为n63的项目。因为Harbor本身就属于企业级私有仓库,“访问级别”部分建议设为公开,否则企业内部所有用户上传和下载均需进行登录;“存储容量”部分可以根据企业实际需求进行设置,一般选择“-1”不做限制。
3.1.2 修改hosts文件
笔者以之前下载过一些镜像的Docker服务器来演示,Docker服务器需修改/etc/hosts文件,对Harbor服务器的域名进行解析。
3.1.3 添加本地信任
与上周部署Docker Registry相同,要想通过Harbor服务器进行镜像的上传和下载,也许通过添加--insecure-registry参数。
3.1.4 登录仓库
Harbor服务器的n63项目部分虽然设置的是公开,但仅限于下载镜像无需登录,进行镜像上传时必须登录。登录时默认使用的80端口,可以不添加端口号,登录名和密码与浏览器登录页面账号信息相同。
3.1.5 上传镜像
Docker服务器上传镜像至Harbor服务器之前,要将本地的镜像修改为Harbor服务器相同的tag。
例如笔者的Harbor服务器域名为harbor.johnnyfang.com,新建项目为n63,则tag必须为harbor.johnnyfang.com/n63/xxx格式。修改完毕,通过docker push命令将本地镜像上传至Harbor服务器。
此时通过浏览器登录Harbor镜像仓库,也可在对应项目的“镜像仓库”查看到对应镜像。
3.2 下载镜像
3.2.1 hosts文件与本地信任
与上传镜像部分相同,要想通过Harbor服务器进行镜像的下载,必须要先进行域名解析,并添加本地信任。
3.2.2 下载镜像
因为项目设置的是公开,下载镜像时无需登录。镜像的拉取命令可通过浏览器页面具体镜像部分获取,如果知道具体版本号也可以直接下载。
Docker服务器下载镜像完毕,浏览器页面的对应镜像“下载数”部分也会加1。
- Harbor扫描器
4.1 开启扫描器
Harbor扫描器可以帮助我们自动检测镜像仓库是否存在漏洞,默认是关闭的,需要通过命令行开启。在开启扫描仪时,我们可以使用install.sh文件或prepare文件。
4.1.1 使用install.sh文件
在通过./install.sh安装Harbor环节加上--with-trivy选项(2.2.x之前版本使用--with-clair)即可,如果Harbor已安装完毕,也可执行该命令,只会重建已有的在运行的容器,数据不会丢失。
4.1.2 使用prepare文件
另外一种安装后开启扫描器的方法是使用prepare文件,也是添加--with-trivy参数(早期版本使用--with-clair参数),使用该文件添加扫描器时,Harbor服务器上已运行的容器不会进行重建,只会添加扫描器功能。
4.2 使用Harbor扫描器
如果想扫描某个镜像是否有漏洞,可以点进具体镜像的“TAGS”中,点击“漏洞”部分的“扫描”开始镜像扫描,如有问题,可以在“查看日志”部分查看问题所在。
扫描器默认是不自动进行扫描的,如果想开启自动扫描,可点击“项目”—“要扫描的项目”—“配置管理”部分勾选“自动扫描镜像”。
- 实现Harbor高可用
5.1 Harbor高可用解决方案
实现Harbor高可用的解决方案主要有基于共享存储和基于镜像复制两种。
5.1.1 基于共享存储
选择基于共享存储实现Harbor高可用时,各节点Harbor服务器前端部署一个负载均衡器,当Docker服务器要进行镜像的上传或下载时,通过负载均衡器根据调度算法来调度给某一个节点的Harbor服务器,Harbor服务器本身并不存储镜像,而是从共享存储中来读取。
5.1.2 基于镜像复制
基于镜像复制实现Harbor高可用时,无需共享存储。Harbor支持基于策略的Docker镜像复制功能,类似于MySQL的主从同步,以实现不同数据中心、不同运行环境之间的镜像同步,并提供友好的管理界面,极大地简化了实际运维中的镜像管理工作。
5.2 准备工作
实现Harbor高可用部分,笔者以基于镜像复制这一解决方案来演示。Harbor高可用至少得准备两台Harbor服务器,笔者准备了两台Harbor服务器,分别取名harbor-server1和harbor-server2;并准备一台负载均衡器和一台测试用Docker服务器,分别取名lb-server和docker-server。
5.3 同步功能测试
在未加入负载均衡器之前,先来测试一下两台Harbor服务器的镜像同步功能。
5.3.1 创建项目
通常企业的Harbor服务器中需要有一个基础镜像的项目,笔者在两台Harbor服务器上均创建创建baseimages项目。
5.3.2 新建目标
新建项目完毕,通过“系统管理”—“仓库管理”来新建目标,填写信息完毕建议点一下“尝试连接”看填写的信息是否正确。
*新建目标说明:
①“提供者”保持默认的Harbor即可;
②“目标名”、“目标URL”、“访问ID”和“访问密码”部分填写目标Harbor服务器信息;
③“验证远程证书”部分,如果未使用https协议,或者使用的是自签名证书与非信任证书,不要勾选。
5.3.3 新建规则
在新建目标的基础上指定Harbor服务器之间的同步规则,点击“系统管理”—“复制管理”—“新建规则”。
5.3.4 同步测试
5.3.4.1 添加本地信任
以docker-server向harbor-server1上传镜像为例,docker-server1首先也是要添加本地信任。
5.3.4.2 登录并上传
登录harbor-server1仓库后,将本地的镜像修改为符合要求的tag,并进行镜像上传。
5.3.4.3 浏览器查看
在浏览器查看时,可以看到harbor-server1和harbor-server2上均有了docker-server上传的镜像。
在“复制管理”的“复制任务”部分可以看到是通过事件触发了同步,并且查看harbor-server2的对应镜像拉取命令时,仓库地址已自动从10.0.0.103变成了10.0.0.104(笔者电脑截图时会自动取消对应命令的显示,该部分截图缺失)。
5.4 实现Harbor高可用
5.4.1 负载均衡器服务器准备
5.4.1.1 安装HAProxy服务
此时在两台Harbor服务器之前部署一台负载均衡器,通常生产中是以多台HAProxy+keepalived服务器作为负载均衡器的,笔者在实验中就以单台服务器安装HAProxy服务来演示。
5.4.1.2 修改HAProxy配置文件
HAProxy配置文件部分,模式要选择tcp,在没有设置共享存储时,建议将调度算法设为源地址哈希。
5.4.2 测试环节
5.4.2.1 本地信任与登录
与5.3环节的同步功能测试相同,docker-server需添加本地信任,并通过lb-server进行Harbor服务器仓库的登录。
5.4.2.2 修改tag与上传镜像
tag部分也要将Harbor服务器的地址指向lb-server负载均衡器,修改完tag即可进行镜像的上传。
通过浏览器登录Harbor时,可以看到两台Harbor服务器均已有了docker-server上传的nginx镜像。
5.4.2.3 下载镜像
Docker服务器拉取镜像时也可以直接通过lb-server来获取,例如笔者删除掉docker-server上的所有镜像,拉取镜像时由lb-server根据算法调度到后端的某一台Harbor服务器进行镜像的下载。
浏览器查看时,10.0.0.104的对应镜像部分下载数加了1上去,说明是调度到harbor-server2上进行的镜像下载。
5.4.2.4 测试高可用
由于笔者在HAProxy配置文件中设置的是源地址哈希算法,默认情况下来自同一个IP的用户请求会始终调度至同一台Harbor服务器,docker-server第一次下载镜像是通过harbor-server2下载的,后续的请求都会调度至harbor-server2。
此时笔者关闭掉harbor-server2,docker-server依旧能进行镜像的下载,并且在docker-server1的镜像部分能看到下载数加了1,说明镜像是通过harbor-server1进行的下载,从而验证了高可用。