基于Harbor搭建高可用Docker私有仓库的研究与实现
2022-08-31程宁
摘要:随着容器技术的广泛应用,越来越多的大中型企业在生产环境中通过Harbor部署Docker私有仓库。从高可用角度考虑,如何解决在生产环境中因出现单点故障从而对项目开发造成影响并造成经济损失的问题变得尤为重要。该文通过对比三种Harbor高可用性方案后,对基于共享服务的Harbor同步方案进行实现。
关键词:Harbor;高可用;Docker;私有仓库
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2022)18-0028-03
开放科学(资源服务)标识码(OSID):
1 引言
随着云计算的飞速发展,容器技术的使用越来越普遍,容器作为镜像创建的运行实例,消除了线上和线下的环境差异,可以保证应用生命周期环境的一致性和标准化,因此更好地进行Docker镜像管理变得尤为重要。虽然用户可以从Docker公有仓库上下载所需镜像,但从镜像的安全性和上传下载效率等各方面考虑,在企业内部部署Dockert私有仓库变得尤为重要[1]。
Docker私有仓库的搭建可利用Registry和Harbor两种形式。Registry是Docker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记,然后push到以Registry创建的容器的私有仓库中,但Registy不提供WEB界面,不便于管理[2]。Harbor作为一个用于存储和分发Docker镜像的企业级Registry服务器,提供管理UI,基于角色的访问控制,AD/LDAP集成,审计日志等企业用户需求的功能[3]。因此众多大中型企业用户在生产环境中选择利用Harbor来搭建企业内部的Docker私有仓库,以提高在生产环境传输镜像的效率。
从高可性角度考虑,在生产环境中选用搭建单节点的Harbor,则可能出现当单节点Harbor发生故障时,其从开发到交付的流水线就可能瘫痪,造成相应的经济损失。因此在利用Harbor搭建企业内部的Docker私有仓库时,如何设计Harbor高可用性方案是多数企业在生产环境中需要关注的问题。本文通过对3种Harbor高可用性方案进行对比,对基于共享服务的harbor同步方案加以实现。
2 Harbor高可用性方案概述
Harbor高可用性主要解决单点故障问题。从允许服务中断的时间以及可以承受的成本和损失的角度考虑,通常有以下几种解决方案。
(1)Harbor主从复制同步方案
该方案通过构建Harbor主节点和多个Harbor从节点,利用Harbor官方提供的主从复制方案来解决镜像同步的问题。通过将Harbor主节点的镜像同步到Harbor从节点,即一主多从的镜像发布模式,从而解决大规模镜像发布的问题。同时从满足大量节点的下载需注,还需在多个Harbor节点做负载均衡,如图1所示。
该方案虽然在一定程度上解决了镜像同步的问题,但当Harbor主节点出现故障后,各Harbor从节点将无法同步,因此该方案仍然没有解决Harbor主节点单点故障的问题。此外,主从模式还存在以下缺陷[4]。
① 当某从节点的镜像仓库出现故障,其对应的客户端将指向其他从节点,其他从节点存在因负载过重导致故障问题。
② 当将镜像推送到主节点的镜像仓库后,与其他从节点进行同步仍需一段时间,存在短暂时间内各镜像仓库不一致的问题,若上传的镜像数量多、网络带宽不足,延时时间将会更长。若在镜像同步过程中出现网络故障,存在从节点因无法同步,后期需花费大量时间进行修复工作。
③ 由于所有节点都存储全部镜像副本,从节点数量越多,耗费的空间就越大。
(2)Harbaor多主复制同步方案
该方案主要通过构建多个Harbor节点,在多个harbor节点之间利用主从复制同步方案来实现节点之间的双向同步,以保证数据的一致性。并通过配置负载均衡实现多个Harbor节点对外提供单一的harbor服务。具体方案如圖2所示。
如图2所示,当客户端发出请求后,由负载均衡器接收的请求分流到不同的Harbor节点,只要有一个Harbor节点中有新镜像,就会通过同步复制策略将新镜像复制给其他的Harbor节点。这样即使有一个Harbor节点出现故障,其他的Harbor节点仍然可以提供服务,从而在一定程度上实现Harbor高可用性。
但该方案的主要问题是无法保障镜像的一致性,即假设当某Harbor节点出现故障,该Harbor节点不能提供服务时,如果有新镜像进来,则该镜像会分流到其他的Harbor节点,后面即使恢复出现故障的Harbor节点,其他Harbor节点也不会自动将新镜像同步到恢复的Harbor节点。需要手动在其他Harbor节点上开启同步复制策略,才能进行数据同步,保证各Harbor节点数据的一致性。
(3)基于共享服务的Harbor同步方案
该方案主要通过多个Harbor节点共享PostgreSQL、Redis、MySQL和后端存储,通过负载均衡器实现多个Harbor实例提供Harbor服务。具体方案如图3所示。
如图所示,当客户端发出请求后,由负载均衡器接收的请求分流到不同的Harbor节点。由于多个harbor节点共享同一后端存储,因此任何一个harbor节点均可以读取到持久化存储在后端存储上的镜像,即使某Harbor节点出现故障,后期恢复故障后,也不会出现各Harbor节点数据不一致的问题。因此该方案在实际生产环境中比较具有可行性。
3 基于共享服务的harbor同步方案的实现
本方案选用的案例以四台部署在VMware Workstation 15中的Centos7.2虚拟机作为宿主机,均已预先安装好Docker,并与外网互通,且关闭防火墙和Selinux配置,各节点基本信息如表1所示[5]。
步驟1:NFS后端存储的部署。
(1)在nfsstorage节点上配置
[root@nfsstorage ~]# mkdir -p /data/nfs
[root@nfsstorage ~]# yum -y install nfs-utils rpcbind
[root@nfsstorage ~]# cat "/data/nfs 192.168.200.0/24(rw,no_root_squash)">/etc/exports
[root@nfsstorage ~]# systemctl restart rpcbind
[root@nfsstorage ~]# systemctl restart nfs
(2)在harbor主从节点上都需配置,本案例仅以harbor-master节点为例。
[root@harbor-master ~]# yum -y install nfs-utils rpcbind
[root@harbor-master ~]# systemctl start rpcbind
[root@harbor-master ~]# systemctl start nfs
[root@harbor-master ~]# mount 192.168.200.30:/data/nfs /data/storage/
[root@harbor-master ~]# vim /etc/fstab
192.168.200.30:/data/nfs /data/storage nfs4 defaults,_netdev 0 0
步骤2:在nfsstorage节点配置mysql、redis、postgres容器,以给harbor提供外部数据库数据读取。
[root@nfsstorage ~]# docker run -itd --name redis_test -p 6379:6379 redis:alpine
[root@nfsstorage ~]# docker run -itd --name postgres_test -p 5432:5432 -e POSTGRES_PASSWORD=123123 postgres:latest
[root@nfsstorage ~]# docker run -itd --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123123 mysql:5.6 --character-set-server=utf8
[root@nfsstorage ~]# docker rename postgres_test clair_db
[root@nfsstorage ~]# docker rename mysql_test harbor_db
[root@nfsstorage ~]# docker rename redis_test session
步骤3:在harbor主从节点上都需配置进行Harbor部署,本案例仅以主节点为例。
(1)将harbor安装包解压
[root@harbor-master ~]# tar -zxvf harbor-offline-installer-v1.5.0.tgz
(2)将harbor目录下ha子目录的registry.sql文件导入nfsstorage节点的mysql数据库。
[root@harbor-master ~]# yum -y insatall mariadb
[root@harbor-master ~]# mysql -uroot -p123123 -h192.168.200.30 -P3306 < harbor/ha/registry.sql
(3)修改docker-compose.yml配置文件。
[root@harbor-master harbor]# vim ha/docker-compose.yml
- /data/storage:/storage:z
(4)修改harbor目录下harbor.cfg文件
hostname = www.cnhbliti.com
ui_url_protocol = https
ssl_cert = /etc/ssl/harbor/www.cnhbliti.com.crt
ssl_cert_key = /etc/ssl/harbor/www.cnhbliti.com.key
harbor_admin_password = Harbor12345
db_host = 192.168.200.30
db_password = 123123
db_port = 3306
db_user = root
redis_url = 192.168.200.30:6379
clair_db_host = 192.168.200.30
clair_db_password = 123123
clair_db_port = 5432
clair_db_username = postgres
clair_db = postgres
(5)配置https
[root@harbor-master harbor]# yum -y install opssl
[root@harbor-master harbor]# mkdir -p /data/ssl
[root@slave harbor]# cd /data/ssl
[root@harbor-master ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt
[root@harbor-master ssl]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout www.cnhbliti.com.key -out www.cnhbliti.com.csr
[root@harbor-master ~]# openssl x509 -req -days 365 -in www.cnhbliti.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.cnhbliti.com.crt
(6)将自签发的域名证书添加到系统信任,并设置证书立即生效
[root@harbor-master ssl]# cp www.cnhbliti.com.crt /etc/pki/ca-trust/source/anchors/
[root@harbor-master ssl]# update-ca-trust extract
[root@harbor-master ssl]# update-ca-trust enable
[root@harbor-master ssl]# mkdir -p /etc/ssl/harbor
[root@harbor-master ssl]# cp /data/ssl/www.cnhbliti.com.key /etc/ssl/harbor/
[root@harbor-master ssl]# cp /data/ssl/www.cnhbliti.com.crt /etc/ssl/harbor/
[root@harbor-master ssl]# ll /etc/ssl/harbor/
(7)部署并启动harbor
[root@harbor-master harbor]# ./install.sh --with-clair --ha
步骤4:DNS配置
(1)在ldns节点进行DNS配置,配置完后,能夠正常解析主从节点和Vip节点。
(2)在所在节点配置/etc/reslove.conf文件,添加如下内容。
nameserver 192.168.200.40
步骤5:将主节点的相应证书复制到从节点
[root@harbor-master ssl]# scp www.cnhbliti.com.crt 192.168.200.20:/etc/pki/ca-trust/source/anchors/
[root@harbor-master ssl]# scp /data/ssl/www.cnhbliti.com.key 192.168.200.20:/etc/ssl/harbor/
[root@harbor-master ssl]# scp /data/ssl/www.cnhbliti.com.crt 192.168.200.20:/etc/ssl/harbor/
步骤6:部署keepalive,实现vip,配置完成后,harbor-master节点为vip的主节点,harbor-salve节点为vip的备用节点,验证效果如下所示。
[root@harbor-master ssl]# ip addr | grep 192.168.200.100
inet 192.168.200.100/32 scope global ens34
[root@harbor-master ssl]# systemctl stop network
[root@harbor-master ssl]# ip addr | grep 192.168.200.100
inet 192.168.200.100/32 scope global ens34
4 结语
本文通过对比Harbor主从复制同步、Harbaor多主复制同步和基于共享服务的Harbor同步方案,选择三个方案中最优的基于共享服务的harbor同步方案加以实现。该方案解决了在生产环境中利用Harbor搭建私有仓库的单点故障问题,极大地提高了镜像传输效率,并为利用其他技术搭建Docker私有仓库提供了一定的借鉴思想。
参考文献:
[1] 李群.企业级Docker Registry(Harbor)的研究[J].数码设计,2019(7):105-106.
[2] 刘亚.关于Docker镜像仓库技术的研究[J].科学技术创新,2021(29):76-78.
[3] 刘京义.使用Harbor创建Docker企业私有库[J].网络安全和信息化,2021(5):99-104.
[4] 王晓峰,向超胜,牛军,等.电信行业分布式镜像仓库的研究[J].电信技术,2017(9):36-38.
[5] 程宁,戴远泉.基于Jenkins持续集成部署研究与实现[J].电子制作,2021(22):46-48.
【通联编辑:代影】