本文重点说下 Harbor 高可用集群方案的部署,目前主要有两种主流的 Harbor 高可用集群方案:1)双主复制;2)多 harbor 实例共享后端存储。
一、Harbor 双主复制高可用集群
1.1 主从同步
harbor 官方默认提供主从复制的方案来解决镜像同步问题,通过复制的方式,我们可以实时将测试环境 harbor 仓库的镜像同步到生产环境 harbor,类似于如下流程:
在实际生产运维的中,往往需要把镜像发布到几十或上百台集群节点上。这时,单个 Registry 已经无法满足大量节点的下载需求,因此要配置多个 Registry 实例做负载均衡。手工维护多个 Registry 实例上的镜像,将是十分繁琐的事情。Harbor 可以支持一主多从的镜像发布模式,可以解决大规模镜像发布的难题:
只要往一台 Harbor 上发布,镜像就会像"仙女散花"般地同步到多个 Registry 中,高效可靠。
如果是地域分布较广的集群,还可以采用层次型发布方式,比如从集团总部机房同步到分公司1机房,再从分公司1机房同步到分公司2机房:
然而单靠主从同步,仍然解决不了 harbor 主节点的单点问题。
1.2 双主复制说明
所谓的双主复制其实就是复用主从同步实现两个 harbor 节点之间的双向同步,来保证数据的一致性,然后在两台 harbor 前端顶一个负载均衡器将进来的请求分流到不同的实例中去,只要有一个实例中有了新的镜像,就是自动的同步复制到另外的的实例中去,这样实现了负载均衡,也避免了单点故障,在一定程度上实现了Harbor 的高可用性:
这个方案有一个问题就是有可能两个 Harbor 实例中的数据不一致。假设如果一个实例 A 挂掉了,这个时候有新的镜像进来,那么新的镜像就会在另外一个实例B中,后面即使恢复了挂掉的A实例,Harbor 实例 B 也不会自动去同步镜像,这样只能手动的先关掉 Harbor 实例 B 的复制策略,然后再开启复制策略,才能让实例B数据同步,让两个实例的数据一致。另外,这里还需要多吐槽一句:在实际生产使用中,主从复制十分的不靠谱!!所以这里推荐使用下面要说的这种方案。
二、多 harbor 实例共享后端存储的高可用集群(推荐方案)
2.1 方案说明
共享后端存储算是一种比较标准的方案,就是多个 Harbor 实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取。通过前置 LB 进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障:
这个方案在实际生产环境中部署需要考虑三个问题:
-
共享存储的选取,Harbor 的后端存储目前支持 AWS S3、Openstack Swift, Ceph 等,在下面的实验环境里,暂且直接使用 nfs。
-
Session 在不同的实例上共享,这个现在其实已经不是问题了,在最新的 harbor 中,默认 session 会存放在 redis 中,只需要将 redis 独立出来即可。可以通过 redis sentinel 或者 redis cluster 等方式来保证 redis 的可用性。在下面的实验环境里,暂且使用单台 redis。
-
Harbor 多实例数据库问题,这个也只需要将 harbor 中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。
2.2 部署记录
2.2.1 环境说明
ip hostname role 172.16.60.240 host-240 harbor 172.16.60.244 host-244 harbor 172.16.60.245 host-245 nfs
需要注意:
这里的环境中,不包括 LB 负载均衡器的配置,两台 harbor 前面需要架设一个 LB 层(比如 Nginx+Keepalived),配置这里省略~
[root@host-240 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@host-240 ~]# systemctl stop firewalld [root@host-240 ~]# systemctl disable firewalld [root@host-240 ~]# firewall-cmd --state not running [root@host-240 ~]# setenforce 0 [root@host-240 ~]# cat /etc/sysconfig/selinux SELINUX=disabled
2.2.2 172.16.60.245 节点机操作
1) 安装配置 nfs
[root@host-245 ~]# yum install -y rpcbind nfs-utils
编辑 /etc/exports 文件
[root@host-245 ~]# vim /etc/exports /kevin *(rw,no_root_squash) [root@host-245 ~]# mkdir /kevin [root@host-245 ~]# chmod -R 777 /kevin
开启 nfs 的 RCP 服务和查看 rpcbind 服务端口
[root@host-245 ~]# systemctl start rpcbind [root@host-245 ~]# systemctl enable rpcbind
开启 nfs 服务
[root@host-245 ~]# systemctl start nfs [root@host-245 ~]# systemctl enable nfs
2.2.3 172.16.60.240/244 两台 harbor 节点机操作
1)在两个 harbor 节点上挂载 nfs 目录
[root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data mount: wrong fs type, bad option, bad superblock on 172.16.60.245:/kevin, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so. [root@host-240 harbor]# yum install nfs-utils [root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data
2)安装 harbor
可以参考:https://www.cnblogs.com/kevingrace/p/6547616.html
两个节点 harbor 相互配置同步,实现 harbor 主主复制
安装 harbor 后,可以在 host-240 和 host-245 节点上查看harbor 容器情况:
[root@host-240 harbor]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy)
可以尝试登录容器
[root@host-240 harbor]# docker ps|grep harbor-db 680bd1ed9e48 goharbor/harbor-db:v1.8.0 "/entrypoint.sh post…" 6 days ago Up 6 days (healthy) 5432/tcp harbor-db [root@host-240 harbor]# docker exec -ti harbor-db bash root [ / ]#
这里需要注意:
harbor 同步配置可以参考:https://www.cnblogs.com/kevingrace/p/10995648.html
harbor 主主复制(两个 harbor 节点相互配置到对方的同步策略)时,注意:
"同步管理"规则里的"同步模式"(建议使用 push 推送模式。push 模式是推到目标仓库,pull 模式是从源仓库拉取过来)
"同步管理"规则里的"触发模式" (建议采用定时模式,比如每10秒钟同步一次:*/10 * * * * *)
"同步管理"规则里的"源资源过滤器"(如果没有过滤需求,就不要配置这一项)
2.2.4 LB 配置
在两个 harbor 节点的前面部署 LB 负载均衡层,通过 VIP 提供统一入口 (如域名),实现 harbor 访问的负载均衡和高可用。
可以通过绑定 hosts 到不同的节点来验证两个节点的负载均衡效果。
2.2.5 额外需要注意
这里使用 nfs 作为 harbor 的后端,还可以使用 ceph 作为后端存储(ceph 部署可参考:https://www.cnblogs.com/kevingrace/p/9141432.html)
这里没有考虑到 harbor 高可用时的 session 问题,如果要解决 session 问题,可以使用外部的 mysql 和 redis!!
1)比如在172.16.60.245 机器上再部署 mysql 和 redis(需提前安全 docker 和 docker 和 docker-compose)
docker-compose.yml文件内容如下: [root@host-245 ~]# vim docker-compose.yml version: '3' services: mysql-server: hostname: mysql-server container_name: mysql-server image: mysql:5.7 network_mode: host volumes: - /mysql57/kevin:/var/lib/mysql command: --character-set-server=utf8 environment: MYSQL_ROOT_PASSWORD: 123456 redis: hostname: redis-server container_name: redis-server image: redis:3 network_mode: host
启动 docker-compose
[root@host-245 ~]# docker-compose up -d
启动后查看
[root@host-245 ~]# docker-compose ps Name Command State Ports ------------------------------------------------------------- mysql-server docker-entrypoint.sh --cha ... Up redis-server docker-entrypoint.sh redis ... Up
可以尝试登录 mysql 容器数据库中
[root@host-245 ~]# docker-compose exec mysql-server bash root@mysql-server:/# mysql -p123456
或者直接登录
[root@host-245 ~]# docker-compose exec mysql-server mysql -p123456
2)接着需要往172.16.60.245上部署的 mysql 数据库中导入harbor 节点的 registry 数据库
在两台 harbor 节点上导出数据库,并将 registry.dump 复制出来
# docker exec -it harbor_db /bin/bash
登陆 harbor_db 容器后执行:
mysqldump -uroot -p --databases registry > registry.dump # docker cp harbor_db:/registry.dump ./
再将 registry.dump 复制到 245 节点的 mysql 容器中
# scp ./registry.dump root@172.16.60.245:/root
在 245 节点上,将 registry 数据库导入到 mysql 容器中
# docker cp /root/registry.dump mysql-server:/registry.dump # docker exec -it mysql-server /bin/bash
登陆到 mysql 容器后执行:
mysql -uroot -p123456
mysql> source /registry.dump
3) 在两个 harbor 节点上,修改 harbor.yml 文件,需要修改成使用外部数据库及 redis
db_host = 172.16.60.245 db_password = 123456 db_port = 3306 db_user = root redis_url = 172.16.60.245:6379
修改 docker-compose.yml 配置
由于 harbor 集群已使用外部的数据库和 redis 解决 session 问题,故需要将 docker-compose.yml 文件里关于数据库和 redis 的配置去掉。
由于 Harbor 新版本里增加了对 PostgreSQL 数据库的支持, 不使用 mysql 数据库。
可以在 docker-compose.yml 文件里将对应的 postgresql 容器改为 mysql 容器(参考之前的 harbor 版本配置)
出处:http://1t.click/aH2z