一 Harbor说明
Harbor作为Docker私有仓库,几乎每个公司都会用到,除非你们公司还未用上容器化。
下面我们来看一下如何部署Harbor
二 部署过程
标准的Harbor安装过程包括以下阶段:
- 确保您的目标主机符合“harbor安装先决条件”
- 下载Harbor安装程序
- 配置对Harbor的HTTPS访问
- 配置Harbor YML文件
- 配置启用内部TLS
- 运行安装脚本
2.1 确保您的目标主机符合“harbor安装先决条件”
用于部署Harbor的最低和建议的硬件配置
资源 | 最低要求 | 推荐 |
---|---|---|
CPU | 2 CPU | 4 CPU |
Mem | 4 GB | 8 GB |
Disk | 40 GB | 160 GB |
必须在目标主机上安装的软件版本
软件 | 版本 | 描述 |
---|---|---|
Docker engine | Version 17.06.0-ce+ 或 更高版本 | 安装指引请查看官方文档 Docker Engine documentation |
Docker Compose | Version 1.18.0 或 更高版本 | 安装指引可查看官方文档 Docker Compose documentation |
Openssl | 最好是最新版本 | 用于为Harbor生成证书和密钥 |
Harbor要求在目标主机上打开以下端口
Port | Protocol | Description |
---|---|---|
443 | HTTPS | Harbor入口和核心API在此端口上接受HTTPS请求。您可以在配置文件中更改此端口。 |
4443 | HTTPS | 与Harbor的Docker Content Trust服务的连接。仅在启用公证人的情况下才需要。您可以在配置文件中更改此端口。 |
80 | HTTP | Harbor入口和核心API在此端口上接受HTTP请求。您可以在配置文件中更改此端口。 |
2.2 下载Harbor安装程序
https://github.com/goharbor/harbor/releases 从github上找到最新版本的离线安装程序:harbor-offline-installer-v2.1.3.tgz
1 | cd /usr/local/src |
解压后的文件如下:
1 | [root@node1 harbor]# ls -l |
2.3 配置对Harbor的HTTPS访问
默认情况下,Harbor不附带证书。可以在没有安全性的情况下部署Harbor,以便您可以通过HTTP连接到它。但是,只有在没有外部互联网连接的空白测试或开发环境中,才可以使用HTTP。在没有空隙的环境中使用HTTP会使您遭受中间人攻击。在生产环境中,请始终使用HTTPS。如果您启用Content Trust with Notary来正确签名所有镜像,则必须使用HTTPS。
要配置HTTPS,必须创建SSL证书。您可以使用由受信任的第三方CA签名的证书,也可以使用自签名证书。此处介绍如何使用OpenSSL创建CA,以及如何使用CA签署服务器证书和客户端证书。您可以使用其他CA提供程序,例如“加密”。
以下过程假定您的Harbor注册表的主机名是yourdomain.com,并且其DNS记录指向您正在运行Harbor的主机。
生成证书颁发机构证书
在生产环境中,您应该从CA获得证书。在测试或开发环境中,您可以生成自己的CA。要生成CA证书,请运行以下命令。
1 | # 生成CA私钥证书 |
生成服务器证书
证书通常包含一个.crt文件和一个.key文件,例如yourdomain.com.crt和yourdomain.com.key
1 | # 生成私钥 |
提供证书给Harbor和Docker
生成ca.crt,yourdomain.com.crt和yourdomain.com.key文件后,必须将它们提供给Harbor和Docker,然后重新配置Harbor以使用它们。
1 | # 将服务器证书和密钥复制到Harbor主机上的certficates文件夹中 |
您可能还需要在操作系统级别信任证书,更多信息请参考Harbor安装进行故障排除。
以下是证书配置说明:
1 | /etc/docker/certs.d/ |
2.4 配置Harbor YML文件
您可以在安装程序包中包含的Harbor.yml文件中为Harbor设置系统级别参数。这些参数在您运行install.sh脚本以安装或重新配置Harbor时生效。 在初始部署之后和启动Harbor之后,您可以在Harbor Web Portal中执行其他配置
必要参数
下表列出了部署Harbor时必须设置的参数。默认情况下,
harbor.yml
文件中的所有必需参数均未注释。可选参数用#
注释。您不一定需要从提供的默认值中更改所需参数的值,但是这些参数必须保持注释。至少,您必须更新hostname
参数.重要说明:Harbor不附带任何证书。在1.9.x及以下版本中,默认情况下,Harbor使用HTTP服务注册表请求。这仅在有空隙的测试或开发环境中可接受。在生产环境中,请始终使用HTTPS。如果您启用Content Trust with Notary来正确签名所有镜像,则必须使用HTTPS。
Harbor部署必要参数
参数名 | 子参数名 | 描述和附加参数 |
---|---|---|
hostname |
None | 指定要在其上部署Harbor的目标主机的IP地址或标准域名(FQDN)。这是您访问Harbor的入口和注册服务的地址. 如, 192.168.1.10 或 reg.yourdomain.com . 外部客户端必须能访问到注册服务地址, 所以不能配置如下的值 localhost , 127.0.0.1 , or 0.0.0.0 |
http |
不要在生产环境中使用HTTP。仅在没有连接到外部Internet的空白测试或开发环境中,才可以使用HTTP。在没有空隙的环境中使用HTTP会使您遭受中间人攻击。 | |
port |
用于Harbor入口和Docker命令的HTTP的端口号。默认值为80。 | |
https |
使用HTTPS访问Harbor Portal和令牌/通知服务。始终在生产环境和没有空隙的环境中使用HTTPS。 | |
port |
用于Harbor Portal和Docker命令的HTTPS的端口号。默认值为443。 | |
certificate |
SSL证书的路径 | |
private_key |
SSL密钥的路径. | |
internal_tls |
使用HTTPS在端口组件之间进行通信 | |
enabled |
将此标志设置为“true”表示已启用内部tls | |
certificate |
包含内部证书和密钥的目录的路径 | |
harbor_admin_password |
None | 为Harbor系统管理员设置初始密码。此密码仅在Harbor第一次启动时使用。在随后的登录中,将忽略此设置,并在门户中设置管理员密码。默认用户名和密码为“admin”和“Harbor12345”。 |
database |
使用本地PostgreSQL数据库。可以选择配置外部数据库,在这种情况下可以禁用此选项。 | |
password |
设置本地数据库的根密码。必须为生产部署更改此密码。 | |
max_idle_conns |
空闲连接池中的最大连接数。如果设置为<=0,则不保留空闲连接。默认值为50。如果未配置,则值为2。 | |
max_open_conns |
到数据库的最大打开连接数。如果<=0,则对打开的连接数没有限制。默认值为100,表示到Harbor数据库的最大连接数。如果未配置,则值为0。 | |
data_volume |
None | 目标主机上存储Harbor数据的位置。即使移除和/或重新创建港口集装箱,该数据也保持不变。您可以选择配置外部存储,在这种情况下,请禁用此选项并启用“存储\服务”。默认值是/data 。 |
clair |
updaters_interval |
设置Clair更新的间隔,以小时为单位。设置为0以禁用更新。默认值为12小时。 |
trivy |
配置Trivy扫描器 | |
ignore_unfixed |
将标志设置为“true”以仅显示已修复的漏洞。默认值为“false”。 | |
skip_update |
您可能想要在测试或CI / CD环境中启用此标志,以避免GitHub速率限制问题。如果启用了该标记,则必须手动下载“ trivy.db”文件并将其安装在容器中的“ /home/scanner/.cache/trivy/db/trivy.db”路径中。默认值为“ false”。 | |
insecure |
将标志设置为“true”以跳过验证注册表证书。默认值为“false”。 | |
github_token |
设置GitHub访问令牌以下载Trivy DB。 Trivy DB由Trivy从GitHub发布页面下载。从GitHub进行的匿名下载每小时受到60个请求的限制。通常,这样的速率限制对于生产操作是足够的。但是,如果这还不够,您可以通过指定GitHub访问令牌将速率限制提高到每小时5000个请求。有关GitHub速率限制的更多详细信息,请参见(https://developer.github.com/v3/#rate-limiting)。您可以按照(https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line)中的说明创建GitHub令牌。 | |
jobservice |
max_job_workers |
作业服务中复制工作进程的最大数目。对于每个映像复制作业,工作进程将存储库的所有标记同步到远程目标。增加此数量将允许系统中有更多的并发复制作业。但是,由于每个worker消耗一定数量的网络/CPU/IO资源,因此根据主机的硬件资源设置此属性的值。默认值为10。 |
notification |
webhook_job_max_retry |
设置web挂钩作业的最大重试次数。默认值为10。 |
chart |
absolute_url |
设置为“enabled”以使图表使用绝对URL。将图表设置为“disabled”以使用相对URL。 |
log |
配置日志记录。Harbor使用“rsyslog”收集每个容器的日志。 | |
level |
设置日志级别,可选值有 debug , info , warning , error , 或 fatal . 默认是 info . |
|
local |
设置日志保留参数:rotate_count :在删除日志文件之前,将日志文件旋转rotate_count 次。如果计数为0,则删除旧版本而不是旋转。默认值为50。rotate_size :日志文件只有在大于rotate_size 字节时才会旋转。使用“k”表示千字节,“M”表示兆字节,“G”表示千兆字节。100 、100k 、100M 和100G 都是有效值。默认值为200M。location :设置存储日志的目录。默认值是/var/log/harbor 。 |
|
external_endpoint |
启用此选项可将日志转发到syslog服务器。protocol :syslog服务器的传输协议。默认值为TCP。host :系统日志服务器的URL。port :系统日志服务器侦听的端口 |
|
proxy |
配置Clair、复制jobservice和Harbor使用的代理。如果不需要代理,请留空。 | |
http_proxy |
配置HTTP代理,例如: http://my.proxy.com:3128 . |
|
https_proxy |
配置HTTPS代理,例如:http://my.proxy.com:3128 . |
|
no_proxy |
配置何时不使用代理, 例如, 127.0.0.1,localhost,core,registry |
可选参数
下表列出了其他可选参数,您可以设置这些参数,以配置超出最低必需设置的Harbor部署。要启用设置,必须通过删除前导
#
字符在harbor.yml
中取消注释。
参数 | 子参数 | 描述和附加参数 |
---|---|---|
external_url |
None | 启用此选项可使用外部代理。启用后,主机名将不再使用。 |
storage_service |
默认情况下,Harbor在本地文件系统中存储镜像和图表。在生产环境中,您可能希望使用另一个存储后端而不是本地文件系统。下面列出的参数是注册表的配置。有关如何配置其他后端的详细信息,请参阅下面的“配置存储后端”。 | |
ca_bundle |
自定义根CA证书的路径,该证书被注入到注册表和图表存储库容器的信任存储中。如果内部存储使用自签名证书,则通常需要这样做。 | |
filesystem |
默认是filesystem ,但是您可以设置azure ,gcs ,s3 ,swift 和oss 。有关如何配置其他后端的信息,请参阅下面的配置存储后端。设置“ maxthreads”以将线程数限制为外部提供程序。默认值为100。 |
|
redirect |
如果要禁用注册表重定向,请将“disable”设置为“true” | |
external_database |
如果禁用本地数据库选项,请配置外部数据库设置。目前,Harbor只支持PostgreSQL数据库。您必须为harborcore、Clair、Notary server和Notary signer创建四个数据库。这些表是在Harbor启动时自动生成的。 | |
harbor |
为Harbor数据配置外部数据库。host :Harbor数据库的主机名。port :数据库端口。db_name :数据库名称。username :连接到core Harbor数据库的用户名。password :在username 中设置的帐户的密码。ssl_mode :启用ssl模式。max_idle_conns :空闲模式中的最大连接数连接池。如果<=0,则不保留空闲连接。默认值为2.max_open_conns :与数据库的最大打开连接数。如果<=0,则对打开的连接数没有限制。默认值为0。 |
|
clair |
为Clair配置外部数据库。host :Clair数据库的主机名port :数据库端口。db_name :数据库名称。username :连接到Clair数据库的用户名。password :在username .中设置的帐户的密码。ssl_mode :启用ssl模式。 |
|
notary_signer |
为公证人签名数据库“host”配置外部数据库:公证人签名数据库的主机名“port”:数据库端口。“db_name”:数据库名称。“username”:连接公证人签名数据库的用户名。“password”:在“username”中设置的帐户的密码。“ssl_mode”:启用ssl模式。 | |
notary_server |
host :公证服务器数据库的主机名。port :数据库端口。db_name :数据库名称。username :连接到公证服务器数据库的用户名。password :帐户的密码。 ssl_mode :启用SSL模式。 |
|
external_redis |
配置外部Redis实例。 | |
host |
外部Redis实例的主机名。 | |
port |
外部Redis实例端口 | |
password |
连接到外部Redis实例的密码。 | |
registry_db_index |
Harbor registry数据库索引 | |
jobservice_db_index |
jobservice数据库索引 | |
chartmuseum_db_index |
Chart museum数据库索引 |
配置存储后端
默认情况下,Harbor将本地存储用于注册表,但是您可以选择配置
storage_service
设置,以便Harbor使用外部存储。有关如何为不同的存储提供程序配置注册表的存储后端的信息,请参阅Docker文档中的[注册表配置参考](https://docs.docker.com/registry/configuration/#storage)。
2.5 配置启用内部TLS
默认情况下,Harbor组件(harbor-core,harbour-jobservice,代理,harbor-portal,注册表,registctl,trivy_adapter,clair_adapter,chartmuseum)之间的内部通信使用HTTP协议,这对于生产环境可能不够安全。从Harbor v2.0开始,TLS可用于此内部网络。在生产环境中,建议使用HTTPS是最佳实践。
此功能是通过使用
harbor.yml
文件中的internal_tls
参数来实现的。要启用内部TLS,请将“ enabled”设置为“ true”,并将“ dir”值设置为包含内部证书文件的目录路径。
您可以使用 prepare
工具生成证书
1 | docker run -v /:/hostfs goharbor/prepare:v2.0 gencert -p /path/to/internal/tls/cert |
您还可以提供自己的CA以生成其他证书。为此,请将CA的证书和密钥放在内部tls cert目录中,并将它们分别命名为“ harbor_internal_ca.key”和“ harbor_internal_ca.crt”。您还可以提供所有组件的证书。但是,证书有一些限制:
- 所有证书必须由一个唯一的CA签名
- 内部证书的文件名和证书文件上的CN字段必须遵循下表中的约定:
name | usage | CN |
---|---|---|
harbor_internal_ca.key |
ca’s key file for internal TLS | N/A |
harbor_internal_ca.crt |
ca’s certificate file for internal TLS | N/A |
core.key |
core’s key file | N/A |
core.crt |
core’s certificate file | core |
job_service.key |
job_service’s key file | N/A |
job_service.crt |
job_service’s certificate file | jobservice |
proxy.key |
proxy’s key file | N/A |
proxy.crt |
proxy’s certificate file | proxy |
portal.key |
portal’s key file | N/A |
portal.crt |
portal’s certificate file | portal |
registry.key |
registry’s key file | N/A |
registry.crt |
registry’s certificate file | registry |
registryctl.key |
registryctl’s key file | N/A |
registryctl.crt |
registryctl’s certificate file | registryctl |
notary_server.key |
notary_server’s key file | N/A |
notary_server.crt |
notary_server’s certificate file | notary-server |
notary_signer.key |
notary_signer’s key file | N/A |
notary_signer.crt |
notary_signer’s certificate file | notary-signer |
trivy_adapter.key |
trivy_adapter.’s key file | N/A |
trivy_adapter.crt |
trivy_adapter.’s certificate file | trivy-adapter |
clair.key |
clair’s key file | N/A |
clair.crt |
clair’s certificate file | clair |
clair_adapter.key |
clair_adapter’s key file | N/A |
clair_adapter.crt |
clair_adapter’s certificate file | clair-adapter |
chartmuseum.key |
chartmuseum’s key file | N/A |
chartmuseum.crt |
chartmuseum’s certificate file | chartmuseum |
2.6 运行安装脚本
一旦配置了从Harbor.yml.tmpl复制的Harbor.yml并有选择地设置了存储后端,就可以使用install.sh脚本安装并启动Harbor。
请注意,在线安装程序可能需要一些时间才能从Docker镜像仓库下载所有Harbor映像。
可以以不同的配置安装Harbor:
- 仅Harbor, 没有Notary、Clair或Chart Repository Service (默认)
- Harbor含Notary
- Harbor含Clair
- Harbor含Chart Repository Service
- Harbor含Notary、Clair、Chart Repository Service中两个多全部3个
仅Harbor
1 | sudo ./install.sh |
Harbor含Notary
1 | sudo ./install.sh --with-notary |
Harbor含Clair
1 | sudo ./install.sh --with-clair |
Harbor含Chart Repository Service
1 | sudo ./install.sh --with-chartmuseum |
Harbor含Notary、Clair、Chart Repository Service中两个多全部3个
1 | sudo ./install.sh --with-notary --with-clair --with-chartmuseum |
通过HTTP连接到Harbor
1 | vim /etc/docker/daemon.json |
三 简单部署示例
机器配置
资源 | 值 |
---|---|
系统 | Centos7 |
CPU | 2核 |
内存 | 8G |
硬盘 | 90G |
Docker版本:19.03.13
Docker-compose版本:1.18.0
生成证书
使用域名 reg.qicoder.com
1 | mkdir -p /data/harbor-ssl |
生成的证书如下:
1 | ls -l |
下载harbor并修改配置
1 | # 下载并解压 |
修改harbor.yml配置如下:
1 | # ...其他配置不变 |
启动
1 | ./install.sh |
页面访问
用admin和默认密码 Harbor12345(默认密码在harbor.yml可修改) 登录
客户端证书
1 | # 将服务器证书和密钥复制到Harbor主机上的certficates文件夹中 |