
3.1 在单机环境下安装Harbor
在单机环境下,可以通过在线、离线或者源码安装方式安装Harbor。安装Harbor之前,安装机器需要满足如表3-1所示的硬件需求,以及如表3-2所示的软件需求。
表3-1

表3-2

3.1.1 基本配置
Harbor从1.8.0版本起,配置文件的格式从harbor.cfg变更为harbor.yml,这样做既可以提供更好的可读性和可扩展性;还可以通过prepare容器实现对安装配置的集中管理,减少对用户基础环境的依赖。值得注意的是,如果基于harbor.cfg(1.8.0之前的版本)安装Harbor,则安装环境需要预先安装Python v2.7。
本章基于Harbor 2.0.0讲解配置的细节。获取Harbor在线、离线安装包后将其解压,从中可以看到harbor.yml.tmpl文件,该文件是Harbor的配置文件模版。用户可以把harbor.yml.tmpl文件复制并命名为harbor.yml,将harbor.yml文件作为安装Harbor的配置文件。注意:每次修改harbor.yml文件的配置后,都需要运行prepare脚本并重启Harbor才可生效。
下面逐一介绍harbor.yml.tmpl文件的具体内容。
1.hostname
配置Harbor服务的网络访问地址。可将其配置成当前安装环境的IP地址和主机域名(FQDN)。这里不建议将其配置成127.0.0.1或者localhost,这样会使Harbor除本机外无法被外界访问。
2.HTTP 和 HTTPS
配置Harbor的网络访问协议,默认值为HTTPS。注意:如果选择安装Notary组件,则这里必须将Harbor的网络访问协议配置为HTTPS。配置HTTPS时需要提供SSL/TLS证书,并将证书和私钥文件的本机地址配置给certificate和private_key选项。
◎ port:网络端口号,默认是443。
◎ certificate:SSL/TLS证书文件的本机文件位置。
◎ private_key:私钥文件的本机文件位置。
如果需要将网络协议更改为HTTP,则需要注释掉配置文件中的HTTPS配置部分:

3.internal_tls
配置Harbor各个模块之间的TLS通信。在默认状态下,Harbor的各个组件(harbor-core、harbor-jobservice、proxy、harbor-portal、registry、registryctl、trivy_adapter、clair_adapter、chartmuseum)之间的通信都基于HTTP。但为了安全,在生产环境下推荐开启TLS通信。如果需要开启TLS通信,则需要去掉配置文件的注释部分:

其中:enabled表明TLS的开启状态;dir存放各组件证书和私钥的本机文件路径。
Harbor提供证书自动生成工具,命令如下:

其中:“-p”指定本机存放证书的目录,建议与dir的配置保持一致,如果不一致,则需要手动复制生成的文件到dir配置目录下。
在默认情况下,证书自动生成工具会生成CA,文件被基于此CA生成组件的证书。
如果需要使用自持的CA生成组件证书,则可将自持 CA 和私钥分别命名为harbor_internal_ca.crt和harbor_internal_ca.key并放在dir配置项对应的目录下,然后执行如上命令生成其他组件的证书和私钥。
如果不使用证书自动生成工具,则需要提供自持CA和私钥,分别命名为harbor_internal_ca.crt和harbor_internal_ca.key并放在dir配置项对应的目录下。同时在该目录下提供各个组件的证书和私钥。注意:所有组件证书都必须由自持CA签发,证书的文件命名和通用名(Common Name,CN)属性需要按照表3-3指定。
表3-3

4.harbor_admin_password
配置Harbor的管理员密码的默认值为Harbor12345,建议在安装前更改此项。此项用于管理员登录Harbor,仅在第一次启动前有效,启动后更改将不起作用。如果后续需要更改管理员密码,则可以登录Harbor界面进行更改。
5.database
配置Harbor内置的数据库。
◎ password:数据库管理员密码,默认值为root123,用于管理员登录数据库。建议在安装前修改此项。
◎ max_idle_conns:Harbor组件连接数据库的最大空闲连接数。
◎ max_open_conns:Harbor组件连接数据库的最大连接数,将其设置为小于0的整数时,连接数无限制。
6.data_volume
配置 Harbor 的本地数据存储,其默认地址为“/data”目录,该目录存放的数据包括Artifact文件、数据库数据及缓存数据等。
7.storage_service
配置外置存储。Harbor默认使用本地存储,如果需要使用外部存储,则需要去掉注释部分。
◎ ca_bundle:指明CA的存放路径。Harbor将该路径下的文件注入除log、database、redis和notary外的所有容器的trust store中。
◎ 外置存储类型:包括filesystem、azure、gcs、s3、swift和oss。默认值为filesystem。在配置外部存储时需要指明存储类型,如表3-4所示,只能任选其中一种。若指明多种存储类型,Harbor就会启动错误。
表3-4

