之前介绍了部署单点harbor,这里重点说下Harbor高可用集群方案的部署,目前主要有两种主流的Harbor高可用集群方案:
1)双主复制
2)多harbor实例共享后端存储


1 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数据同步,让两个实例的数据一致。

另外,这里还需要多吐槽一句:在实际生产使用中,主从复制十分的不靠谱!!所以这里推荐使用下面要说的这种方案。


2 多harbor实例共享后端存储的高可用集群(推荐方案)

【架构解析】

  • 共享后端存储算是一种比较标准的方案,就是多个Harbor实例共享同一个后端存储,任何一个实例持久化到存储的镜像,都可被其他实例中读取,Harbor实例可横向扩展。
  • 将Harbor的redis缓存组件、PostgreSQL(或者mysql)数据库组件迁移到系统外部做高可用。
  • 通过前置LB进来的请求,可以分流到不同的实例中去处理,这样就实现了负载均衡,也避免了单点故障:

Harbor高可用( nginx + keepalived )架构图:在这里插入图片描述



这个方案在实际生产环境中部署需要考虑三个问题:

  1. 共享存储的选取,Harbor的后端存储目前支持AWS S3、Openstack Swift, Ceph等,在下面的实验环境里,暂且直接使用nfs。
  2. Session在不同的实例上共享,这个现在其实已经不是问题了,在最新的harbor中,默认session会存放在redis中,只需要将redis独立出来即可。可以通过redis sentinel或者redis cluster等方式来保证redis的可用性。在下面的实验环境里,暂且使用单台redis。
  3. Harbor多实例数据库问题,这个也只需要将harbor中的数据库拆出来独立部署即可。让多实例共用一个外部数据库,数据库的高可用也可以通过数据库的高可用方案保证。


2.1 部署记录


2.1.1 安装harbor(harbor-02上)


安装步骤参考上一节

在这里插入图片描述


2.1.2 安装nfs存储(harbor-02上)


【方案说明】: 这里是测试环境,就随便选择一台部署nfs了 ,就在harbor-02上部署nfs服务端共两台harbor使用。

(1)	在每台harbor节点上安装nfs相关软件(NFS是C/S架构的协议)
[root@harbor-02 /]# yum install -y nfs-utils rpcbind

[root@harbor-01 /]# yum install -y nfs-utils


(2)	在harbor-02上新建目录/root/harbor-nfs,选择所需的网段,配置/etc/exports
[root@harbor-02 ~]# mkdir harbor-nfs
[root@harbor-02 harbor]# cat /etc/exports
/root/harbor-nfs *(rw,no_root_squash,no_all_squash,sync)


(3)	执行如下命令
[root@harbor-02 ~]# systemctl start nfs
[root@harbor-02 ~]# systemctl enable nfs
[root@harbor-02 ~]# systemctl restart rpcbind


(4)	在需要挂载nfs目录的主机(如计划安装harbor的两个节点,target_dir为/opt/paas/data/registry)上执行。
[root@harbor-02 harbor]# mkdir -p /root/paas/data/registry
[root@harbor-02 harbor]# mount -t nfs 192.168.217.135:/root/harbor-nfs/ /root/paas/data/registry

[root@harbor-01 harbor]# mkdir -p /root/paas/data/registry
[root@harbor-01 harbor]# mount -t nfs 192.168.217.135:/root/harbor-nfs/ /root/paas/data/registry


(5)	测试是否部署正确(新建并修改文件,看配置是否正确)。在一个节点上执行touch <target_dir>/hello,应当在另一节点也看到<target_dir>/hello文件。

2.1.3 单独部署redis、PostgreSQL(harbor-db上)

【方案说明】:
本处为演示环境,实际生产环境请对Redis、PostgreSQL服务做高可用部署,及数据备份。

第一步、创建redis、PostgreSQL数据目录
[root@harbor-db ~]# mkdir -p /data/harbor/{harbor-redis,harbor-postgresql}
# 修改所属组
[root@harbor-db ~]# chown -R 999.999 /data/harbor/harbor-redis /data/harbor/harbor-postgresql


