看harbor源码

背景

之前自己搞了个玩具registry,没有权限控制,没有角色,没有统计。正好vmware开源了harbor,号称是企业级仓库,我自然是不会放过,要研究一下。

部署

官方方法

Install Harbor with the following commands. Note that the docker-compose process can take a while.

1
2
3
4
5
6
7
8
9
cd Deploy

$ ./prepare
Generated configuration file: ./config/ui/env
Generated configuration file: ./config/ui/app.conf
Generated configuration file: ./config/registry/config.yml
Generated configuration file: ./config/db/env

docker-compose up -d

特殊国情下的模式

不建议用,最好还是番茄自己build
因为Daoloud和CaiCloud的版本都太老,很多新特性都没有。

离线模式

由于公司坑爹的模式,很多镜像下载不了,只好在家pull下来,然后save成tar,再到公司load
具体看这链接

架构图

来自[dockone的架构图](http://dockone.io/article/1179)

我画的架构图

代码结构

通过tree -d ./生成,略去部分不重要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
├── api
│   └── jobs
├── auth
│   ├── db
│   └── ldap
├── contrib
├── controllers
├── dao
├── Deploy
│   ├── config
│   │   ├── db
│   │   ├── jobservice
│   │   ├── nginx
│   │   │   └── cert
│   │   ├── registry
│   │   └── ui
│   ├── db
│   ├── kubernetes
│   │   └── dockerfiles
│   ├── log
│   └── templates
│   ├── db
│   ├── jobservice
│   ├── registry
│   └── ui
├── job
│   ├── config
│   ├── replication
│   └── utils
├── jobservice
├── models
├── service
│   ├── cache
│   ├── token
│   └── utils
├── static前端
├── tests
├── ui
├── utils共用组件
├── vendor三方库
└── views

对应架构图来看

  • proxy就是nginx,Deploy/config/nginx/nginx.conf
  • UI就是ui/main.go
  • token就是service/token/token.go
  • registry的webhook就是Deploy/templates/registry/config.yml的notifications和auth
    • auth指向beego.Router("/service/token", &token.Handler{})service/token/token.go
    • notification指向beego.Router("/service/notifications", &service.NotificationHandler{}),用来同步备份到远端仓库。service/notification.go
  • auth/authenticator.go接口,有本地db和LDAP两种实现,在init时会registrer,根据配置选择用哪个实现。

备份策略


这个特性很不错啊,registry有了新的更新,就notify到ui的notification,根据配置的策略,是否要备份到远端registry

LDAP

用的是open LDAP
代码在auth/ldap/ldap.go
LDAP_BASE_DN 这个还不会配置

RBAC

Role Based Access Control
service/token/authutils.go的FilterAccess,通过token里的scope获取action,再到数据库里查询是否有权限


本博客欢迎转发,但请保留原作者信息
github:codejuan
博客地址:http://blog.decbug.com/