续表

使用Google云存储的示例如下:

其中的属性如表3-5所示。
表3-5

8.clair
配置镜像扫描工具Clair。Updaters_interval指Clair抓取CVE数据的时间间隔,单位为小时。将其设置为0时关闭数据抓取。为保证漏洞数据及时更新,不建议关闭数据抓取。
9.trivy
配置镜像扫描工具Trivy。
◎ ignore_unfixed:是否忽略无修复的漏洞,默认值为 false。开启此项后,在漏洞的扫描结果中只列出有修复的漏洞。
◎ skip_update:是否关闭Trivy从GitHub数据源下载数据的功能,默认值为false。如果开启此项,则需要手动下载 Trivy 数据,将其路径映射到 Trivy 容器内的“/home/scanner/.cache/trivy/db/trivy.db”路径下。在使用Harbor集成CI/CD的情况下,为避免GitHub的下载限制,可开启此项。
◎ insecure:是否忽略Registry证书验证,默认值为false。当配置为true时,Trivy从Core组件拉取镜像时不会校验Core组件的证书。
◎ github_token:Trivy从数据源GitHub下载数据的访问Token。GitHub对于匿名下载的限制是每小时60个请求,通常情况下可能无法满足生产使用,通过配置该项,GitHub的下载限制可以提升至每小时5000个请求。建议在生成环境下配置该项。关于如何生成 GitHub Token,请参考官方文档中的“help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line”目录。
10.jobservice
配置功能组件jobservice。Max_job_workers为最大job的执行单元数,默认值为10。
11.notification
配置事件通知。Webhook_job_max_retry为事件通知失败的最大重试次数,默认值为10。
12.chart
配置ChartMuseum组件。Absolute_url指使用ChartMuseum组件时,客户端获取到的Chart的index.yaml中包含的URL是否为绝对路径。在不配置该项时,ChartMuseum组件会返回相对路径。
13.log
配置日志。
◎ level:日志级别,支持Debug、Error、Warning 和Info,默认值为Info。
◎ local:本地日志配置。
☉ rotate_count:日志文件在删除前的最大轮换次数。将其设置为0时将不启用轮换。默认值为50。
☉ rotate_size:日志文件轮转值。在日志文件大小超过设置的值后,日志文件将被轮转。默认值为200 MB。
☉ location:日志文件的本地存储路径。
◎ external_endpoint:外置syslog日志配置,如要开启,则需要将注释去掉。
☉ protocol:外置日志的传输协议,支持UDP和TCP,默认值为TCP。
☉ host:外置日志服务的网络地址。
☉ port:外置日志服务的网络端口。
14.external_database
外置数据库配置。如要开启,则需要将注释去掉。另外,用户必须手动创建 Harbor所需的空数据库,详细信息可参考 Harbor 高可用方案。注意:Harbor 2.0.0 仅支持PostgreSQL数据库。
◎ harbor:Harbor的数据库配置。
☉ host:数据库的网络地址。
☉ port:数据库的端口号。
☉ db_name:数据库的名称。
☉ username:数据库管理员的用户名。
☉ password:数据库管理员的密码。
☉ ssl_mode:安全模式。
☉ max_idle_conns:Harbor组件连接数据库的最大空闲连接数。
☉ max_open_conns:Harbor组件连接数据库的最大连接数,将其设置为小于0的整数时,连接数无限制。
◎ clair:Clair的数据库配置。
☉ host:数据库的网络地址。
☉ port:数据库的端口号。
☉ db_name:数据库的名称。
☉ username:数据库管理员的用户名。
☉ password:数据库管理员的密码。
☉ ssl_mode:安全模式。
◎ notarysigner:Notary Signer的数据库配置。
☉ host:数据库的网络地址。
☉ port:数据库的端口号。
☉ db_name:数据库的名称。
☉ username:数据库管理员的用户名。
☉ password:数据库管理员的密码。
☉ ssl_mode:安全模式。
◎ notaryserver:Notary Server的数据库配置。
☉ host:数据库的网络地址。
☉ port:数据库的端口号。
☉ db_name:数据库的名称。
☉ username:数据库管理员的用户名。
☉ password:数据库管理员的密码。
☉ ssl_mode:安全模式。
15.external_redis
外置Redis配置。如要开启,则需要将注释去掉。注意:数据索引值不可以被设置为0,因为其被Harbor Core组件独占使用。
◎ host:外置Redis的网络地址。
◎ port:外置Redis的网络端口。
◎ password:外置Redis的访问密码。
◎ registry_db_index:Registry组件的数据索引值。
◎ jobservice_db_index:JobService组件的数据索引值。
◎ chartmuseum_db_index:ChartMuseum组件的数据索引值。
◎ clair_db_index:Clair组件的数据索引值。
◎ trivy_db_index:Trivy组件的数据索引值。
◎ idle_timeout_seconds:空闲连接超时时间,设置为0时,空闲连接将不会被关闭。
16.uaa
配置UAA。Ca_file为UAA服务器自签名证书的路径。
17.proxy
配置反向代理。Harbor在内网环境下运行时,可使用反向代理访问外网。注意:代理配置不影响Harbor各个组件之间的通信。
◎ proxy:网络代理服务地址。其中,http_proxy 指 HTTP 的网络代理服务地址;https_proxy指HTTPS的网络代理服务地址。
◎ no_proxy:不使用网络代理服务的域名。Harbor各组件的服务名会自动添加no_proxy规则,所以用户只需配置自己的服务,例如通常情况下,用户需要从同处于内部网络环境下的另一个Registry节点中同步Artifact时,无须使用代理服务。这里将这个Registry节点的网络地址配置到该项即可。
◎ components:默认情况下,代理服务配置应用在组件Core、JobService、Clair、Trivy 的网络中访问。如果想关闭任何一个组件的代理服务,则将该组件从列表中移除。注意:如需为Artifact复制功能应用网络代理,那么core和jobservcie必须出现在列表中。
3.1.2 离线安装
首先,获取Harbor的离线安装包,可从项目的官方发布网站GitHub获取,获取目录为github.com/goharbor/harbor/releases,如图3-1所示。注意:RC或者Pre-release版本并不适用于生产环境,仅适用于测试环境。

图3-1
在Harbor的发布页面上提供了离线和在线安装文件。
◎ harbor-offline-installer-v2.0.0.tgz:为离线安装包,包含了Harbor预置的所有镜像文件、配置文件等。
◎ harbor-offline-installer-v2.0.0.tgz.asc:为离线安装包的签名文件,用户通过它可以验证离线安装包是否被官方签名和验证。
◎ md5sum:包含上述两个文件的md5值,用户通过它可以校验下载文件的正确性。
然后,选择对应的版本,下载并解压离线安装包:

解压离线安装包,可以看到在harbor文件夹下有如下文件。
◎ LICENSE:许可文件。
◎ common.sh:安装脚本的工具脚本。
◎ harbor.v2.0.0.tar.gz:各个功能组件的镜像文件压缩包。
◎ harbor.yml.tmpl:配置文件的模板,在配置好后需要将此文件的后缀名“tmpl”去掉或者复制生成新的文件harbor.yml。
◎ install.sh:安装脚本。
◎ prepare:准备脚本,将harbor.yml配置文件的内容注入各组件的配置文件中。
最后,按照3.1.1节完成配置后,通过执行安装脚本install.sh启动安装。安装脚本的流程大致如下。
(1)环境检查,主要检查本机的Docker及docker-compose版本。
(2)载入离线镜像文件。
(3)准备配置文件并生成 docker-compose.yml文件。
(4)通过docker-compose启动Harbor的各组件容器。
安装脚本支持Harbor组件选装,除核心组件外,其他功能组件均可通过参数指定。以下参数出现时安装相应组件,否则不安装。
◎ --with-notary:选择安装镜像签名组件Notary,其中包括Notary Server和Notary Signer如果指定安装Notary,则必须配置Harbor的网络协议为HTTPS。
◎ --with-clair:选择安装镜像扫描组件Clair。
◎ --with-trivy:选择安装镜像扫描组件Trivy。
◎ --with-chartmuseum:选择安装Chart文件管理组件ChartMuseum。
安装完成后,可通过浏览器登录管理控制台或者 Docker 客户端推送镜像,验证安装是否成功。具体可参考3.5节。
3.1.3 在线安装
不同于离线安装,在线安装需要安装机器有访问Docker Hub的能力。因为机器在安装过程中需要通过Docker获取Harbor在Docker Hub中预置好的镜像文件。
首先,获取Harbor在线安装包,可从项目的官方发布网站GitHub获取,获取目录为“github.com/goharbor/harbor/releases”,如图3-2所示。注意RC或者Pre-release版本并不适用于生产环境,仅适用于测试环境。

图3-2
在Harbor的发布页面上提供了在线安装文件。
◎ harbor-online-installer-v2.0.0.tgz:为在线安装包,包含预置的安装脚本、配置文件模板和许可文件。
◎ harbor-online-installer-v2.0.0.tgz.asc:为在线安装包的签名文件,用户通过它可以验证在线安装包是否被官方签名和验证。
◎ md5sum:包含了上述两个文件的md5值,用户通过它可以校验下载文件的正确性。
然后,选择对应的版本,下载并解压在线安装包:

