10 - 镜像管理之:部署高可用harbor

之前介绍了部署单点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方式吧。。。。
在这里插入图片描述

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值