持续集成与持续交付——Harbor私有仓库的安装部署

    技术2022-07-11  77

    目录

    一、Harbor简介1、Harbor简介2、Harbor功能3、Harbor核心组件4、Harbor和Registry的比较 二、安装部署harbor三、Harbor的使用1、GUIl界面使用2、远程主机上传拉取镜像(1)上传(2)拉取 3、本地上传拉取镜像4、成员管理 四、为Harbor添加内容扫描五、配置Harbor内容签名1、配置签名2、删除签名镜像

    一、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

    删除签名后,可以正常删除镜像:
    Processed: 0.013, SQL: 9