Harbor架构
图片来源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 | pg_dump -t harbor_user registry > /var/lib/postgresql/harbor_user.sql |
将主节点导出的表文件发送到备节点上
在备节点操作
进入 harbor-db容器执行
备份registry数据库
1 | pg_dump -d registry -f /var/lib/postgresql/registry.sql |
删除原表(解决导入时外键依赖问题)
1 | psql registry -c "drop table project_metadata;" |
导入
1 | psql registry -f /tmp/harbor/harbor_user.sql |
查看harbor用户和项目成员信息,同步即可
注意:
- 若VIP进行频繁飘移,容易造成两边postgres数据不一致。