Harbor是由VMware中国研发团队负责开发的开源企业级Registry项目,用于存储和分发Docker镜像,项目地址为https://github.com/vmware/harbor,深受用户喜爱。具备基于角色的访问控制,镜像远程复制,AD/LDAP 集成,图形管理界面,日志审计等功能。对外提供RESTful API接口。Harbor本身是用Go语言开发的。CLI客户端是用python编写的HarborClient。

系统架构:

harbor api查询 harbor数据库_postgresql

 

提供的核心组件

1. Proxy:负责请求转发,URL 以/v2/ 开始的请求会被转发到 Docker Registry 中,其它请求由

    Admin Server(Core services) 处理;

2. Admin Server:Harbor 的主体模块,提供Web UI 和 RESTful API 以及 Auth 相关功能;

3. ReplicationService:提供多个 Harbor 实例之间的镜像同步功能;

4. DataBase:Admin Server 和Replication Service 所用到的数据库;

5. Docker Registry:Docker 官方镜像仓库;

6. Image Storage:镜像的存储介质,可以是本地磁盘,或者分布式存储,根据 DockerRegistry

的配置而不同;

    Harbor本身默认内置MySQL数据库,官方版本不支持PostgreSQL,这个对于项目中已经使用PostgreSQL的场景,再安装MySQL带来了产品或平台的复杂度。所以为了简化PaaS容器平台多资源池,主子两级仓库架构,需要对Harbor进行定制,使其支持外置的PostgreSQL数据库集群。

    Harbor的整体代码目录还是比较精简的,也很清晰。分为文档(docs),存放编译结果(make),源码(src),测试用例(test)等,要对Harbor源码进行分析和定制,docs下的说明文档和Harbor根目录下的Makefile文件需要了解清楚。把Makefile理解清楚,主题模块之间的大致脉络也就心中有数。

                                                

harbor api查询 harbor数据库_harbor api查询_02

在Harbor根目录下运行make all,Go运行环境配置无误的情况下就会自动进行环境检查,编译,构建,打包镜像并本地启动,启动完成就可以在浏览器中访问Harbor界面了。因为是GO语言开发,每个模块调试也很方便。

分步骤讲解如何使Harbor支持PostgreSQL:

1.      下载最新源码:

    cd $GOROOT/src

    mkdir –p github.com/vmware

    git clone https://github.com/vmware/harbor.git

2.      新增与PostgreSQL相关的连接参数环境变量

export POSTGRESQL_HOST=10.21.20.175
    export POSTGRESQL_PORT=15432
    export POSTGRESQL_USR=ips
    export POSTGRESQL_PWD=ips
    export POSTGRESQL_DATABASE=registry
    export POSTGRESQL_SSLMODE=false

3.  编写registry_postgresql.sql文件,用于创建和初始化数据库。该文件见下载附件

    psql -h 10.21.20.175 -p 15432 -U ips -d postgres -fregistry_postgresql.sql

4.      代码中增加对postgresql的支持

    主要涉及到common下的model,dao目录,以及jobservice,adminservice,ui这几个部分。

4.1 在harbor/src/common/models/config.go 文件中增加postgresql连接串结构体类型

 

harbor api查询 harbor数据库_postgresql_03

4.2   harbor/src/common/dao/base.go 增加对postgresql数据库类型的支持

harbor api查询 harbor数据库_postgresql_04

4.3   按beego框架在harbor/src/common/dao/目录下增加对postgresql支持的pgsql.go文件,大致内容如下,可参考mysql.go 文件实现

harbor api查询 harbor数据库_harbor_05

4.4  在harbor/src/common/const.go文件中增加全局常量

harbor api查询 harbor数据库_Docker_06

4.5  在harbor/src/adminserver/systemcfg/systemcfg.go文件中增加对postgresql配置参数读取的支持

harbor api查询 harbor数据库_harbor_07

4.6  在harbor/src/ui/config/config.go和harbor/src/jobservice/config/config.go的DataBase函数中增加对postgresql的访问支持

harbor api查询 harbor数据库_PostgreSQL_08

在阅读和修改Harbor代码的过程中,也有些不好的实现确实可以再简化,同样的函数也有重复出现的情况,这样修改就需要多处同时修改。另外表名的定义,我也建议加上前缀,比如user表可以修改为harbor_user等。

5.      代码修改完成,就可以到make目录下,执行make down && make all

   

harbor api查询 harbor数据库_PostgreSQL_09

小提示,在编译clarity ui这个组件的时候,需要修改下Makefile中的CLARITYIMAGE=vmware/harbor-clarity-ui-builder:【tag】,把原来的tag占位符修改为明确的数字比如1.2.7才可以通过编译。而这个组件跟界面相关,否则界面一直出现loading字样,没有任何展示。

6.      编译完成后,生成了镜像,把镜像重新打个tag并push到自己的私有仓库中,比如我自己的10.20.16.214:5001

7.      按docs文档中kubernetes_deployment.md中的描述,在ConfigMap中增加postgresql相关的环境变量后。就可以使用Kubernetes的自动高可用环境,实现镜像仓库的高可用。

具体可参考:在Kubernetes集群上部署高可用Harbor镜像仓库

https://tonybai.com/2017/12/08/deploy-high-availability-harbor-on-kubernetes-cluster/