目录
一、Harbor简介
1、Harbor简介
- Harbor是构建企业级私有docker镜像仓库的开源解决方案,它是Docker Registry的更高级封装。
- 它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库
注:helm就相当于k8s的yum。 - 它还整合了两个开源的安全组件,一个是Notary,另一个是Clair。
Notary类似于私有CA中心,而Clair则是容器安全扫描工具,它通过各大厂商提供的CVE漏洞库来获取最新漏洞信息,并扫描用户上传的容器是否存在已知的漏洞信息,这两个安全功能对于企业级私有仓库来说是非常具有意义的。
简单来说harbor就是VMWare公司提供的一个docker私有仓库构建程序,功能非常强大。
2、Harbor功能
- 基于角色的访问控制
用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。 - 镜像复制
镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。 - 图形化用户界面
用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。 - AD/LDAP
Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。 - 审计管理
所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。 - 国际化
已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。 - RESTful API
提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
3、Harbor核心组件
- Proxy:他是一个nginx的前端代理,代理Harbor的registry,UI, token等服务。
- db:负责储存用户权限、审计日志、Dockerimage分组信息等数据。
- UI:提供图形化界面,帮助用户管理registry上的镜像, 并对用户进行授权。
- jobsevice:jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另一个registry,并记录job_log。
- Adminserver:是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候会需要加载adminserver的配置。
- Registry:镜像仓库,负责存储镜像文件。
- Log:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
4、Harbor和Registry的比较
Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势:
- 提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。 - 提供WEB界面,优化用户体验
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。 - 支持水平扩展集群
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。 - 良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。 - Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。
kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
docker registry的一些缺陷:
- 缺少认证机制,任何人都可以随意拉取及上传镜像,安全性缺失
- 缺乏镜像清理机制,镜像可以push却不能删除,日积月累,占用空间会越来越大
- 缺乏相应的扩展机制来持英文和中文
二、安装部署harbor
- 参考文档:
https://goharbor.io/docs/1.10/ - 部署harbor所需要的环境
harbor支持k8s的helm安装和本地安装,我这次选择的安装方式是本地安装。
1.需要安装docker并运行,harbor的运行依赖于docker服务
2.需要安装docker-compose,他可以把多容器运行构建出一个整体服务。harbor就是多个容器一起运行结果 - 软件下载:https://github.com/goharbor/harbor/releases
- 安装
tar zxf harbor-offline-installer-v1.10.
cd harbor/
ls
common.sh harbor.v1.10.1.tar.gz harbor.yml install.sh LICENSE prepare
- 修改配置文件
harbor.yml 就是harbor的配置文件,编辑harbor.yml,修改hostname、https证书路径、admin密码
- 添加解析
- 生成证书
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/reg.yang.org.key -x509 -days 365 -out certs/reg.yang.org.crt
- 每次修改完配置文件后都需要运行
[root@server3 harbor]# ./prepare
运行 ./install.sh
[root@server3 harbor]# ./install.sh
注意: 常用管理命令,一定要在harbor目录中运行
- 停止服务: docker-compose stop
- 开始服务: docker-compose start
- 重启服务:docker-compose restart
- 停止服务并删除容器:docker-compose down
- 启动服务并运行容器:docker-compose up
启动成功后,443端口开启:
三、Harbor的使用
1、GUIl界面使用
浏览器访问172.25.254.53
2、远程主机上传拉取镜像
(1)上传
- 把证书发给
server2
- 上传镜像
注意:要在server2上做解析
不登陆无法上传镜像,登陆后可以正常上传。 - 刷新网页,可以看到上传的nginx
(2)拉取
- 配置daemon文件,并重新加载文件和重启docker
systemctl daemon-reload
systemctl restart docker
- 拉取镜像:
在日志中可以看到相关记录:
3、本地上传拉取镜像
- 与远程主机上传拉取镜像类似:
- 本地上传的镜像可以在远程主机上进行拉取:
- 日志上也会对这一过程有记录,使用
admin
身份上传,使用匿名身份拉取:
4、成员管理
新建一个项目yang
来用于实验成员管理功能:
新建一个用户yll
,并给他开发人员角色:
开发人员角色可以上传,不能进行删除等操作。
四、为Harbor添加内容扫描
- 暂停之前的容器,并清理配置文件:
docker-compose stop
./prepare
- 加上内容信任,扫描器和helm仓库重新安装:
./install.sh --with-notary --with-clair --with-chartmuseum
- 刷新网页端可以看到多了一些配置:
- 可以看到以前上传的镜像都是没有经过扫描的,可以对已经上传的镜像进行扫描:
扫描之后:
- 也可以配置镜像上传的时候自动扫描:
五、配置Harbor内容签名
1、配置签名
签名属于内容信任,没有签名的内容可以选择不部署,从上面图中可以看到刚上传的内容是没有签名的。
内容信任的服务端口是4443,接下来就进行harbor内容信任的配置:
- 勾选相关选项:
- 将证书放在指定位置并打开内容信任功能:
- 测试上传
注意:签名与tag中的v1绑定,上传时必须指定tag中版本,要不然会跳过签名。
刷新页面可以发现,新上传的镜像既进行了内容扫描又进行了内容签名:
之后上传时每次都需要输入根密钥和仓库密钥,当tag不同时仅需要输入仓库密钥。
打开项目内容信任功能,则不允许没有签名的镜像上传下载。
2、删除签名镜像
- 已签名的镜像是不能删除的,直接删除会报错:
- 如果需要删除则需要先删除签名:
##查看签名
docker trust inspect
##删除签名
docker trust revoke
- 删除签名后,可以正常删除镜像: