文章目录
- Harbor简介
- Harbor架构介绍
- Harbor 部署
- 1:服务端搭建harbor
- 2:客户端测试
- Harbor配置文件参数说明
Harbor简介
Harbor是由VMware公司开源的容器镜像仓库,它在Docker Registry的基础上进行了企业级扩展,包括基于角色的权限控制、AD/LDAP集成、可视化管理界面、日志审计等,它同Docker Registry一样提供容器镜像的存储及分发服务,但与Docker Registry有很多不同,Harbor进行了不少优化及改进,主要差别如下:
1)传输效率优化:
Harbor根据容器镜像每层的UUID标识进行增量同步,而不是全量同步,减少带宽及其他资源占用。
2)镜像仓库水平扩展:
由于上传、下载镜像文件涉及大量的耗时I/O操作,当用户对性能有较高要求时,需要创建多个Registry,通过负载均衡器将访问压力分发到不同的Registry,同时多个Registry存储时进行镜像文件的同步,便于水平扩展。
3)用户认证:
Harbor在Docker Registry的基础上扩展了用户认证授权的功能,用户在Harbor中进行访问需要携带token,以增强安全性。
4)镜像安全扫描:
上传到Harbor上的镜像文件能够通过clair的安全扫描,以发现镜像中存在的安全漏洞,并提高镜像文件的安全性。
5)提供Web界面以优化用户体验:
Registry只提供命令行方式,没有操作界面,而Harbor提供用户界面,可以支持登录、搜索功能,镜像分类管理包括区分公有、私有镜像等功能,优化了用户管理及操作体验。
Harbor架构介绍
Harbor由5个组件构成
(1)Proxy
Proxy是镜像仓库核心服务(Registry、UI、token等)的前端访问代理,通过这个代理可统一接收客户端发送来的请求,并将此请求转发给后端不同的服务进行处理。
(2)Registry
Registry是容器镜像仓库,负责Docker镜像存储,响应镜像文件上传及下载操作,但是在访问过程中会进行访问权限控制,用户每次执行docker pull/push请求都要携带一个合法的token。为了增强安全性,Registry会通过公钥对token进行解密验证,解密通过后才能进行相应的操作。
(3)Core Services
Core Services是Harbor的核心服务,主要包括如下功能:
■ UI: 图形化界面,根据用户的授权采用可视化方式管理镜像仓库中的各个镜像(image)文件。
■ token服务: 根据用户权限给每个镜像操作请求生成token。Docker客户端向Registry服务发起的请求如果不包含token会被重定向到这个token服务,获得token后再重新向Registry进行请求,这个token是后续操作的唯一合法身份,直到token超时或用户退出当前会话。
■ webhook: 主要用来实时监控Registry中镜像文件的状态变化。在Registry上配置webhook,通过webhook把image状态变化传递给UI模块。
(4)Database
为核心服务提供数据库存储及访问能力,负责存储用户权限、审计日志、Docker image分组信息等数据。
(5)Log Collector
负责收集其他组件运行过程中产生的日志,监控Harbor运行状况,以便后续进行运行状况分析。
Harbor的镜像同步机制
由于Harbor支持多个镜像仓库,用户访问任何一个镜像仓库结果都相同,因此需要在多个仓库间进行文件同步功能。Harbor通过调用自身的API对镜像文件进行下载和上传,实现镜像文件的同步。在镜像同步的过程中,Harbor会监控整个复制过程,如果遇到网络等错误会自动重试,提供复制策略机制以保证复制任务成功执行。Docker Registry与Harbor采用的机制不同,Harbor采用push机制,Docker Registry采用pull机制。
Harbor用户认证
Harbor中的用户分为两类:管理员及普通用户。管理员权限比较大,可以对用户进行管理,普通用户只能在自己权限范围内进行查询及日常运维操作
Harbor用户认证流程
■ 客户端发送镜像文件push/pull请求,Docker Daemon进程收到此请求。
■ Docker Daemon向Docker Registry发送上传/下载镜像的请求。
■ 如果Docker Registry需要进行授权,Docker Registry将会返回错误码401(即没有授权),同时在响应中包含docker客户端需要进行认证的相关信息。
■ Docker Registry分析此返回信息,并将相应数据返回给Docker客户端。
■ Docker客户端根据Registry返回的信息,附加相关内容后,向Docker Daemon再次发送请求。
■ Docker Daemon向Authencation(认证服务器)发送获取认证token的请求。
■ Authencation服务器验证提交的用户信息是否存符合业务要求。
■ Authencation服务器根据用户信息生成的token令牌和当前用户所具有的相关权限信息,返回给Docker Daemon。
■ Docker Daemon将结果返回给Docker客户端。
■ 后续Docker客户端进行push/pull操作时请求头中都带上token,发送到认证服务器进行身份认证。
Harbor 部署
Harbor运行时由多个Docker容器组成,包括Nginx、MySQL、UI、Proxy、log、JobService、adminserver
开两台部署好docker引擎的虚拟机,一台为harbor服务端,另一台作为客户端
1:服务端搭建harbor
服务端需安装 Python、 Docker 和Docker Compose.
(1)下载所需环境包
下载harbor安装程序
# wget http://harbor.orientsoft.cn/harbor-1.2.2/harbor-offline-installer-v1.2.2.tgz
下载compose
# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x docker-compose
# mv docker-compose /usr/bin 便于系统识别compose命令
查看 Docker-Compose 版本判断安装是否成功
# docker-compose -v
(2)修改配置文件
# cd /usr/local/harbor
# vim harbor.cfg
/hostname 查找
改为
hostname = 192.168.188.132
(3)启动安装harbor
# cd /usr/local/harbor
# sh install.sh
# docker-compose ps
(4) 登录访问harbor网址 http://192.168.188.132,可看到管理页面,
默认的管理员用户名和密码是 admin / Harbor12345。
登录进去,创建项目并且填写项目名称myproject
(5)可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下, Register 服务器在端口 80 上侦听
# docker login -u admin -p Harbor12345 http://127.0.0.1/
登录成功
# docker pull nginx 从公有仓库下载镜像 进行测试
镜像打标签
# docker tag nginx:latest 127.0.0.1/myproject/nginx:v1
上传到harbor私有仓库
# docker push 127.0.0.1/myproject/nginx
在图形界面的项目栏可看到上传的新镜像
2:客户端测试
(1)远程登录harbor服务器
# docker login -u admin -p Harbor12345 http://192.168.188.132
出现error的原因 : Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜
像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
解决:
指定私有仓库的地址
# vim /usr/lib/systemd/system/docker.service
/ExecStart 查找
在 fd:// --containerd中间添加一句: --insecure-registry 192.168.188.132
# systemctl daemon-reload 重载
# systemctl restart docker 重启
重新登录
(2)客户端 从私有仓库harbor 中下载镜像
# docker pull 192.168.188.132/myproject/nginx:v1
# docker images
在图形界面的项目栏可看到镜像被下载了一次
(3)客户端 测试 是否可以上传镜像
从公有仓库下载镜像
# docker pull cirros
# docker images
镜像打标签
# docker tag cirros:latest 192.168.188.132/myproject/cirros:v1
上传新镜像到私有仓库
# docker push 192.168.188.132/myproject/cirros:v1
在图形界面的项目栏可看到镜像cirros
Harbor配置文件参数说明
#vim /usr/local/harbor/harbor.cfg
关于 Harbor.cfg 配置文件中有两类参数:所需参数和可选参数
(1)所需参数
这些参数需要在配置文件 Harbor.cfg 中设置。
如果用户更新它们并运行 install.sh脚本重新安装 Harbour,参数将生效。具体参数如下:
hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限 定的域名(FQDN)
例如 192.168.195.128 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 为主机名。
ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。
max_job_workers:镜像复制作业线程。
db_password:用于db_auth 的MySQL数据库root 用户的密码。
customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。
当由外部来源提供密钥和根证书时,将此属性设置为 off。
ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。
ssl_cert_key:SSL 密钥的路径,仅当协议设置为 https 时才应用。
secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。
(2)可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数 的更新,Harbor.cfg 将被忽略。
注意:如果选择通过UI设置这些参数,请确保在启动Harbour后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除了默认的 admin 用户),auth_mode 不能被修改。具体参数如下:
Email:Harbor需要该参数才能向用户发送“密码重置”电子邮件,并且只有在需要该功能时才需要。
请注意,在默认情况下SSL连接时没有启用。如果SMTP服务器需要SSL,但不支持STARTTLS,那么应该通过设置启用SSL email_ssl = TRUE。
harbour_admin_password:管理员的初始密码,只在Harbour第一次启动时生效。之后,此设置将被忽略,并且应 UI中设置管理员的密码。
请注意,默认的用户名/密码是 admin/Harbor12345。
auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。
self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbour中创建新用户。
注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。
Token_expiration: 由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。
project_creation_restriction: 用于控制哪些用户有权创建项目的标志。默认情况下, 每个人都可以创建一个项目。
如果将其值设置为“adminonly”,那么只有 admin 可以创建项目。
verify_remote_cert: 打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。
将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbour 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,
如 S3、Openstack Swif、Ceph 等。但需要更新 common/templates/registry/config.yml 文件。