解压在线安装包,可以看到如下文件。
◎ LICENSE:许可文件。
◎ common.sh:安装脚本的工具脚本。
◎ harbor.yml.tmpl:配置文件的模板文件。
◎ install.sh:安装脚本。
◎ prepare:准备脚本,将配置文件的内容注入各组件的配置文件中。
执行安装命令,参考3.1.2节。
3.1.4 源码安装
Harbor可以通过编译Go源码并构建容器,最终完成Harbor的安装。
本节基于Harbor 2.0.0源码来详细讲解安装过程。在开始之前,请确保在本地安装了Docker和docker-compose,并有网络访问能力。
Harbor的源码编译和安装流程大致如下。
(1)获取源码。
(2)修改源码配置文件。
(3)执行“make”命令。
为什么要编译源码呢?理解“make”命令编译并构建Harbor的流程有助于开发者基于现有代码进行二次开发和调试。在大多数情况下,用户不需要修改Harbor源码,使用在线、离线或者Helm方式安装即可。如果有自己特殊的业务逻辑,并且此业务逻辑没有被社区接受和进入某个Release,或者需要订制自己的管理页面,就需要修改源码。而为了修改生效,需要编译Harbor源码。
首先,下载源码。执行如下命令获取Harbor 2.0.0的源码:

然后,参考3.1.2节修改源码配置文件。
接着,执行“make”命令。在源码的根目录下执行“make”命令。“make”命令包括如下子命令,本节基于“install”子命令讲解如何基于Go源码安装Harbor。
◎ compile:通过Go镜像编译Harbor的各个功能组件源码,生成二进制文件。
◎ build:基于二进制文件构建各组件镜像。各功能组件的Dockerfile在“./make/photon”文件夹下。关于各个组件的构建流程,可参考该文件的内容。
◎ prepare:基于配置文件harbor.yml生成各个组件的配置信息。
◎ install:源码安装命令,包括Compile、Build和Prepare,通过docker-compose启动所有功能组件。
◎ package_online:生成Harbor在线安装包。
◎ package_offline:生成Harbor离线安装包。
“make install”命令的大致执行流程:首先,通过Go镜像编译源码的二进制文件,包括组件core、registryctl及jobservice等;然后,基于二进制文件和各组件的基础镜像构建组件镜像;接着,解析配置文件,基于模板生成docker-compose文件;最后,通过docker-compose启动Harbor。
“make install”命令中的参数如下。
◎ CLAIRFLAG:默认值为false。设置为true时,表明在源码编译过程中会编译并构建Clair镜像,这样在启动Harbor后镜像扫描功能开启。
◎ TRIVYFLAG:默认值为false。设置为true时,表明在源码编译过程中会编译并构建Trivy镜像,这样在启动Harbor后镜像扫描功能开启。
◎ NOTARYFLAG:默认值为false。设置为true时,表明在源码编译过程中会编译并构建Notary Signer和Notary Server镜像,这样在启动Harbor后镜像签名功能开启。这里harbor.yaml的网络协议需要被设置为HTTPS。
◎ CHARTFLAG:默认值为false。设置为true时,表明在源码编译过程中会编译并构建ChartMuseum镜像,这样在启动Harbor后Chart仓库功能开启。
◎ NPM_REGISTRY:默认值为NPM官方的Registry地址。如果构建Harbor portal镜像时无法访问NPM官方的Registry或者用户有特定需求,则可通过该参数设定。
◎ VERSIONTAG:默认值为dev,指定构建各个组件镜像的Tag名称。
◎ PKGVERSIONTAG:默认值为dev,指定在线或者离线安装包命名中的版本信息。
“make build”命令会依据Harbor组件的镜像文件来构建组件镜像。这里以core组件为例,其镜像文件在“./make/photon/core”目录下,其余镜像的构建流程大体相似,构建过程如下。
(1)构建基于Harbor的基础镜像。为了保证基于同样的代码可以编译出同样的镜像,这里使用了固定的基础镜像。其原因是,如果在每一次编译过程中都构建基础镜像,则无法保证基础镜像的一致性,也就无法保证最终镜像的一致性。构建基础镜像的方法可参考同目录下的Dockerfile.base文件:

(2)复制编译好的二进制文件和相应的脚本,并设置权限和entrypoint:

注意:在Harbor组件中,除了log组件使用root用户,其余组件均为非root用户。
(3)成功执行“make install”命令后,Harbor安装成功。执行“docker ps”命令检查各个组件的状态,如图3-3所示。

图3-3