Habor高可用的实现方式

Harbor架构

image
图片来源harbor官网

组件介绍:

proxy: 通过nginx服务器来做反向代理

registry: docker官方的镜像存储服务。

ui: 前端UI入口

adminserver: 作为Harbor工程的配置数据管理器使用

DB: 存放用户信息、项目信息、用户权限和安全漏洞库,早期使用Mysql,目前采用Postgres。

job services: 通过状态机的形式将镜像复制到远程Harbor实例。镜像删除同样也可以被同步到远程Harbor实例中。

log: 运行rsyslogd的容器,主要用于收集其他容器的日志

Notary: 通过镜像签名方式方式,用于确保镜像来源真实性。

需要实现高可用的组件

Redis:用于存储session会话信息。

Postgres:用于存储用户信息,项目信息,用户权限信息和安全漏洞库。

Registry:实际镜像管理组件。

双主HA模式

通过共享存储实现高可用
Harbor默认全部数据存储在/data目录中,所以通过共享存储实际上就是将data目录挂载到共享存储中,目前常用方式是使用一些开源的分布式文件系统存储如cephfs,glusterfs或放置在对象存储S3中。

  • 底层使用共享存储用于保证镜像数据可靠性。
  • 将postgres独立出来,通过pgpool-II实现高可用集群。
  • 外部通过LB+keepalived方式转发到两个harbor中实现统一入口。

优点:

  • 由于多Harbor实例共享存储,因此可以保持数据是实时一致的;

缺点:

  • 门槛高,需要具备共享存储;
  • 需要搭建和维护postgres集群,维护成本高;

主备模式

  • 底层使用共享存储用于保证镜像和postgres的数据可靠性。
  • 外部通过在两个Habor间通过Keepalived维持VIP,保证统一入口,但一个宕机后可以通过VIP漂移方式在将请求迅速转发到另外一个可用节点。

优点:

  • 架构简单,部署两个harbor,只需要通过共享存储和keepalived就可以实现HA;

缺点:

  • 只能实现主备,没有全主,每次只能有一个harbor可以对外提供服务;

基于镜像复制方式实现高可用

但没有共享存储时可以使用Harbor本身的镜像同步方式

  • Harbor使用底层使用各自的本地存储;
  • 两个Harbor之间配置双向同步镜像策略;

优点:

  • 架构简单,只需要部署两个Harbor,不需要通过其他额外组件。
  • 配置文件,只需要配置两个Harbor间的镜像同步。

缺点:

  • 只能实现主备,没有全主,每次只能有一个harbor可以对外提供服务;
  • 但其中一台宕机后,镜像push请求到另外一台harbor后,待另外一台harbor恢复后需要手工执行一下同步策略进行同步。
  • 只能同步镜像,用户和用户权限信息无法进行同步,因为这些都保存到postgres数据库中,所以需要通过导表方式进行同步用户和权限。
  • 若VIP进行频繁飘移,容易造成两边postgres数据不一致。

导表方式如下:

需要导出以下表:
表名 用途
harbor_user 用户信息表
project 项目信息表
project_member 项目成员表
project_metadata 项目元数据表,数据主要为项目创建和更新时间
repository 项目镜像信息元数据

假设有A节点和B节点两个Harbor,目前vip在A节点上,需要将A节点以下表导出同步到B节点上,若后续VIP漂移到B节点上后也需要将B节点上数据重新同步到A节点。

在主节点上操作:

备份registry数据库

进入 harbor-db容器

1
pg_dump -d registry -f /var/lib/postgresql/registry.sql

导出原表
1
2
3
4
5
6
pg_dump -t harbor_user registry > /var/lib/postgresql/harbor_user.sql
pg_dump -t project_member registry > /var/lib/postgresql/project_member.sql
pg_dump -t project registry > /var/lib/postgresql/project.sql
pg_dump -t project_metadata registry > /var/lib/postgresql/project_metadata.sql
pg_dump -t repository registry >/var/lib/postgresql/repository.sql
pg_dump -t oidc_user registry >/var/lib/postgresql/oidc_user.sql
将主节点导出的表文件发送到备节点上

在备节点操作

进入 harbor-db容器执行

备份registry数据库
1
pg_dump -d registry -f /var/lib/postgresql/registry.sql
删除原表(解决导入时外键依赖问题)
1
2
3
4
5
6
psql registry -c "drop table project_metadata;"
psql registry -c "drop table project;"
psql registry -c "drop table oidc_user;"
psql registry -c "drop table harbor_user;"
psql registry -c "drop table project_member;"
psql registry -c "drop table repository;"
导入
1
2
3
4
5
6
psql registry -f /tmp/harbor/harbor_user.sql
psql registry -f /tmp/harbor/project.sql
psql registry -f /tmp/harbor/project_metadata.sql
psql registry -f /tmp/harbor/oidc_user.sql
psql registry -f /tmp/harbor/project_member.sql
psql registry -f /tmp/harbor/repository.sql

查看harbor用户和项目成员信息,同步即可

注意:

  • 若VIP进行频繁漂移,容易造成两边postgres数据不一致。