第二步、创建 postgresql 和 redis 的 docker-compose.yml 文件
[root@harbor-db ~]# vim docker-compose.yml 
version: '2.3'
services:
  postgresql:
    image: goharbor/harbor-db:v2.10.1
    container_name: harbor-db
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - DAC_OVERRIDE
      - SETGID
      - SETUID
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: test2024
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/harbor/harbor-postgresql:/var/lib/postgresql/data:z
    networks:
      - harbor-db
    ports:
      - 5432:543
  redis:
    image: goharbor/redis-photon:v2.10.1
    container_name: redis
    restart: always
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/harbor/harbor-redis:/var/lib/redis
    networks:
      - harbor-db
    ports:
      - 6379:6379
networks:
  harbor-db:
    external: false
[root@harbor-db ~]# docker-compose up -d
[root@harbor-db ~]# docker ps
CONTAINER ID   IMAGE                           COMMAND                   CREATED         STATUS                    PORTS                                       NAMES
a5c42dbd6c2a   goharbor/harbor-db:v2.10.1      "/docker-entrypoint.…"   5 minutes ago   Up 49 seconds (healthy)   0.0.0.0:5432->543/tcp, :::5432->543/tcp     harbor-db
a28953628e96   goharbor/redis-photon:v2.10.1   "redis-server /etc/r…"   5 minutes ago   Up 5 minutes (healthy)    0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis


第三步、导初始化数据,数据的话,从harbor-01、或者harbor-02上导一份就行
[root@harbor-01 harbor]# docker exec -it -u postgres harbor-db bash
postgres [ / ]$ pg_dump -U postgres -d registry > /tmp/registry.sql
postgres [ / ]$ psql -h 192.168.217.137 -U postgres -d registry -W < /tmp/registry.sql
注意,这里只是用了基础的数据库,生产环境可能还涉及notarysigner、notaryserver等等数据库,每个公司不一样。

参数解释:
    -U 数据库用户
    -p 访问端口
    -f 指定文件,和 < 功能一样
    -h 指定数据库地址
    -d 指定数据库名
    

2.1.5 部署nginx(harbor-01/02上)


【方案说明】:
分别在两台harbor机器上(生产环境建议准备两台独立的机器)部署nginx服务做负载均衡的转发,在upstream字段内写上两台harbor的地址。


2.1.5.1 harbor-01

2.1.5.1 harbor-02

2.1.6 部署keepalived(harbor-01/02上)


【方案说明】:
分别在两台harbor机器上部署keepalived服务,在其配置文件内主要配置VIP地址、两台harbor哪一台是主哪一台是备、针对nginx的健康检查等,以实现harbor服务的高可用。

为什么是检测Nginx的运行状态,而不是直接检测harbor?因为Nginx作为反向代理和负载均衡器,它是Harbor的入口,如果Nginx不可用,Harbor将无法对外提供服务。因此,通过检测Nginx的运行状态,可以更直接地确保Harbor服务的可用性。)




先到这儿,有空再继续整理。

参考:
https://blog.csdn.net/zfw_666666/article/details/126028310
https://blog.csdn.net/u010230019/article/details/136261147
https://blog.csdn.net/qq_25599925/article/details/135979335




3 问题整理

3.1 遗留问题

两台harbor都配置成了https,并且nginx也配置了https,但是登录的时候报错,nginx转发报403的错误,不知道是什么原因,先改成http方式吧。。。。
在这里插入图片描述

GitHub 加速计划 / ha / harbor
23.24 K
4.68 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:2 个月前 )
9e55afbb pull image from registry.goharbor.io instead of dockerhub Update testcase to support Docker Image Can Be Pulled With Credential Change gitlab project name when user changed. Update permissions count and permission count total Change webhook_endpoint_ui Signed-off-by: stonezdj <stone.zhang@broadcom.com> Co-authored-by: Wang Yan <wangyan@vmware.com> 6 天前
3dbfd422 Signed-off-by: wang yan <wangyan@vmware.com> 7 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